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

Fejlett elemzési és tervezési módszerek

Hasonló előadás


Az előadások a következő témára: "Fejlett elemzési és tervezési módszerek"— Előadás másolata:

1 Fejlett elemzési és tervezési módszerek
Dinamikus programozás, mohó algoritmus

2 Bevezetés 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 Hátizsák probléma 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 Hátizsák probléma 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 2n féle lehetőséget különböztetünk meg.

5 Hátizsák probléma 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 2n-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*1012 ÉV lenne a futási idő.

6 Dinamikus programozás
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 Hátizsák probléma újra
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 Hátizsák probléma újra
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 Hátizsák probléma újra
1 2 S-1 S 3 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 Hátizsák probléma újra
Írjuk be a triviális eseteket… 1 2 S-1 S 3 n-1 n

11 Hátizsák probléma újra
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 Hátizsák probléma újra
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 Hátizsák probléma újra
Általánosan felírhatjuk tehát, hogy: v(i,j) = max ( v(i-1,j) ; f(i)+v(i-1,j-s(i)) 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. 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!

14 Hátizsák probléma újra
Miért hatékonyabb ez a megoldás? Ahogy azt már megnéztük a „minden eset” féle megoldás 2n 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 Hátizsák probléma újra
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 Hátizsák probléma újra
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 Hátizsák probléma újra
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 Egyéb feladatok DP-hez
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 Egyéb feladatok DP-hez
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 Egyéb feladatok DP-hez
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 Egyéb feladatok DP-hez
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 Egyéb feladatok DP-hez
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 Egyéb feladatok DP-hez
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 Egyéb feladatok DP-hez
És ha meg kell adni, hogy melyik pénzjegyből hányat kell felhasználni?

25 Egyéb feladatok DP-hez
És ha meg kell adni, hogy melyik pénzjegyből hányat kell felhasználni? 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 Egyéb feladatok DP-hez
É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 Mohó algoritmus 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 Mohó algoritmus 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 Mohó algoritmus 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 Mohó algoritmus 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 Mohó algoritmus 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 Mohó algoritmus 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 Mohó algoritmus Ö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 Mohó algoritmus 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 Mohó algoritmus 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<b. Az intervallum hossza a b-a érték. Készíts programot (lefed.pas , lefed.c, …), amely megadja a legkisebb összhosszú lefedő intervallumokat! Az lefed.be szöveges állomány első sorában két egész szám van, a lefedendő számok N száma (1≤N≤100000) és a lefedésre használható intervallumok számának K maximuma (1≤K≤N). A második sor pontosan N pozitív egész számot tartalmaz (egy-egy szóközzel elválasztva), a lefedendő számokat. A számok nem nagyobbak, mint Az lefed.ki szöveges állomány első sorába a lefedő intervallumok összhosszát kell írni. A további legfeljebb K sorba kell kiírni a lefedő intervallumokat, egy sorba egy intervallum kezdő és végpontját. Az intervallumokat kezdőpontjuk szerint növekvő sorrendben kell kiírni. Több megoldás esetén bármelyik megadható. Példa: lefed.be lefed.ki

36 Mohó algoritmus 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 Mohó algoritmus 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 "Fejlett elemzési és tervezési módszerek"

Hasonló előadás


Google Hirdetések