Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Dinamikus programozás, mohó algoritmus.  Sok feladat szól arról, hogy döntések sorozatát kell meghozni egy végső optimális megoldás megtalálásához. 

Hasonló előadás


Az előadások a következő témára: "Dinamikus programozás, mohó algoritmus.  Sok feladat szól arról, hogy döntések sorozatát kell meghozni egy végső optimális megoldás megtalálásához. "— Előadás másolata:

1 Dinamikus programozás, mohó algoritmus

2  Sok feladat szól arról, hogy döntések sorozatát kell meghozni egy végső optimális megoldás megtalálásához.  Egyszerű megoldás lenne, ha minden lehetőséget megnéznénk, és csak kiválasztanánk az optimális megoldást közülük (legkisebb, legnagyobb stb.).  Ez sajnos egyszerű, de haszontalan. De miért is?

3  Vegyük a híres „Hátizsák probléma” elnevezésű feladatot, és nézzük meg, miért nem működik a minden lehetőség végigpróbálása.  A feladat: Adott n darab tárgy, mindegyikre ismert egy f[i] fontossági érték, illetve egy s[i] súly. Adott még a hátizsák súlykorlátja: S. A tárgyaknak egy olyan halmazát kell kiválasztani, melynek összsúlya nem haladja meg a súlykorlátot, és fontossági értéke maximális.

4  Első megközelítésre próbáljuk meg az összes lehetőséget felvázolni, ezeknél megnézni, hogy megfelelő-e (nem haladja-e túl a súlykorlátot), és ha megfelelő, akkor összehasonlítani az addigi maximummal.  Az összes esetet könnyű felvázolni: minden tárgy vagy benne van a zsákban, vagy nincs. Tehát 2 n féle lehetőséget különböztetünk meg.

5  Vegyünk egy olyan számítógépet, mely művelet/s sebességgel dolgozik. Láttuk, hogy n darab tárgy esetén 2 n -nel arányos műveletre lenne szükség. Nézzük meg, hogyan alakul ennek függvényében a futási idő.  Ha n=10, akkor 1.02*10 -7 s nagyságrendű lesz a futási idő, ez még rendben van  Ha n=100, akkor viszont 4*10 12 ÉV lenne a futási idő.

6  Alapgondolat: részproblémákra bontás oly módon, hogy a részproblémáknak közös részproblémáik legyenek  Az egyes részproblémák megoldásait táblázatos formában tároljuk, így mikor azok eredménye ismételten kelleni fog, nem kell újból kiszámolni.

7  Meg kellene találni a megfelelő részfeladatokra bontást.  Jelen feladatnál biztosan megállapítható: ◦ S súlykorlátra nem tudjuk megmondani, a választ, de ha a súlykorlát 0 lenne, akkor a válasz triviális ◦ Az is igaz, hogy ha n darab tárgy helyett 0 darab lenne, akkor is triviális a válaszunk

8  Csináljuk tehát egy táblázatot. ◦ Vízszintes irányban 0-tól S-ig engedjük léptetni a súlykorlátot. ◦ Függőleges tengelyen 0-tól n-ig a felhasználható tárgyak számát léptetjük. Mivel ez nem egyértelmű (5 tárgyat veszek ki a 10-ből, de melyik 5-öt?), ezért kell egy megállapodás, hogy egyértelmű legyen. Jelen esetben mondjuk azt, hogy ha k darab tárgyat veszek, az azt jelenti, hogy a felsorolt tárgyak közül az első k darab lesz az.

9 012…S-1S … n-1 n Az i. sor j. oszlopa megadja azt a részproblémát, mely az első i darab tárgyat engedi felhasználni, és j súlykorlátot ad meg (i és j 0-tól kezdi a számozást).

10 012…S-1S 0000… …… n-10 n0 Írjuk be a triviális eseteket…

11  Jelentse v(i,j) az i. sor j. oszlopát.  Ha i=0 vagy j=0, akkor ahogy a táblázatból is látszik, a válasz egyértelmű: 0.  Hogyan lehet kiszámolni egy tetszőleges v(i,j)-t?

