Upload
kristy
View
24
Download
2
Embed Size (px)
DESCRIPTION
Kombinatorikai algoritmusok. Szlávi Péter [email protected] 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 ) - PowerPoint PPT Presentation
Citation preview
Szlávi Pé[email protected]
ELTE IK Média- és Oktatásinformatika Tanszék
2010
Kombinatorikai algoritmusok
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 2/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)
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 elemeszabályos sorrend szerinti i. elemadottra következő„véletlen” elem
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 3/50
Bevezetés Tipikus témái (folytatás):
részhalmazok képzéseösszes felsorolásapartíciónálás céljából – halmazfelbontásadott tulajdonságú (pl. adott számosságú)
megadása …
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 4/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ó
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 5/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!
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 6/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,N1,2,3,…,N,N-1…N,1,2,3,…,N-1…
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 7/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): Konstans P1:TPerm(1,…,11,…,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ú
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 8/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!/NN 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 iN é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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 9/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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 10/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 i1
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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 11/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 jN és nem LehetségesE(i,j) j:+1 Ciklus vége JóElem.van:=jN 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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 12/50
Az összes … – Permutáció Egy rekurzív megvalósítás:
Algoritmus:
Konstans [globális] P0:TPerm(0,…,00,…,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égeEljá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…
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 13/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 és még sok hasonló sok hasonló egyenletrenegyenletren
dszerdszer
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 14/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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 15/50
Az összes … – Kombináció Ismétlés nélküli kombinációk –
A cél: N elem összes KK-elemű kombinációjának előállítása
1 2 3 … K-1 K
1,2,3,…,K-1,K1,2,3,…,K-
1,K+1+1……1,2,3,…,K-1,NN
1 2 3 … K-1 K
1,2,3,…,KK,K+1+1
1,2,3,…,K,K+2+2
…1,2,3,…K,NN
…
1 2 … K
N-K+1N-K+1,N-N-K+2,+2,…,N…,N
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 16/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…
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 17/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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 18/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 i1
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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 19/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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 20/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”…
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 21/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ánmegszervezi 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!
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 22/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!)
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 23/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
vagyTHalmaz = 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
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 24/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 KN
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 25/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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 26/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
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 27/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
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 28/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
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 29/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].
N
1ii!is
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 30/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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 31/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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 32/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!
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 33/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ó: 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:+1Ciklus végeIndex2Perm:=x
Függvény vége.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 34/50
Az i. … – Variáció Ismétléses variáció –
A cél: az i. ismétléses variáció előállítása
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 35/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
K
1j
1jj NV
K
1j
1jN1
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 36/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:=xFüggvény vége.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 37/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
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 38/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=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
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 39/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)
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 40/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
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 41/50
Véletlen … – Permutáció
Feltétel: Xi≠Xj i≠j, vagyis ha
HalmazFelsorolás(X)=Igaz.
Feltétel: Xi≠Xj 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=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.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
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 42/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!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 NNNN-es mátrix.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 43/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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 44/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égeEljá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
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 45/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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 46/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)
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 47/50
Véletlen – Kombináció Megoldás:
K0. algoritmus:Db:=0Ciklus i=1-től N-ig Ha Vé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 össz elemszám (Db) eltérheteltérhet az elvárt K-tólK-tól. M(Db)=K, D2(Db)=N*K/N*(1-K/N)=K-K2/N
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 48/50
Véletlen – Kombináció Megoldás (folytatás):
K1. algoritmus:Db:=0Ciklus 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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 49/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-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.
Kombinatorikus algoritmusok
2010 Szlávi: Kombinatorikus algoritmusok 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):