500 likes | 644 Views
Kombinatorikai algoritmusok. Szlávi Péter szlavip@elte.hu ELTE IK Média- és Oktatásinformatika Tanszék 2010. Bevezetés. A kombinatorika: „ egy véges halmaz elemeinek valamilyen szabály alapján törté-nő csoportosításával, kiválasztásával, sorrendbe rakásával foglalkozik ” ( Wikipedia )
E N D
Kombinatorikai algoritmusok Szlávi Péterszlavip@elte.huELTE IK Média- és Oktatásinformatika Tanszék 2010
Bevezetés • A kombinatorika: „egy véges halmaz elemeinek valamilyen szabály alapján törté-nő csoportosításával, kiválasztásával, sorrendbe rakásával foglalkozik” (Wikipedia) • Tipikus témái (SzlaviPedia): • halmazok számosságának a meghatározása • halmazok (~sorozatok) felsorolása – összes eleme • halmazok (~sorozatok) valamely elemének generálása – egy eleme • szabályos sorrend szerinti i. elem • adottra következő • „véletlen” elem Szlávi: Kombinatorikus algoritmusok
Bevezetés Tipikus témái (folytatás): részhalmazok képzése összes felsorolása partíciónálás céljából – halmazfelbontás adott tulajdonságú (pl. adott számosságú) megadása … 2010 Szlávi: Kombinatorikus algoritmusok 3/50
Az összes … előállítása Ismétlés nélküli permutációk Ismétlés nélküli kombinációk Részhalmazok Az i. … előállítása Ismétlés nélküli permutáció Ismétléses variáció Véletlen algoritmusok Véletlen permutáció – „keverés” Véletlen kombináció Amiről szó lesz – Tartalom Szlávi: Kombinatorikus algoritmusok
Megjegyzések Az összes… :általában csak megoldási keretül szolgál valamely konkrét feladathoz; célja: a feladatnak megfelelő szempontból való feldolgozáshoz „szolgáltatja” az elemeket. (L. később: xxxFeldolg eljárást!) Az alaphalmaz = 1..N közötti természetes számok! Nyilvánvaló: nem jelent tényleges megszorítást! 2010 Szlávi: Kombinatorikus algoritmusok 5/50
Az összes … – Permutáció • Ismétlés nélküli permutációk – A cél: N elem összes permutációjának előállítása 1 2 3 … N-1 N 1,2,3,…,N-1,N 1,2,3,…,N,N-1 … N,1,2,3,…,N-1 … Szlávi: Kombinatorikus algoritmusok
Az összes … – Permutáció Ez kézenfekvő algoritmusú • Egy naiv megvalósítás:N elem összes N-elemű ismétléses variációja + szűrés Szlávi: Kombinatorikus algoritmusok
Az összes … – Permutáció • Egy naiv megvalósítás (folytatás):N elem összes N-elemű ismétléses variációja + szűrés • Hatékonyság: az „érdekes” elemek számaránya: N!/NN 0 Szlávi: Kombinatorikus algoritmusok
Az összes … – Permutáció • Egy backtrack alapú megvalósítás: • A legfelsőbb szint: Szlávi: Kombinatorikus algoritmusok
Az összes … – Permutáció • Egy backtrack alapú megvalósítás (folytatás): • A legfelsőbb szint (folytatás): Szlávi: Kombinatorikus algoritmusok
Az összes … – Permutáció • Egy backtrack alapú megvalósítás (folytatás): • A JóElemfv: • A LehetségesEfv: Szlávi: Kombinatorikus algoritmusok
Az összes … – Permutáció • Egy rekurzív megvalósítás: • Algoritmus: Szlávi: Kombinatorikus algoritmusok
Az összes … – Permutáció • Egy feladat: • Jól ismert fejtörő, amelyben egy aritmetikai művelet kapcsol egybe szavakat. A feladat az, hogy a szavak egyes betűinek feletessünk meg egy számjegyet úgy, hogy a művelet helyes eredményt szolgáltasson a szavakon. Pl. SEND + MORE = MONEY. • Megoldás: A szavakban előforduló jelekhez (SENDMORY) keressük 0..9 számjegyek egyértelmű hozzárendelését. • 1. megoldási ötlet („algebrai hozzáállás”): D+E=Y, N+R=E, … M=1 D+E=10+Y, N+R+1=E, … M=1 … és még sok hasonló egyenletrendszer Szlávi: Kombinatorikus algoritmusok
Az összes … – Permutáció • 2. megoldási ötlet: • Az összes permutáció algoritmusára építünk. • A PermFeldolg eljárás ellenőrzi a permutáció –a feladat szem-pontjából való– helyességét, és gondoskodik az esetleges megol-dás gyűjtéséről vagy kiírásáról. • A megfelelőség: a (*) SEND + MORE – MONEY = 0 egyenletre • Ha • 'S' s értékű, akkor a (*)-ban s*1000-rel van jelen; • 'E' e értékű, akkor e*(100+1-10)=e*91-gyel; • 'N' n értékű, akkor n*(10-100)=n*(-90)-nel; • 'D' d értékű, akkor d*(1)-gyel; • 'M' m értékű, akkor m*(1000-10000)=m*(-9000)-rel; • 'O' o értékű, akkor o*(100-1000)=o*(-900)-zal; • 'R' r értékű, akkor r*(10)=r*(10)-zel; • 'Y' y értékű, akkor y*(-1)-gyel van jelen. Szlávi: Kombinatorikus algoritmusok
Az összes … – Kombináció • Ismétlés nélküli kombinációk – A cél: N elem összes K-elemű kombinációjának előállítása 1 2 3 … K-1 K 1,2,3,…,K,K+1 1,2,3,…,K,K+2 … 1,2,3,…K,N … 1 2 … K N-K+1,N-K+2,…,N 1 2 3 … K-1 K 1,2,3,…,K-1,K 1,2,3,…,K-1,K+1 … … 1,2,3,…,K-1,N Szlávi: Kombinatorikus algoritmusok
Az összes … – Kombináció • A backtrack alapú megvalósítás: • Egy(etlen) probléma: a csak az elemek sorrendjében különböző K-asakat egyszer szabad figyelembe venni • Megoldás (backtrack-es alapon): • csak rendezett sorozatokat generálunk • legfelsőbb szinten lényegi változás alig van: • az azonosítókat értelemszerűen átírjuk; • az eljárás fejsora bővül a K paraméterrel; • a TKomb típus most is MaxN elemű, de csak az első K elemére lesz szükség; • a KombFeldolg eljárásnak átadjuk a K paramétert is… Szlávi: Kombinatorikus algoritmusok
Az összes … – Kombináció • A backtrack alapú megvalósítás (folytatás): • „érdemi” módosítás a K-ad osztályúság felismerése: • A legfelsőbb szint: Szlávi: Kombinatorikus algoritmusok
Az összes … – Kombináció • A backtrack alapú megvalósítás (folytatás): • A legfelsőbb szint (folytatás): Szlávi: Kombinatorikus algoritmusok
Az összes … – Kombináció • A backtrack alapú megvalósítás (folytatás): • A JóElem fv:változatlan, bár optimalizálható a szigorúan növekedés feltétel figyelembe vételével • A LehetségesE fv:döntse el, hogy választható-e (azaz egyedi-e és növekvő-e) az i. elemként kijelölt j érték” Szlávi: Kombinatorikus algoritmusok
Az összes … – Részhalmaz • A cél: N elem összes részhalmazainak az előállítása • 1. megoldásötlet: Kapcsolat: N-elemű halmaz K-elemű részhalmazai N elem K-ad osztályú kombinációk Algoritmus: előző kombinációkat előállító backtrack-es változat Ábrázolás: az első 0-ig tartó (kezdő) részsorozat (a 0 illegális érték!);pl. (0,…,0) ~ üres (rész)halmaz; (1,2,…,N,0,…) ~ a „teli”… Szlávi: Kombinatorikus algoritmusok
Az összes … – Részhalmaz Az algoritmus: • Probléma: a K-eleműek képzése során minden K-nál kisebb elemszámú részsorozat újrakészül – hatékonyság! 2010 Szlávi: Kombinatorikus algoritmusok 21/50
Az összes … – Részhalmaz A probléma „lágy” megoldása: az N-elemű „részsorozat” előállítása közben, „bal-kézről” létrejövő kezdő részsorozatokat menetköz-ben gyártjuk;ügyelni kell arra, hogy mikor „kiáltunk ki” egy kezdő részsorozatot részhalmaznak: csak „előrefelé” hala-dáskor (visszalépéskor nem lehet!) 2010 Szlávi: Kombinatorikus algoritmusok 22/50
Az összes … – Részhalmaz 2. megoldásötlet: Ábrázolás: THalmaz=Tömb(1..N:Logikai) h:THalmaz h(i)=Igaz az i. elem a h-nak eleme vagy THalmaz = Egész Igaz=1 / Hamis=0 N jegyű bináris szám[0..2N–1]h:THalmaz (h Div 2i-1) Mod 2=1 az i. elem a h-nak eleme 2010 Szlávi: Kombinatorikus algoritmusok 23/50
Az összes … – Részhalmaz 2. megoldásötlet (folytatás): Algoritmus: Felsorolni 0..2N-1 számot, azaz N elem összes ismétléses variációját. Furcsaság (?): 1. megoldás: N elem összes ismétlés nélküli kombináció-ja(ra építettük) 2. megoldás: 2 elem összes ismétléses variációja Emlékeztető: = 2N 2010 Szlávi: Kombinatorikus algoritmusok 24/50
Az i. … előállítása • Feladatspecialitás: olyankor lehet az i. előállítására szükség, amikor a programban az i „hektikusan” változik. Máskülönben az összes előállítása a „sza-bályosan” következőket szolgáltatná a feladathoz. Szlávi: Kombinatorikus algoritmusok
Az i. … előállítása Egy naiv megoldás:Módosítsuk az összes …-t előállító algoritmust úgy, hogy az i.-hez érve álljon le; s adja vissza az utolsót (tárolni nem is muszáj) Probléma: hatékonyság – minduntalan 1.-től újrakezdi 2010 Szlávi: Kombinatorikus algoritmusok 26/50
Az i. … – Permutáció Ismétlés nélküli permutációk – A cél: az i. permutáció előállítása 2010 Szlávi: Kombinatorikus algoritmusok 27/50
Az i. … – Permutáció Hogyan sorszámozzunk? Elvárás a permutációindexszel szemben: (PI1) PermIndex: Perm[1..N!], ahol Perm[1..N]N, pPerm: HalmazFelsorolás(p) (PI2) PermIndex bijekció Kiszámítási ötlet: a permutációhoz rendeljünk olyan értéket, amely kifejezi a „távolságát” a rendezettől…pl. egy rendezés során az egyes elemeinek a helyre ugrásakor „megtett távolságokkal” fejezzük ki. Egyértelműség: PQPerm különbözőek a cserékben szereplő indexpárok 2010 Szlávi: Kombinatorikus algoritmusok 28/50
Az i. … – Permutáció Sorszámozáshoz: a rendezés i. lépésekor végrehajtott csere-beli „távolság” a sorszám i. „tagja” mivel a rendezés során egyre kisebbek (-: vagy nagyobbak :-) az ugrások (N–1,…,1,0), és hézagmentesen kell az 1..N! intervallumot kitölteniezért faktoriális alapú számrendszert kell alkalmazni: (Fakt2Dec1) Fakt2Dec(sN...s2s1):=1+ (Fakt2Dec2) si[0..i–1] i[1...N]. 2010 Szlávi: Kombinatorikus algoritmusok 29/50
Az i. … – Permutáció PermutációIndex függvény: A minimum kiválasztásos rendezésből indulunk ki. A keresett index mellett (okulásul) előállítjuk a faktoriális alapú számrendszerbeli alakját is (ez persze „élvezhető” eredményt N<10-re ad). 2010 Szlávi: Kombinatorikus algoritmusok 30/50
Az i. … – Permutáció PermutációIndex függvény (folytatás): 2010 Szlávi: Kombinatorikus algoritmusok 31/50
Az i. … – Permutáció PermutációIndex függvény (folytatás): Egy példafutás N=4-re: Vegye észre: bijektivitást és a nem rendezéstartóságot! 2010 Szlávi: Kombinatorikus algoritmusok 32/50
Az i. … – Permutáció Az i. permutáció függvény:Az előbb alkalmazott számjegysorozattá alakítást kell most csupán „visszafelé” végrehajtanunk. Függvény Index2Perm(Konstans pI:Egész):TPermVáltozó i,j,k,t:Egész x:TPerm x:=P1; i:=pI-1 [sorszám-korrekció: 10]k:=2Ciklus j=N-1-től 1-ig -1-esével t:=i Mod k; i:=i Div k; Csere(x(j),x(j+t)) k:+1CiklusvégeIndex2Perm:=x Függvényvége. 2010 Szlávi: Kombinatorikus algoritmusok 33/50
Az i. … – Variáció Ismétléses variáció – A cél: az i. ismétléses variáció előállítása 2010 Szlávi: Kombinatorikus algoritmusok 34/50
Az i. … – Variáció Sorszámozás:egyszerű, hiszen tekinthetjük a sorozatokat egy N-alapú számrendszerben felírt K-jegyű számnak: a vK..v2v1=11..1N-től a wK..w2w1=NN..NN-ig. (IVI1) IsmVarIndex: N*NN[1..NK]; (IVI2) IsmVarIndex bijekció az N-elemű K-hosszúságú sorozatok halmaza és a [1..NK]között; (IVI3) IsmVarIndex((VN,VN-1,…,V2,V1),N,K):= –v, ahol v:= –1=(NK–1)/(N–1)–1 2010 Szlávi: Kombinatorikus algoritmusok 35/50
Az i. … – Variáció Az i. variáció függvény: Az előbbi inverzét kell megvalósítanunk. Konstans MaxN:Egész(?)Típus TIsmVar=Tömb(1..MaxN:Egész) Függvény Index2IsmVar(Konstans i,N,K:Egész):TIsmVarVáltozó ii,j:Egész x:TIsmVar ii:=i-1 [korrekció az 1-gyel kezdődő sorszámozás miatt]Ciklus j=K-tól 1-ig -1-esével x(j):=(ii Mod N)+1; ii:=ii Div NCiklusvége Index2IsmVar:=xFüggvényvége. 2010 Szlávi: Kombinatorikus algoritmusok 36/50
Véletlen algoritmusok • … olyan algoritmusok, amelyben • fő szerepet kap a véletlenszám-generátor, és • valamilyen tulajdonságú halmaz/sorozat generálása a cél Szlávi: Kombinatorikus algoritmusok
Véletlen algoritmusok Jelölések, megállapodások: X – sorozat; X’– az X sorozat algoritmus végrehajtás utáni értéke P(X’k=Xj) – annak a valószínűsége, hogy az X’k Xj lesz i,jN, [0,1]R VéletlenSzám(i..j) – (egyenletes) véletlen egész szám [i,j] VéletlenSzám – (egyenletes) véletlen valós szám [0,1)R Egyenletesség: F1. P(VéletlenSzám(i..j)=k)=P(VéletlenSzám(i..j)=m)k,m[i..j] F2. P(VéletlenSzám<)= függvények függvények 2010 Szlávi: Kombinatorikus algoritmusok 38/50
Véletlen … – Permutáció Véletlen (ismétlés nélküli) permutáció – „keverés” A cél: X(1..N) elemek egy véletlen permutációjának előállítása Feltételezés: HalmazFelsorolás(X) teljesülése;Pl. X(i)=i (i=1..N) 2010 Szlávi: Kombinatorikus algoritmusok 39/50
Véletlen … – Permutáció Megoldás: Egy meglepő gondolat:Mivel a rendezési algoritmusok egy rendezetlenből rendezettet permutálnak, ezért építsük valamely rendező algoritmusra az „inverz-műveletet” (a keverést) is. P1. algoritmus (minimum kiválasztásos rendezés alapján): 2010 Szlávi: Kombinatorikus algoritmusok 40/50
Véletlen … – Permutáció Az algoritmus elemzése: P1-1. Állítás:Az algoritmus a bemeneti sorozat egy permutációját állítja elő. P1-2. Állítás:Az X’ minden elemében az X bármely eleme azonos eséllyel lesz az algoritmus végrehajtása után: P(X’i=Xk)=1/N i,k[1..N]. P1-3. Állítás:Az algoritmus azonos eséllyel állítja elő az X1..N elemek tetszőleges permutációját. Feltétel: Xi≠Xj i≠j, vagyis ha HalmazFelsorolás(X)=Igaz. Feltétel: Xi≠Xj i≠j, vagyis ha HalmazFelsorolás(X)=Igaz. 2010 Szlávi: Kombinatorikus algoritmusok 41/50
Véletlen … – Permutáció Gyakorlat: Írjunk programot, amely az előbbi eljárással előállít szá-mos permutációt, s eközben számolja, hogy az éppen generált permutáció hányadszorra jött ki. Azt várjuk, hogy minden permutációra ez kb. azonos érték lesz. Probléma: a számláló tömb N! méretű (hatékonyság) Megoldása: a P1-2. állításra hivatkozással elegendő azt számlálni, hogy az egyes elemek gyanánt hányszor fordult elő egy-egy érték, azaz elég egy NN-es mátrix. 2010 Szlávi: Kombinatorikus algoritmusok 42/50
Véletlen … – Permutáció Gyakorlat (folytatás): A megoldás legfelsőbb szintje: Eljárás PermutacióVezérlés: Változó i:Egész PermInic Ciklus i=1-től2*Fakt(N)-ig VéletlenPermutáció PermÉrtékelés Ciklus vége GyakoriságMegjelenítés('Permutációk') Eljárás vége. 2010 Szlávi: Kombinatorikus algoritmusok 43/50
Véletlen … – Permutáció Gyakorlat (folytatás): A VéletlenPermutáció eljárás: Eljárás VéletlenPermutáció: Változó i,j:Egész Ciklus i=1-től N-1-ig j:=Random(N-i+1)+i Csere(p(i),p(j)) Ciklus vége Eljárás vége. Eljárás Csere(Változó x,y:Egész): … Eljárás vége. A PermÉrtékelés eljárás: Eljárás PermÉrtékelés: Változó i:Egész Ciklus i=1-től N-ig gy(p(i),i):+1 Ciklus vége Eljárás vége. 2010 Szlávi: Kombinatorikus algoritmusok 44/50
Véletlen … – Permutáció Gyakorlat (folytatás): Egy futási eredmény: A generált permutációkban 1. helyen az 1 (X1) 1452-ször, … a 7. helyen ugyanő 1377-szer fordult elő, … a 7 (X7) az 1. helyen 1405-ször, … a 7. helyen ugyanő 1440-szer. Ellenőrizhető, hogy mind a sor-, mind az oszlopösszegek 10080 (=2*N!), aminek az az oka, hogy 2*N! darab véletlen permutációt generáltunk a programmal. 2010 Szlávi: Kombinatorikus algoritmusok 45/50
Véletlen … – Kombináció Véletlen (ismétlés nélküli) kombináció –A cél: X(1..N) elemek egy véletlen, K-ad osztályú kombinációjának előállítása Feltételezés: HalmazFelsorolás(X) teljesülése;Pl. X(i)=i (i=1..N) 2010 Szlávi: Kombinatorikus algoritmusok 46/50
Véletlen – Kombináció Megoldás: K0. algoritmus: Db:=0Ciklus i=1-től N-igHaVéletlenSzám<K/N akkor Db:+1; Y(Db):=X(i)Ciklus vége Probléma: az algoritmusban K/N eséllyel kerül be egy elem, de az össz elemszám (Db) eltérhet az elvárt K-tól. M(Db)=K, D2(Db)=N*K/N*(1-K/N)=K-K2/N 2010 Szlávi: Kombinatorikus algoritmusok 47/50
Véletlen – Kombináció Megoldás (folytatás): K1. algoritmus: Db:=0Ciklus i=1-től N-igHa VéletlenSzám<(K-Db)/(N+1-i) akkor Db:+1; Y(Db):=X(i)Ciklus vége Megjegyzés: Az algoritmus kiküszöböli az előbbi hibáját. Azt az elvet alkalmazza, hogy figyeli a még beveendő elemek számát, és garantálja, hogy éppen annyi kerüljön be. 2010 Szlávi: Kombinatorikus algoritmusok 48/50
Véletlen – Kombináció Megoldás (folytatás): K2. algoritmus: Ciklus i=1-től K-ig Y(i):=X(i)Ciklus végeCiklus i=K+1-tól N-igHa VéletlenSzám<K/i akkor j:=VéletlenSzám(1..K); Y(j):=X(i)Ciklus vége A K2 algoritmus elemzése: K2-1. Állítás:A K2. algoritmus az X(1..N) elemek egy K-ad osztályú kombinációját eredményezi. K2-2. Állítás: A K2. algoritmus végrehajtása utáni Y-ra igaz, hogy Y bármely eleme helyén X bármely eleme azonos eséllyel (K/N) előfordulhat. K2-3. Állítás: A K2. algoritmus azonos eséllyel állítja elő az {1..N} számok tetszőleges K-ad osztályú kombinációját. 2010 Szlávi: Kombinatorikus algoritmusok 49/50
Véletlen – Kombináció Gyakorlat: Írjunk programot (vagy folytassuk az előbbit), amely a K2. eljárással előállít számos kombinációt, s eközben számolja, hogy az éppen generált hányadszorra jött ki. Azt várjuk, hogy minden kombinációra ez kb. azonos érték lesz. Egy futási eredmény (N=7, K=4): 2010 Szlávi: Kombinatorikus algoritmusok 50/50