1 / 50

Szlávi Péter szlavip@elte.hu ELTE IK Média- és Oktatásinformatika Tanszék 2010

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 )

kristy
Download Presentation

Szlávi Péter szlavip@elte.hu ELTE IK Média- és Oktatásinformatika Tanszék 2010

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Kombinatorikai algoritmusok Szlávi Péterszlavip@elte.huELTE IK Média- és Oktatásinformatika Tanszék 2010

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. Az összes … – Permutáció • Egy backtrack alapú megvalósítás: • A legfelsőbb szint: Szlávi: Kombinatorikus algoritmusok

  10. Az összes … – Permutáció • Egy backtrack alapú megvalósítás (folytatás): • A legfelsőbb szint (folytatás): Szlávi: Kombinatorikus algoritmusok

  11. Az összes … – Permutáció • Egy backtrack alapú megvalósítás (folytatás): • A JóElemfv: • A LehetségesEfv: Szlávi: Kombinatorikus algoritmusok

  12. Az összes … – Permutáció • Egy rekurzív megvalósítás: • Algoritmus: Szlávi: Kombinatorikus algoritmusok

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. Az összes … – Kombináció • A backtrack alapú megvalósítás (folytatás): • A legfelsőbb szint (folytatás): Szlávi: Kombinatorikus algoritmusok

  19. 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

  20. 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

  21. 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

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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

  28. 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, pPerm: 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: PQPerm  különbözőek a cserékben szereplő indexpárok 2010 Szlávi: Kombinatorikus algoritmusok 28/50

  29. 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

  30. 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

  31. Az i. … – Permutáció PermutációIndex függvény (folytatás): 2010 Szlávi: Kombinatorikus algoritmusok 31/50

  32. 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

  33. 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ó: 10]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

  34. 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

  35. 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*NN[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

  36. 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

  37. 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

  38. 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,jN, [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

  39. 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

  40. 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

  41. 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

  42. 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 NN-es mátrix. 2010 Szlávi: Kombinatorikus algoritmusok 42/50

  43. 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

  44. 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

  45. 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

  46. 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

  47. 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

  48. 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

  49. 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

  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

More Related