PM-08 p. 1/17 Programozási módszertan Mohó algoritmusok Werner Ágnes Villamosmérnöki és Információs Rendszerek Tanszék e-mail: werner.agnes@virt.uni-pannon.hu
PM-08 p. 2/17 Bevezetés Dinamikus programozás bizonyos feladatok esetében túl sok esetet vizsgál Moho algoritmus: az adott lépésben optimálisnak látszó választást teszi lokális optimumot választ abban a reményben, hogy ez globális optimumhoz fog vezetni
PM-08 p. 3/17 A mohó stratégia elemei 1. A probléma optimális szerkezetének meghatározása. 2. Rekurzív megoldás kifejlesztése. 3. Annak bizonyítása, hogy minden rekurzív lépésben az egyik optimális választás a mohó választás. Tehát mindig biztonságos a mohó választás. 4. Annak igazolása, hogy a mohó választás olyan részproblémákat eredményez, amelyek közül legfeljebb az egyik nem üres. 5. A mohó stratégiát megvalósító rekurzív algoritmus kifejlesztése. 6. A rekurzív algoritmus átalakítása iteratív algoritmussá.
PM-08 p. 4/17 Jellemzők A mohó algoritmus mindig az adott lépésben optimálisnak látszó választást teszi. Csak egy részproblémát kell vizsgálni az optimális megoldáshoz. Minden részproblémát felülről-lefelé haladó módon meg tudunk oldani.
PM-08 p. 5/17 Esemény-kiválasztási probléma Tegyük fel, hogy adott események egy S = {a 1,a 2,...,a n } n elemű halmaza, amelyek egy közös erőforrást használnak, például egy előadótermet, amit egy időben csak egyik használhat. Minden a i eseményhez adott az s i kezdő időpont és az f i befejező időpont, ahol s i < f i. Ha az a i eseményt kiválasztjuk, akkor ez az esemény az [s i,f i ) félig nyitott idő intervallumot foglalja le. Az a i és a j események kompatibilisek, ha az [s i,f i ) és [s j,f j ) intervallumok nem fedik egymást (azaz a i és a j kompatibilisek, ha s i f j vagy s j f i ). Az esemény-kiválasztási probléma azt jelenti, hogy kiválasztandó kölcsönösen kompatibilis eseményeknek egy legnagyobb elemszámú halmaza.
PM-08 p. 6/17 Optimális részproblémák szerkezete 1 Első feladat: megtaláljuk az optimális szerkezetet, és felépítsük a feladat optimális megoldását a részproblémák optimális megoldásaiból. Definiáljuk a következő halmazokat: S i,j = {a k S f i s k < f k s j } (S i,j azokat az S-beli eseményeket tartalmazza, amelyek a i befejeződése után kezdődhetnek, és befejeződnek az a j kezdete előtt) A teljes probléma kezeléséhez egészítsük ki az eseményhalmazt az a 0 és a n+1 eseményekkel, ahol f 0 = 0, s n+1 = Ekkor S = S 0,n+1, és a részproblémák indexeinek tartománya: 0 i,j n + 1.
PM-08 p. 7/17 Optimális részproblémák szerkezete 2 Tegyük fel, hogy az események a befejezésük szerint monoton nem-csökkenő sorrendbe rendezettek. f 0 f 1 f 2... f n < f n+1 A részprobléma szerkezetének meghatározásához tekintsünk egy nem üres S i,j részproblémát, és tegyük fel, hogy valamely a k eleme a megoldásnak, azaz f i s k < f k s j. Az a k eseményt használva két részproblémát kaphatunk: S i,k, S k,j S i,j megoldását megkapjuk, ha az S i,k és S k,j megoldásának egyesítéséhez hozzávesszük az a k eseményt.
PM-08 p. 8/17 Optimális részproblémák szerkezete 3 Optimális részproblémák szerkezete: Tegyük fel, hogy A i,j egy optimális megoldása az S i,j részproblémának és a k A i,j. Ekkor az A i,k megoldás optimális megoldása kell legyen az S i,k részproblémának, és az A k,j megoldás optimális megoldása kell legyen az S k,j részproblémának. Ezután megmutatjuk, hogy az eredeti probléma optimális megoldása felépíthető a részproblémák optimális megoldásiból.
PM-08 p. 9/17 Rekurzív megoldás Legyen c[i,j] az S i,j részprobléma maximális elemszámú, kölcsönösen kompatibilis eseményeket tartalmazó részhalmaz elemszáma. c[i,j] = 0, ha S i,j =, és c[i,j] = 0, ha i > j Kapjuk a következő rekurzív összefüggést: c[i,j] = c[i,k] + c[k,j] + 1 k értékét nem ismerjük, összesen j i 1 lehetséges értéket vehet fel A teljes rekurzív alak: c[i, j] = { 0, ha S i,j = 0 max i<k<j; ak S i,j {c[i,k] + c[k,j] + 1}, ha S i,j 0
PM-08 p. 10/17 Átalakítás A dinamikus programozási megoldás átalakítása mohó megoldássá: Tétel: Tekintsünk egy S i,j nem üres részproblémát, és legyen a m a legkisebb befejezési idejű esemény S i,j -ben. Ekkor f m = min{f k a k S i,j } 1. a m eleme S i,j valamely maximális elemszámú, kölcsönösen kompatibilis eseményekből álló részhalmazának. 2. Az S i,m részprobléma üres, tehát a m választásával legfeljebb az S m,j nem üres. Dinamikus programozás 2 részprobléma vizsgálata Tétel segítségével csak 1 részprobléma kell az optimális megoldáshoz Minden részproblémát felülről-lefelé haladó módon oldunk meg.
PM-08 p. 11/17 Rekurzív mohó algoritmus 1 Bemenő paraméterei: az események kezdő és befejező időpontjait tartalmazó s és f tömb a megoldandó S i,n+1 részproblémát meghatározó i és n sorszám Az eljárás S i,n+1 egy maximális elemszámú, kölcsönösen kompatibilis eseményeket tartalmazó részhalmazát adja eredményül. Feltételezzük, hogy az n bemeneti esemény befejezési idő szerint monoton nem-csökkenő sorrendbe rendezett. A kiindulási probléma megoldását a REKURZIV ESEMENY KIV ALASZTO(s,f,0,n eljáráshívás adja.
PM-08 p. 12/17 Rekurzív mohó algoritmus 2 REKURZIV ESEMENY KIV ALASZTO(s,f,i,n) 1. m i + 1 2. while m n és s m < f i 3. do m m + 1 4. if m n 5. then return {a m } REKURZIV ESEMENY KIV ALASZTO(s,f,m,n) 6. else return
Program - eredmény PM-08 p. 13/17
PM-08 p. 14/17 Iteratív mohó algoritmus A MOHÓ-ESEMÉNY-KIVÁLASZTÓ eljárás egy iteratív változata a REKURZÍV-ESEMÉNY-KIVÁLASZTÓ eljárásnak. Ez feltételezi, hogy a bemeneti események befejezési idejük szerint monoton nem-csökkenő sorrendbe rendezettek. MOHO ESEMENY KIV ALASZTO(s, f) 1. n hossz[s] 2. A {a 1 } 3. i 1 4. for m 2 to n 5. do if s m f i 6. then A A {a m } 7. i m 8. returna f i mindig a legnagyobb befejezési idejű esemény az A halmazban. Tehát f i = max{f k a k A}. Futási idő: Θ(n)
PM-08 p. 15/17 Mohó stratégia vagy dinamikus programozás az optimális részproblémák tulajdonságot kihasználjuk mind a mohó, mind a dinamikus programozási stratégiáknál, előfordulhat, hogy dinamikus programozási megoldást próbálunk adni akkor, amikor mohó megoldás is célravezető lenne, és fordítva A 0 1 hátizsák feladat: Adott n darab tárgy, az i-edik tárgy használati értéke v i, a súlya pedig w i, ahol v i és w i egész számok. Kiválasztandó a tárgyaknak olyan részhalmaza, amelyek használati értékének összege a lehető legnagyobb, de a súlyuk összege nem nagyobb, mint a hátizsák W kapacitása, amely egész szám. Mely tárgyakat rakjuk a hátizsákba? A töredékes hátizsák feladat: a tárgyak töredéke is választható, nem kell 0 1 bináris választást tenni.
PM-08 p. 16/17 Feladatok elemzése 1 Mindkét hátizsák feladat teljesíti az optimális részproblémák tulajdonságot. A 0 1 feladat esetén tekintsünk egy olyan választást, amely a legnagyobb használati értéket adja, de a tárgyak összsúlya nem haladja meg a W értéket. Ha kivesszük a j-edik tárgyat a hátizsákból, akkor a bennmaradt tárgyak használati értéke a legnagyobb lesz azon feltétel mellett, hogy az összsúly nem nagyobb, mint W w j, és n 1 tárgyból választhatunk, kizárva az eredeti tárgyak közül a j-ediket. A töredékes hátizsák feladatnál ha egy optimális választásból kiveszünk a j tárgyból w mennyiséget, akkor a megmaradt választás optimális lesz arra az esetre, amikor legfeljebb W w összsúlyt érhetünk el és a j-edik tárgyból legfeljebb w j w mennyiséget választhatunk.
PM-08 p. 17/17 Feladatok elemzése 2 a 0 1 hátizsák feladat megoldható dinamikus programozással: ha egy tárgy beválasz- tásáról döntünk, akkor előbb össze kell hasonlítani annak a két részproblémának a megoldását, amely a tárgy beválasztásával, illetve kihagyásával adódik. Az így megfogalmazott probléma sok, egymást átfedő részproblémát eredményez a töredékes hátizsák feladat megoldható mohó stratégiával: megoldásához előbb számítsuk ki minden tárgyra a v i /w i használati érték per súly hányadost. A mohó stratégiát követve először a legnagyobb hányadosú tárgyból választunk amennyit csak lehet. Ha elfogyott, de még nem telt meg a hátizsák, akkor a következő legnagyobb hányadosú tárgyból választunk amennyit csak lehet, és így tovább, amíg a hátizsák meg nem telik.