12  Egy v(i,j) esetében két lehetőség állhat fent: ◦ Az i. sorszámú tárgyat nem tesszük bele a zsákba. Ekkor v(i,j) éppen megegyezik v(i-1,j)-vel, hiszen a j. tárgyat nem használjuk fel. ◦ Másik eset, hogy felhasználjuk a j. tárgyat. Ekkor v(i,j) = f(i) + v(i-1,j-s(i)).  Magyarázat: ha felhasználjuk az i. tárgyat, akkor az összértékbe bele fog számítani az i. tárgy értéke, és még mellette megnézzük, hogy a maradék kapacitással (j a jelenlegi teljes kapacitás, ebből kivonjuk a betett i. tárgy súlyát), és a maradék tárggyal (az első i darab tárgyból i.-et felhasználtuk, így maradt az első i-1 darab) mi az optimum, s ezeket összeadjuk. Természetesen a két lehetőség közül az optimálist választjuk, tehát a nagyobbat.

13  Általánosan felírhatjuk tehát, hogy: ◦ v(i,j) = max ( v(i-1,j) ; f(i)+v(i-1,j-s(i)) Itt persze figyelni kell rá, hogy ha s(i) nagyobb, mint j akkor a tömbön kívülre tudunk címezni. Ezt kerülendő programozáskor figyelni kell rá, hogy ilyen esetben v(i,j) = v(i-1,j), hiszen a j. tárgy biztosan nem kerülhet be a hátizsákba j súlykorlát mellett!  A feladat megoldását pedig nem fogja más adni, mint v(n,S) kiszámolása (a táblázat jobb alsó cellája.

14  Miért hatékonyabb ez a megoldás?  Ahogy azt már megnéztük a „minden eset” féle megoldás 2 n nagyságrenden dolgozik. Mi a helyzet az új megoldással?  Ha belegondolunk nem csinálunk mást, mint egy n*S méretű táblázat minden celláját kitöltjük ( igazából 0-tól kezdjük, vagyis (n+1)*(S+1), de minket csak a nagyságrendje érdekel, így számolhatunk nyugodtan n*S-sel )

15  Kérdés: egy cella kiszámolása hány lépés?  Egy cella kiszámolása nem más, mint két másik cella értékének beolvasása, és a nagyobb kiválasztása.  Ami látszik, hogy egy cella kitöltése nem függ az input méretétől (v(5,6) kiszámolása ugyanaz akkor is ha n=10 meg ha n=1000…)

16  Mivel egy cella kitöltése nem függ az input méretétől, így azt mondjuk: konstans lépésben végez.  Konstans lépésszámot algoritmushatékonyság vizsgálatánál elhanyagolhatunk (nem a pontos lépésszám érdekel, hanem az, hogy az input függvényében mennyire képes „elszállni” a lépésszám nagyságrendje).

17  Mivel a konstans lépésszámot elhanyagoltuk, látszik, hogy DP-vel a lépésszám n*S nagyságrendű lesz.  Egy ilyen szorzatot felülről becsülhetünk a nagyobbik tagjának négyzetével.  Az pedig egyértelmű, hogy az exponenciális függvényhez képest a négyzetes függvény sokkal lassabb ütemben növekszik.

18  Kemence Egy fazekasműhelyben N tárgy vár kiégetésre. A kemencébe a beérkezés sorrendjében tehetők be, egyszerre legfeljebb K darab. Minden tárgynak ismerjük a minimális égetési idejét, amennyit legalább a kemencében kell töltenie. Adjuk meg a minimális időt, ami alatt minden tárgy kiégethető!

19  Az első menet kialakításánál legfeljebb K darab lehetőségünk van ◦ Az első tárgy egyedül kerül kemencébe ◦ Az első kettő kerül a kemencébe ◦ … ◦ Az első K darab kerül a kemencébe  A feladat megoldása nem más, mint ezen lehetőségek közül az optimális, ami valahogy így számolható ha az első j darab kerül a kemencébe (j<=K) ◦ Optimum(teljes) = MaxÉgetésiIdő(1..j) + Optimum(maradék)

20  A részprobléma az Optimum(r) meghatározása, mely megadja az optimális (minimális) égetési időt, ha az r, (r+1), (r+2), …, N sorszámú tárgyakat kell figyelembe venni.  Egy részprobléma maximum K darab részprobléma eredményének függvényében egy minimum vizsgálattal el tudja dönteni, hogy mi az adott részmegoldás.  Ha az Optimum(r) eredményeket eltároljuk, akkor mindet csak egyszer kell kiszámolni, így egy N elemből álló tömböt kell kitölteni.

21  A feladatot tovább lehet nehezíteni: ◦ Tárgyaknak van súlyuk, és a kemencének súlykorlátja van  Ekkor Optimum(r) meghatározásánál nem a tárgyak számára teszünk korlátot, hanem az összsúlyra ◦ Van maximum égetési idő is (aminél több ideig nem lehet a kemencében)  Ekkor a vizsgált lehetőségeket tovább korlátozza, hogy addig lehet újabb tárgyat belevenni, amíg igaz lesz, hogy egyik tárgy maximum égetési ideje sem kisebb, mint a legnagyobb minimális égetési idő ◦ Van határidő (ameddig mindenképp késznek kell lennie)  Ekkor a lehetőségeket tovább korlátozza, hogy addig lehet újabb tárgyat belevenni a menetbe, amíg igaz lesz, hogy a legnagyobb minimális égetési idő nem nagyobb, mint a legkisebb határidő

22  Pénzváltás Adott P1, P2, …, Pn pénzjegyek. Kifizethető- e az S összeg ezen pénzjegyekkel úgy, hogy mindegyik pénzjegyből tetszőleges számú áll rendelkezésre?  Gondolkozzunk hasonlóan, mint ahogyan a kemencénél kellett!

23  Megoldás: ◦ Lehet(S) nem más, mint: Lehet(S-P1) VAGY Lehet(S-P2) VAGY … Lehet(S-Pn) ◦ Tehát S akkor és csak akkor fizethető ki P1…Pn-nel, ha legalább egyik Px-re (Px eleme P1..Pn) igaz lesz, hogy az S-Px összeg kifizethető. ◦ A dinamikus programozás szabálya szerint minden részproblémát csak egyszer számolunk ki, így a Lehet(x) értékeket egy tömbben tárolni fogjuk az alábbiak szerint  -2 ha nincs még kiszámolva, hogy lehet-e  -1 ha nem lehet kifizetni  0 ha van ilyen pénzjegy  1 ha nincs ilyen pénzjegy, de kifizethető

24  És ha meg kell adni, hogy melyik pénzjegyből hányat kell felhasználni?

25  Ekkor a Lehet(X) úgy néz ki, hogy: ◦ -2 ha még nincs kiszámolva ◦ -1 ha már ki van számolva ◦ 0 ha van ilyen pénzjegy ◦ Px ha kifizethető, és X-Px is kifizethető (több ilyen esetén mindegy)

26  És ha meg kell adni, hogy melyik pénzjegyből hányat kell felhasználni?  A Kifizet(S) pedig úgy néz ki, hogy: ◦ Ha Lehet(S)=-1 -> nem fizethető ki ◦ Ha Lehet(S)=0 -> Pénz(S)++ ◦ Egyébként Pénz(Lehet(S))++ és Kifizet(S-Lehet(S)) ◦ Végén a Pénz tömb megmutatja, hogy melyik pénzből mennyit kell felhasználni

27  A Dinamikus Programozás úgy próbálta megközelíteni az optimalizáció problémáját, hogy több részproblémát is megoldott, majd azok eredményeit felhasználta.  Felismerte továbbá, hogy megfelelő felbontás esetén az egyes részproblémák többször előkerülnek, így ha tárolnánk az eredményüket, akkor sok felesleges számolási időt spórolnánk meg.

28  A Mohó Algoritmus másként közelíti meg a problémát.  Azt mondja ki, hogy bizonyos esetekben nem kell végig próbálni minden lehetőséget, hanem „mohó” módon kiválasztunk egyet, és ez biztosan az optimális megoldáshoz fog vezetni.

29  Első példaként nézzük meg a Fénykép típusú feladatot.  A feladat: ◦ Egy rendezvény résztvevőiről tudjuk, hogy Erk(i) időpontban érkeztek, és Tav(i) időpontban távoztak a rendezvényről. Egy fotós úgy szeretne csoportképeket készíteni, hogy minden résztvevő legalább egy képen rajta legyen, és a lehető legkevesebb képet kelljen készíteni.

30  A mohó elgondolás: a következő fotó elkészítésével várjunk minél tovább. Amíg nem kell mindenáron fotózni, addig ne fotózzunk.  Mikor kell már mindenáron fotózni? ◦ Akkor, ha el akar menni olyan ember, aki még nem volt fotózva.

31  Megoldás: ◦ Tároljuk el az összes olyan intervallumot, mely még nem szerepelt fotón. ◦ Keressük meg azt az intervallumot melynek távozási ideje a legkisebb, és készítsünk fotót ebben az időpontban. ◦ Ezután töröljük az összes olyan intervallumot, mely jelen volt a fotózásnál, és ha maradt még intervallum, arra ismételjük meg a lépéseket (a keresést, és a fotózást).

32  Nézzük csak át még egyszer a lépéseket…  A lépések: ◦ Rendezzük sorba az intervallumokat Tav(i) alapján. (ehhez kell egy hatékony rendező algoritmus) ◦ A sor első elemét vegyük ki, annak Tav(i) időpontjában készítsünk fotót. ◦ Mivel itt készült fotó, töröljük azokat, akik a fotó időpontja előtt érkeztek (még biztosan nem távoztak, mert a legkisebb távozási időpontot választottuk ki, így biztosan rajta vannak a fotón). ◦ HOPPÁ: Most akkor nézzük végig az összes intervallumot, avagy rendezzük át Erk(i) szerint, és utána vissza? Hát ez így elég lassú lenne…

33  Ötlet ne töröljük az intervallumokat, egyszerűen csak a legkisebb Tav(i) keresésénél ne vegyük figyelembe, aki már szerepel fotón.  A lépések: ◦ Tároljuk el az utolsó fotó készítésének időpontját (kezdetben 0 az értéke) ◦ Rendezzük sorba az intervallumokat Tav(i) alapján. (ehhez kell egy hatékony rendező algoritmus) ◦ A listából egyesével kivesszük az elemeket (tehát távozási idő szerint növekvő sorrendben). Ha az adott elem érkezési ideje nagyobb, mint az utolsó fotó időpontja, fotózunk (fotók számát növeljük 1-gyel, és az utolsó fotó időpontja az aktuális elem távozási ideje).

34  Most már két lépésből áll a megoldási menetünk: ◦ Rendezés ◦ Minden elemmel néhány (konstans számú) lépés elvégzése  A második lépés már elég gyors, hiszen lépéseinek nagyságrendje megegyezik az input méretével.  A rendezésre egy logaritmikus idejű algoritmust kell alkalmazni, és a feladat meg is van oldva.

35  Idei programozói OKTV döntőjének egyik feladata ( kategória)  4. feladat: Lefedés (30 pont)  Adott N pozitív egész szám. Keresünk legfeljebb K olyan zárt intervallumot, hogy minden megadott szám benne van valamelyik intervallumban és az intervallumok összhossza a lehető legkisebb. Minden lefedő [a,b] intervallumra teljesülni kell, hogy a

36  Mohó ötlet: Legyen egy teljes intervallum a legkisebb számtól a legnagyobbik. Ez lenne a válasz, ha K=1. Egyébként keressünk meg a legnagyobb intervallumot, mely nem tartalmaz egyetlen kijelölt számot sem -> így lesz 2 intervallumunk, ha K=2, akkor ez a válasz, ha K>2 ismételjük a folyamatot.

37  Először sorba rendezzük a számokat. Ezután csinálunk egy tömböt, mely intervallumokat tartalmaz. Ezt intervallumok hosszának megfelelően csökkenő sorrendbe rendezzük.  Külön tömbbe kiemeljük az első (K-1) darab intervallumot majd azokat kezdőpont alapján sorba rendezzük.


Letölteni ppt "Dinamikus programozás, mohó algoritmus.  Sok feladat szól arról, hogy döntések sorozatát kell meghozni egy végső optimális megoldás megtalálásához. "

Hasonló előadás


Google Hirdetések