Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaBrigitta Dobosné Megváltozta több, mint 10 éve
1
Szlávi Péter szlavip@elte.hu ELTE IK Média- és Oktatásinformatika Tanszék szlavip@elte.hu 2010 Kombinatorikai algoritmusok
2
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok2/50 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)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
3
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok3/50 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 …
4
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok4/50 Amiről szó lesz – Tartalom 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ó
5
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok5/50 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!
6
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok6/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 …
7
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok7/50 Az összes … – Permutáció Egy naiv megvalósítás: N elem összes N-elemű ismétléses variációja + szűrés ? Konstans MaxN:Egész(?) Típus TPerm=Tömb(1..MaxN:Egész) A „főszereplő” típus defi- niálása. Eljárás ÖsszesPermutáció(Konstans N:Egész): 1,…,1 Konstans P1:TPerm(1,…,1) [MaxN darab 1-es] Változó permSorsz,i:Egész P:TPerm [aktuális permutáció] A lényegi eljárás szignatúrája és lokális adatainak dekla- rálása. P1 az első permutáció. permSorsz:=0 P:=P1; i:=N A ciklus előkészítése. Ciklus amíg i>0 Ha PermutációE(P) akkor permSorsz:+1; PermFeldolg(P,N,permSorsz) Elágazás vége A sorozat szűrése és a –per- mutáció esetén– feldolgozása. Ciklus amíg i>0 és P(i)=N P(i):=1; i:-1 Ciklus vége Ha i>0 akkor P(i):+1; i:=N A következő variáció elő- állítása Ciklus vége Eljárás vége. A ciklusból kiléptünk, amikor az NN…N-t is túlhaladtuk. Ez kézenfekvő algoritmusú
8
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok8/50 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!/N N 0 Függvény PermutációE(Konstans P:TPerm):Logikai Változó i,j:Egész mégOK:Logikai A permutáció-ságot vizsgáló függvény szignatúrája és lokális adatainak deklarációja. i:=2; mégOK:=Igaz Ciklus amíg i N és mégOK Van-e olyan P(i:2..N), amely előtt már volt belőle? j:=1 Ciklus amíg j<i és P(j) P(i) j:+1 Ciklus vége mégOK:=j=i i:+1 Az i. valamelyik előzőnek a duplikátuma-e? Ciklus vége PermutációE:=mégOK Függvény vége.
9
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok9/50 Az összes … – Permutáció Egy backtrack alapú megvalósítás: A legfelsőbb szint: Eljárás ÖsszesPermutáció(Konstans N:Egész): Konstans X0:TPerm(0,…,0) [MaxN darab 0-ás] Típus TKeresett=Rekord(van:Logikai; melyik:Egész) Változó i:Egész X:TPerm [aktuális permutáció] ker:TKeresett permSorsz:Egész … A lényegi eljárás fejsora és lokális adatainak deklarációja. A permSorsz változó kódolásánál ügyelni kell arra, hogy viszonylag nagy egész számok fognak belekerülni.
10
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok10/50 Az összes … – Permutáció Egy backtrack alapú megvalósítás (folytatás) : A legfelsőbb szint (folytatás): … permSorsz:=0 i:=1; X:=X0 Ciklus amíg i 1 A megszokott backtrack ciklus inicializáló része. A permSorsz a „kiválogatásos” variációhoz tartozik. Ha i>N akkor permSorsz:+1 PermFeldolg(X,N,permSorsz) i:-1 Elágazás vége Ha összeállt egy helyes permutá- ció, akkor következhet a feldolgozása (pl. a megjegyzése, most a PermFeldolg eljárás hívása). ker:=JóElem(i) Ha ker.van akkor X(i):=ker.melyik; i:+1 különben X(i):=0; i:-1 Elágazás vége Továbblépünk a következő permu- táció felé, vagy visszalépünk a backtrack logikája szerint. Ciklus vége Eljárás vége.
11
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok11/50 Az összes … – Permutáció Egy backtrack alapú megvalósítás (folytatás) : A JóElem fv: A LehetségesE fv: Függvény JóElem(Konstans i:Egész):TKeresett Változó j:Egész j:=X(i)+1 Ciklus amíg j N és nem LehetségesE(i,j) j:+1 Ciklus vége JóElem.van:=j N Ha JóElem.van akkor JóElem.melyik:=j Függvény vége. Függvény LehetségesE(Konstans i,j:Egész):Logikai Változó k:Egész k:=1 Ciklus amíg k<i és X(k) j k:+1 Ciklus vége LehetségesE:=k=i Függvény vége.
12
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok12/50 Az összes … – Permutáció Egy rekurzív megvalósítás: Algoritmus: 0,…,0 Konstans [globális] P0:TPerm(0,…,0) [MaxN darab 0-ás] Változó [globális] permSorsz:Egész Globálisan deklarált permSorsz a végeredmény szempontjából, a P0 az „indulás” szempontjából fontos. Eljárás ÖsszesPermutáció(Konstans aktP:TPerm, i,n:Egész): Változó j:Egész P:TPerm(aktP) [kezdőértékadás] Ha i>n akkor permSorsz:+1; PermFeldolg(P,n,permSorsz) Az aktP n-ed rendű permutációjából kiindulva, generáljuk a következő i. komponensét. Nincs n-nél nagyobb komponens, elkészült a permutáció, feldolgozható. különben P(i):=i; ÖsszesPermutációk(P,i+1,n) Ciklus j=i-1-től 1-ig -1-esével Csere(P,j,j+1); ÖsszesPermutáció(P,i+1,n) Ciklus vége Elágazás vége Eljárás vége. Még nincs kész. Generáljuk az összes olyant, amelyek i. komponense i, majd cserékkel permutáljuk a kezdő- szeleteket, és a hozzájuk tartozó összes permutációt generáljuk. … permSorsz:=0; ÖsszesPermutáció(P0,1,N) … Az elindulás…
13
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok13/50 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
14
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok14/50 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.
15
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok15/50 Az összes … – Kombináció K 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-1,K +1 1,2,3,…,K-1,K+1 … N 1,2,3,…,K-1,N 1 2 3 … K-1 K K+1 1,2,3,…,K,K+1 +2 1,2,3,…,K,K+2 … N 1,2,3,…K,N … 1 2 … K N-K+1N-+2,…,N N-K+1,N-K+2,…,N
16
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok16/50 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…
17
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok17/50 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: Eljárás ÖsszesKombináció(Konstans N,K:Egész): Konstans X0:TKomb(0,…,0) Típus TKeresett=Rekord(van:Logikai; melyik:Egész) Változó i:Egész X:TKomb [aktuális kombináció] ker:TKeresett kombSorsz:Egész A lényegi eljárás fejsora és lokális adatainak deklarációja. A kombSorsz változó kódolásánál ügyelni kell arra, hogy viszonylag nagy egész számok fognak belekerülni.
18
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok18/50 Az összes … – Kombináció A backtrack alapú megvalósítás (folytatás) : A legfelsőbb szint (folytatás) : kombSorsz:=0 i:=1; X:=X0 Ciklus amíg i 1 A megszokott backtrack ciklus inicia- lizáló része. A kombSorsz a „kiváloga- tásos” változathoz tartozik. Ha i>K akkor kombSorsz:+1 KombFeldolg(X,N,K,kombSorsz) i:-1 Elágazás vége Ha összeállt egy helyes kombináció, akkor következhet a feldolgozása (pl. a megjegyzése, most a KombFeldolg eljárás hívása). ker:=JóElem(i) Ha ker.van akkor X(i):=ker.melyik; i:+1 különben X(i):=0; i:-1 Elágazás vége Tovább lépünk a következő kombi- náció felé, a backtrack logikája szerint. Ciklus vége Eljárás vége.
19
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok19/50 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” Függvény LehetségesE(Konstans i,j:Egész):Logikai LehetségesE:=X(i-1)<j Függvény vége.
20
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok20/50 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”…
21
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok21/50 Az összes … – Részhalmaz Az algoritmus: Eljárás ÖsszesRészhalmaz(Konstans N:Egész): … Változó K:Egész rhk:TRészHalmazok kombSorsz:Egész [ részhalmaz-sorszám] … A lényegi eljárás fejsora és lokális adatainak deklarációja. Az rhk-ban gyüjtjük a részhalma- zokat. Eljárás ÖsszesKombináció(Konstans N,K:Egész): … Eljárás vége. Ez a lokális eljárás előállítja N elem összes K-elemű részhalmazát. A kombSorsz-ot nem ő inicializálja. rhk(1):=X0 [üres halmaz] kombSorsz:=1 Ciklus K=1-től N-1-ig ÖsszesKombináció(N,K) Ciklus vége rhk(kombSorsz):=(1,2,…,N,0,…) [„teli” halmaz] Eljárás vége. Első az üres részhalmaz. A kombSorsz inicializálása után megszervezi minden K-ra a K-elemű részhalmazok generálását. Végül a „teli” részhalmaz. A „0,…” je-lentése: MaxN-ig kiegészítendő. 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!
22
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok22/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!)
23
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok23/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..2 N –1] h:THalmaz (h Div 2 i-1 ) Mod 2=1 az i. elem a h-nak eleme
24
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok24/50 Az összes … – Részhalmaz 2. megoldásötlet (folytatás) : Algoritmus: Felsorolni 0..2 N -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ő: = 2 N
25
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok25/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.
26
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok26/50 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
27
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok27/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
28
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok28/50 Az i. … – Permutáció Hogyan sorszámozzunk? Elvárás a permutációindexszel szemben: (PI1)PermIndex: Perm [1..N!], aholPerm [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
29
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok29/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ölteni ezért faktoriális alapú számrendszert kell alkalmazni: (Fakt2Dec1)Fakt2Dec(s N...s 2 s 1 ):=1+ (Fakt2Dec2)s i [0..i–1] i [1...N].
30
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok30/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). Változó [globális] permInd_Fakt:Szöveg Ez a változó fogja tartalmazni az éppen generált permutáció indexé- nek faktoriális számrendszerbeli alakját. Nem tüntettük föl a paramé- terlistában, hanem „orvul”, globá- lisan elérhető adatként deklaráltuk. Függvény PermIndex_MKR(Változó P:TPerm; Konstans N:Egész):Egész Változó i,j,mini:Egész pI:Egész A minimum kiválasztásos rendezés (MKR) végrehajtása közben képez- zük a P permutáció pI indexét. „Balkézről” megadjuk a faktoriális számrendszerbeli alakját is.
31
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok31/50 Az i. … – Permutáció PermutációIndex függvény (folytatás) : permInd_Fakt:='' pI:=0 Ciklus i=1-től N-1-ig mini:=i Ciklus j=i+1-től N-ig Ha P(j)<P(mini) akkor mini:=j Ciklus vége Csere(P(i),P(mini)) pI:=pI*(N-i+1)+(mini-i) permInd_Fakt:=permInd_Fakt+ Karakter(mini-i+48) Ciklus vége A minimum kiválasztásos rendezés szokásos algoritmusa a permutáció- indexet előállító betétekkel megspé- kelve. Figyeljük meg, miként veszi figyelem- be az adott helyi értéknél alkalmazan- dó számrendszer-alapot! (Horner- elrendezés) permInd_Fakt:=permInd_Fakt+'1' PermIndex_MKR:=pI+1 Függvény vége. A végső értékadás gondoskodik arról, hogy a permutációindex 1-gyel, nem 0-val kezdődjék; és a faktoriális szám- rendszer definíciójának (és a céljaink- nak) megfelelően 1-re végződjék.
32
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok32/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!
33
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok33/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):TPerm Változó i,j,k,t:Egész x:TPerm x:=P1; i:=pI-1 [sorszám-korrekció: 1 0] k:=2 Ciklus 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:+1 Ciklus vége Index2Perm:=x Függvény vége.
34
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok34/50 Az i. … – Variáció Ismétléses variáció – A cél: az i. ismétléses variáció előállítása
35
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok35/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 v K.. v 2 v 1 =11..1 N -től a w K..w 2 w 1 =NN..N N -ig. (IVI1)IsmVarIndex: N * N N [1..N K ]; (IVI2)IsmVarIndex bijekció az N-elemű K-hosszúságú sorozatok halmaza és a [1..N K ] között; (IVI3)IsmVarIndex((V N,V N-1,…,V 2,V 1 ),N,K):= –v, ahol v:= –1=(N K –1)/(N–1)–1
36
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok36/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):TIsmVar Vá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 N Ciklus vége Index2IsmVar:=x Függvény vége.
37
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok37/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
38
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok38/50 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 =X j ) – annak a valószínűsége, hogy az X’ k X j 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
39
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok39/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)
40
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok40/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) : Permutálás („Keverés”)Rendezés Ciklus i=1-től N-1-ig j:=VéletlenSzám(i..N) Csere(X(i),X(j)) Ciklus vége Ciklus i=1-től N-1-ig j:=MinIndex(i..N) Csere(X(i),X(j)) Ciklus vége
41
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok41/50 Véletlen … – Permutáció Feltétel: X i ≠X j i≠j, vagyis ha HalmazFelsorolás(X)=Igaz. 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 =X k )=1/N i,k [1..N]. P1-3. Állítás: Az algoritmus azonos eséllyel állítja elő az X 1..N elemek tetszőleges permutációját. Permutálás („Keverés”)Rendezés Ciklus i=1-től N-1-ig j:=VéletlenSzám(i..N) Csere(X(i),X(j)) Ciklus vége Ciklus i=1-től N-1-ig j:=MinIndex(i..N) Csere(X(i),X(j)) Ciklus vége
42
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok42/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. N! Probléma: a számláló tömb N! méretű (hatékonyság) N N 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.
43
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok43/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ől 2*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.
44
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok44/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. Permutálás („Keverés”) Ciklus i=1-től N-1-ig j:=VéletlenSzám(i..N) Csere(X(i),X(j)) Ciklus vége
45
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok45/50 Véletlen … – Permutáció Gyakorlat (folytatás): Egy futási eredmény: A generált permutációkban 1. helyen az 1 (X 1 ) 1452-ször, … a 7. helyen ugyanő 1377-szer fordult elő, … a 7 (X 7 ) 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.
46
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok46/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)
47
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok47/50 Véletlen – Kombináció Megoldás: K0. algoritmus: Db:=0 Ciklus i=1-től N-ig Ha VéletlenSzám<K/N akkor Db:+1; Y(Db):=X(i) Ciklus vége össz elemszám eltérhetK-tól 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, D 2 (Db)=N*K/N*(1-K/N)=K-K 2 /N
48
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok48/50 Véletlen – Kombináció Megoldás (folytatás) : K1. algoritmus: Db:=0 Ciklus i=1-től N-ig Ha 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.
49
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok49/50 Véletlen – Kombináció Megoldás (folytatás) : K2. algoritmus: Ciklus i=1-től K-ig Y(i):=X(i) Ciklus vége Ciklus i=K+1-tól N-ig Ha 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.
50
Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok50/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):
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.