Optimalizációs stratégiák 1. Nyers erő, Oszd meg és uralkodj, Feljegyzéses, Dinamikus, Mohó előadás http://nik.uni-obuda.hu/prog2 Szénási Sándor szenasi.sandor@nik.uni-obuda.hu Óbudai Egyetem,Neumann János Informatikai Kar
2 A megoldandó feladat 0-1 hátizsák probléma Bemenete W max : hátizsák mérete N: rendelkezésre álló tárgyak száma w i : i. tárgy súlya p i : i. tárgy értéke Kimenete P max : egy optimális pakolás értéke Pakolás: tárgyanként meghatározzuk, hogy bekerül-e a zsákba vagy sem (pl. N elemű logikai tömb) Pakolás összsúlya/összértéke: a pakolás által a hátizsákba választott tárgyak súlyának/értékének összege Érvényes pakolás: olyan pakolás, amelynek összsúlya nem nagyobb mint a hátizsák mérete Optimális pakolás: olyan érvényes pakolás, amelyiknél nincs nagyobb összértékű érvényes pakolás
Nyers erő módszere Oszd meg és uralkodj Feljegyzéses módszer Dinamikus programozás Mohó algoritmusok Optimalizációs stratégiák 1.
4 Nyers erő módszere (brute force) Alapelv: egyszerűen végigpróbálgatjuk az összes lehetséges megoldást A 0-1 hátizsák probléma megoldása függvény HátizsákBF OPT [hamis,hamis,,hamis] ciklus i 1-től 2 N -1-ig ciklus j 0-től N-1-ig K[j] i / 2 j mod 2 = 1 ciklus vége ha (ÖsszSúly(K) W max ) (ÖsszÉrték(K)>ÖsszÉrték(OPT)) akkor OPT K elágazás vége ciklus vége vissza ÖsszÉrték(OPT) függvény vége Amennyiben érvényes pakolást találunk, akkor ellenőrizzük, hogy jobb-e, mint az eddig talált legjobb Ha igen, akkor ezt követően ezt tekintjük a legjobbnak
5 Nyers erő módszerének értékelése Előnyei Egyszerűen megérthető Egyszerűen implementálható Gyakran csak ez használható Tárhelyigénye nem jelentős Jól párhuzamosítható Hátrányai Futásideje nem kedvező (jelen esetben 2 N lépés)
Nyers erő módszere Oszd meg és uralkodj Feljegyzéses módszer Dinamikus programozás Mohó algoritmusok Optimalizációs stratégiák 1.
7 Oszd meg és uralkodj (divide and conqueror) Programozás I tárgyban már tanult módszer Összefésülő rendezés Quicksort K-adik legkisebb elem kiválasztása Stb. Általában rekurzív megközelítést használ: Amennyiben a megoldandó probléma egyszerű, akkor Megoldás Amennyiben a megoldandó probléma ehhez túl bonyolult, akkor Felosztás több kisebb részproblémára Az így kapott kisebb részproblémák megoldása (tipikusan rekurzív hívás(ok) segítségével) Az így kapott részeredmények egyesítése, azok alapján a megoldandó probléma eredményének előállítása A fenti alapelv optimalizációra is használható
0-1 hátizsák probléma rekurzív megközelítésben Egy részprobléma esetén van t darab tárgyunk (az eredeti feladat 1..t-ig indexű tárgyai) h szabad helyünk (ez értelemszerűen nem nagyobb mint W max ) Rekurzívan megfogalmazva egy optimális pakolás értéke: 0 ha h = 0 0 ha t = 0 F t,h = F t 1,h ha h > 0 t > 0 h < w t max F t 1,h, F t 1,h wt + p t ha h > 0 t > 0 h w t Tehát ha a tárgyak száma vagy a szabad hely 0, akkor az optimális pakolás értéke 0 ha az utolsó tárgy nem fér bele a zsákba, akkor az optimális pakolás értéke annyi, mint amennyi az előtte lévő tárgyakkal elérhető ugyanekkora helyen ha befér, akkor az alábbiak közül a nagyobbik érték az előtte lévő tárgyakkal elérhető optimális érték ugyanekkora helyen (nem rakjuk be) az előtte lévő tárgyakkal elérhető érték az utolsó tárgy méretével csökkentett helyen + az utolsó tárgy értéke (berakjuk) szenasi.sandor@nik.uni-obuda.hu 8
0-1 hátizsák probléma megoldása oszd meg és uralkodj módszerrel szenasi.sandor@nik.uni-obuda.hu 9 függvény LegjobbRészMegoldás(t, h) ha (t = 0) (h = 0) akkor vissza 0 különben P nem LegjobbRészMegoldás(t-1, h) ha h w t akkor P igen p t + LegjobbRészMegoldás(t-1, h-w t ) P opt max(p igen, P nem ) különben P opt P nem elágazás vége vissza P opt elágazás vége függvény vége függvény HátizsákDnC vissza LegjobbRészMegoldás(N, W max ) függvény vége
10 Az oszd meg és uralkodj módszer értékelése Előnyei A keresés jobban irányítható mint az előző esetben, nem vizsgál meg eleve reménytelen útvonalakat Gyakran nagyon jól párhuzamosítható A lépésszáma alacsonyabb lehet mint a nyers erő módszer esetén Hátrányai Csak bizonyos szerkezetű megoldásoknál hatékony ez a technika Amennyiben az egyes részproblémák egymást átfedik, akkor nagyon sok felesleges számítást végez. Lásd Fibonacci számok rekurzív számítása
Nyers erő módszere Oszd meg és uralkodj Feljegyzéses módszer Dinamikus programozás Mohó algoritmusok Optimalizációs stratégiák 1.
Feljegyzéses módszer (Memoization) Oszd meg és uralkodj módszert így szeretjük elképzelni A valóságban azonban gyakran inkább így néz ki A részproblémák gyakran átfedik egymást: A részproblémákra bontásnál nem foglalkoztunk azzal, hogy esetleg ugyanazt a részproblémát többször is megkapjuk Ha már úgy alakult, hogy ugyanazt a problémát többször kell megoldani, akkor nem használjuk fel az előző megoldás eredményeit A futásidő tehát jelentősen javítható egy egyszerű módszerrel: A már kiszámított részeredményeket tároljuk el valahogy Ha egy már megoldott részproblémához jutunk újra, akkor használjuk ezeket szenasi.sandor@nik.uni-obuda.hu 12
0-1 hátizsák probléma megoldása feljegyzéses módszer -rel szenasi.sandor@nik.uni-obuda.hu 13 függvény LegjobbRészMegoldás(t, h) ha (t = 0) (h = 0) akkor vissza 0 különben ha RészMegoldásTárolóbanKeres([t, h]) akkor vissza RészMegoldásTárolóbanKeres([t, h]) különben P nem LegjobbRészMegoldás(t-1, h) ha h w t akkor P igen p t + LegjobbRészMegoldás(t-1, h-w t ) P opt max(p igen, P nem ) különben P opt P nem elágazás vége RészMegoldásTárolóbaFeljegyez([t, h], P opt ) vissza P opt elágazás vége elágazás vége függvény vége függvény HátizsákMemo vissza LegjobbRészMegoldás(N, W max ) függvény vége
14 A feljegyzéses módszer értékelése Előnyei A megoldás alapelve pontosan ugyanaz, mint az oszd meg és uralkodj módszer esetében, ezért azt nem is vizsgáltuk meg újra Jelentősen tudja csökkenteni a lépésszámot, ha sok egymást átfedő részproblémát kell megoldani Egyszerűen implementálható. A pontos feladat ismerete nélkül is adható egy általános séma a használatára (persze annak hatékonysága előre nem tudható) Hátrányai Csak bizonyos szerkezetű megoldásoknál hatékony ez a technika Jelentős többlet tárhelyigényt jelent Tulajdonképpen jobb futásidőt kapunk nagyobb tárhelyért cserébe Kiegészítés Amennyiben a triviális megoldások száma véges (és kevés), akkor azt is megtehetjük, hogy ezeket már a rekurzió hívása előtt betöltjük a részmegoldás tárolóba. Ilyenkor a triviális megoldás ellenőrzés el is hagyható a rekurzív algoritmusból
Nyers erő módszere Oszd meg és uralkodj Feljegyzéses módszer Dinamikus programozás Mohó algoritmusok Optimalizációs stratégiák 1.
16 Dinamikus programozás alapjai Az oszd meg és uralkodj módszer felülről lefelé haladva próbálja megoldani a feladatot: A komplex problémát felbontja kisebb részproblémákra Majd ezek megoldása alapján adja meg az összetett probléma megoldását A gyakorlatban a rekurzív függvény először csak hívogatja magát, amíg el nem jut valamelyik triviális megoldásig. Ezt követően ez alapján elkezdi el felépíteni a teljes megoldást A feljegyzéses módszer esetében ez jól látható, ha megvizsgáljuk, hogy a részmegoldás tárolóba milyen sorrendbe érkeznek az adatok. Először a legegyszerűbb részproblémák adatai kerülnek bele, majd ezek alapján épülnek fel a komplexebb részproblémák eredményei A fentiek alapján próbáljuk meg eleve ezt az alulról felfelé való építkezést megvalósítani. Egy tárhelyen tároljuk el a triviális megoldásokat, majd ezek alapján kezdjük el felépíteni az egyre összetettebbeket, amíg el nem jutunk a teljes probléma megoldásáig
17 Hátizsákpakolási feladat megoldása Az algoritmus egy T tömböt tölt fel ennek mérete (N+1) (W max +1) T[t,h] értéke azt mutatja, hogy az első t darab tárgy elhelyezése h szabad helyre milyen optimális pakolási összértékkel járhat A feltöltés menete Triviális esetek előre beírhatók a tömbbe: ha nincs szabad hely, az érték 0 ha nincs tárgy, az érték 0 Ezt követően a már megismert képlettel feltöltjük a többi elemet Mivel a rekurzív képlet a T(t,h) elem kiszámításához csak a t-nél és h- nál kisebb elemeket igényli, így könnyen belátható, hogy a táblázat T[t,h] elemének kiszámításához a t-t és h-t növelő ciklusok mindig már ismert részeredményeket fognak csak felhasználni Így nincs szükség rekurzióra, a feltöltés egyszerűen megoldható A feltöltött táblázat T[N, W max ] eleme tartalmazza a teljes feladat megoldását (tehát egy optimális pakolás értékét)
0-1 hátizsák probléma megoldása dinamikus programozás -sal szenasi.sandor@nik.uni-obuda.hu 18 függvény HátizsákDP ciklus t 0-tól N-ig F[t,0] 0 ciklus vége ciklus h 1-től W max -ig F[0,h] 0 ciklus vége ciklus t 1-től N-ig ciklus h 1-től W max -ig ha h w t akkor F[t,h] max(f[t-1,h], F[t-1,h-w t ] + p t ) különben F[t,h] F[t-1,h] elágazás vége ciklus vége ciklus vége vissza F[N,W max ] függvény vége Megjegyzés: a tömböket kivételesen 0-tól indexeljük
19 0-1 hátizsák probléma megoldásának előállítása Egy optimális pakolást állít elő az alábbi algoritmus: függvény HátizsákDPEredmény(F) OPT [hamis,hamis,,hamis] t N h W max ciklus amíg (t > 0) (h > 0) ha F[t,h] F[t-1,h] akkor OPT[t] igaz h h - w j elágazás vége t t - 1 ciklus vége vissza OPT függvény vége Elindulunk a (t=n, h=w max ) elemtől, majd Ha F[t,h] = F[t-1,h] az azt jelenti, hogy a t. elem nincs benne a zsákban (hiszen ugyanakkora helyen nélküle ugyanakkora az optimális pakolás értéke) Ha a két érték nem egyezik, akkor a t. elem benne van a zsákban Ezt követően vizsgáljuk a megelőző tárgyakból elérhető optimális pakolást (a fentiek alapján korrigált szabad hellyel)
20 A dinamikus programozás módszere általánosan A módszer hatékony használatának előkövetelményei: A feladat legyen optimális részstruktúrájú: a feladat optimális megoldása önmagán belül a részfeladatok optimális megoldásait is tartalmazza Legyenek a részfeladatok átfedőek: a részfeladatokra bontás során többször is merüljön fel ugyanannak a részfeladatnak a megoldása A módszerrel minden, a fenti feltételeknek megfelelő probléma egyszerűen megoldható Amennyiben ezek teljesülnek, a megoldás lépései: Az optimális megoldás szerkezetének jellemzése A megoldás értékének (jóságának) rekurzív módon való definiálása Az optimális megoldás értékének (jóságának) kiszámítása alulról felfelé történő módon Amennyiben szükséges, magának az optimális megoldásnak a magadása Az utolsó lépés csak akkor szükséges, ha nem elég egy optimális megoldás értéke, hanem magát a megoldást is tudni szeretnénk
21 A dinamikus programozás értékelése Előnyei Futásideje általában kedvező Nincs szükség egy részprobléma többszöri megoldására Nem rekurzív Minden, az előfeltételeknek megfelelő feladat megoldható vele Tárigénye és lépésszáma előre tudható Hátrányai Az alulról felfelé való megoldás miatt néha felesleges részproblémákat is megold A többi megoldáshoz viszonyítva a tárigénye magasabb lehet Megjegyzés A tárigény csökkenthető, ha a már szükségtelen részmegoldások eredményeit töröljük (hátizsáknál pl. mindig csak az előző sorra van szükségünk) További klasszikus dinamikus programozáson alapuló megoldások: Mátrixok láncszorzása Leghosszabb közös részsorozat Stb.
Nyers erő módszere Oszd meg és uralkodj Feljegyzéses módszer Dinamikus programozás Mohó algoritmusok Optimalizációs stratégiák 1.
23 Mohó algoritmusok Mohó algoritmus: a feladat megoldása során felmerülő részproblémák megoldásakor mindig az aktuálisan legjobbnak tűnő részeredményt választja Legjobbnak tűnő: a rendelkezésre álló (általában hiányos) információk alapján próbálja megbecsülni, hogy mit érdemes választani. Ebből adódóan a futásideje általában nagyon jó A mohó stratégia általában az alábbi két előfeltételt igényli Optimális részproblémák: az optimális megoldás felépíthető a részproblémák optimális megoldásából Mohó választás: a globális optimális megoldás elérhető lokális optimumok választásán keresztül Mohó algoritmusok típusai Az előzőeknek megfelelő problémák esetén mindig optimális megoldást ad Bizonyos feladatoknál nem mindig ad optimális megoldást, csak egy közel optimálisat (bár általában itt is bizonyítható, hogy ez mennyire van közel az optimálishoz)
24 0-1 hátizsák probléma megoldása mohó algoritmussal Egy közel optimális pakolást állít elő az alábbi algoritmus: függvény HátizsákMohó TárgyakRendezése(w, p) OPT [hamis,hamis,,hamis] t 1 ciklus amíg (ÖsszSúly(OPT) < W max ) (t N) ha ÖsszSúly(OPT) + w t W max akkor OPT[t] igaz elágazás vége t t + 1 ciklus vége vissza ÖsszÉrték(OPT) függvény vége Először rendezzük a tárgyakat valamilyen szempont szerint, pl. Súly szerint növekvő sorrend Érték szerint csökkenő sorrend Érték/súly szerint csökkenő sorrend Ezt követően a fenti sorrendben kezdjük vizsgálni a tárgyakat Ha még belefér a zsákba, akkor belerakjuk, egyébként nem Megállunk ha tele a zsák, vagy elfogytak a tárgyak
25 A mohó módszer értékelése Előnyei Futásideje nagyon jó (gyakran lineáris) Ha nem ad optimális megoldást, akkor is egy közel optimálisat nyújt (ez alapja lehet egy másik, lassabb de pontosabb módszernek) Hátrányai Csak a feladatok egy szűk körénél használható Megjegyzés A 0-1 hátizsákproblémára nem ismert mohó algoritmus, a töredékes hátizsákproblémára (amikor egy tárgy egy részét is berakhatjuk a zsákba) viszont könnyen belátható, hogy működik az általunk megadott módszer a harmadik rendezést használva A későbbiek során még számos mohó algoritmussal találkozunk, amelyek bizonyítottan mindig optimális megoldást adnak Dijkstra algoritmusa Prim algoritmusa Kruskal algoritmusa Stb.
26 Irodalomjegyzék Javasolt/felhasznált irodalom Rónyai, Ivanyos, Szabó: Algoritmusok, Typotex, 2005 Cormen, Leiserson, Rivest: Algoritmusok, Műszaki Könyvkiadó, 1997 Mehlhorn, Sanders: Algorithms and Data Structures, Springer, 2008 Skiena: The Algorithm Design Manual, Springer, 2008 Szénási: Algoritmusok, adatszerkezetek II., Óbudai Egyetem, 2014