dinamikus programozás
DESCRIPTION
Dinamikus programozás. Szlávi Péter ELTE IK [email protected]. Dinamikus programozás * tartalom. 0 Bevezetés 1 Egy gondolatébresztő példa 2 Első példázat * pénzváltás 3 Második példázat * optimális pénzváltás 4 Harmadik példázat * tükörszavak 5 Irodalom. 0Bevezetés. - PowerPoint PPT PresentationTRANSCRIPT
Dinamikus Dinamikus programozásprogramozás
Szlávi PéterSzlávi PéterELTE IKELTE [email protected]
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 22/57/57
Dinamikus programozásDinamikus programozás* tartalom* tartalom
00 BevezetésBevezetés
11 Egy gondolatébresztő példaEgy gondolatébresztő példa
22 Első példázat * Első példázat * pénzváltáspénzváltás
33 Második példázat * Második példázat * optimális optimális pénzváltáspénzváltás
44 Harmadik példázat * Harmadik példázat * tükörszavaktükörszavak
55 IrodalomIrodalom
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 33/57/57
00 BevezetésBevezetés
A lényeg:A lényeg:
Valamilyen probléma (optimális) Valamilyen probléma (optimális) megoldása úgy, hogy megoldása úgy, hogy
1.1. rekurzívan visszavezetjük rész-rekurzívan visszavezetjük rész-problémák megoldására, deproblémák megoldására, de
2.2. a rekurzió elkerülését (minimális-a rekurzió elkerülését (minimális-ra szorítását) egy táblázat ra szorítását) egy táblázat felépíté-sével, és felépíté-sével, és újrahasznosításával érjük el…újrahasznosításával érjük el…
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 44/57/57
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
1.1 Az „iskolapélda” – 1.1 Az „iskolapélda” – pénzfelválthatóságpénzfelválthatóság
BemeneteBemenete:P={p1,...,pN} pozitív egészek – a pénzcímletek, és E pozitív egész – a felváltandó összegKimenete:Kimenete:FelválthatóE logikai érték – jelentése = fel- váltható-e az E a P halmazban felsorolt cím-letekkel úgy, hogy minden címletet legfeljebb egyszer használunk fel
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 55/57/57
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
1.2 A példa „ízlelgetése” 1.2 A példa „ízlelgetése” A felváltás „szerkezetének” A felváltás „szerkezetének”
elemzéseelemzése
Egy logikus rekurzív kapcsolat:Egy logikus rekurzív kapcsolat:Tfh. felváltható az E, ekkor (1a) E = pi1
+…+pik ,
feltehető:(1b) i1<…<ik is.Ez esetben világos, hogy(2) E–pik
= pi1+…+pik-1
leírása az E–pik és {p1,…,pik-1
} paraméterek-
kel jellemzett redukált feladatnak
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 66/57/57
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
Részproblémákra bontásRészproblémákra bontás
A felhasználható címleteket A felhasználható címleteket rögzített sorrendűnek tekintve a rögzített sorrendűnek tekintve a {p{p11,…,p,…,pii} hal-mazt egyértelműen } hal-mazt egyértelműen azonosíthatjuk azonosíthatjuk ii-vel. Így-vel. Ígybármely (rész)probléma azonosíthatóbármely (rész)probléma azonosítható az (X,i) paraméter-kettőssel, ahol X a felváltandó összeg és i a felváltáshoz felhasználható címletek utol- sójának indexe
A feladat: (E,N). A A feladat: (E,N). A (2)-ben megfogal--ben megfogal-mazott részfeladat: (E-pmazott részfeladat: (E-p iikk,i,ikk-1-1).).
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 77/57/57
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
Rekurzív összefüggések a Rekurzív összefüggések a részproblé-mák és megoldásaik részproblé-mák és megoldásaik közöttközött (vázlatosan)(vázlatosan) FV: N FV: N N N L LFV(X,i) = Igaz, haFV(X,i) = Igaz, ha1.1. ppii=X, vagy=X, vagy
2.2. ppii<X és FV(X-p<X és FV(X-pii,i-1), vagy,i-1), vagy
3.3. FV(X,i-1)FV(X,i-1)
i. az éppen szükséges címleti. az éppen szükséges címlet
i. felhasználható és a mara-i. felhasználható és a mara-dék felváltható az előzőekkeldék felváltható az előzőekkel
i. nélkül, az előzőekkel felválthatói. nélkül, az előzőekkel felváltható
1)-iFV(X, 1i
1)-i,p-FV(X Xpi 1i
Xpi 0i
:i)FV(X, i
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 88/57/57
Rekurzív megoldás egy lehetséges Rekurzív megoldás egy lehetséges algoritmusaalgoritmusa
type TCimletek=record db:integer; cimlet: array [1..MaxCimletDb] of integer end;var Cimletek:TCimletek; functionfunction FV( FV(constconst X X{{felváltandófelváltandó}},,
i i{{max.indexmax.index}}:integer):boolean;:integer):boolean;beginbegin FV:=((i>0) FV:=((i>0) andand (Cimletek.cimlet[i]=X)) (Cimletek.cimlet[i]=X))
////i. éppen a kellő címleti. éppen a kellő címlet
oror ((i>1) ((i>1) andand FV(X,i-1)); FV(X,i-1)); //nem az, de i-1.-ig felváltható//nem az, de i-1.-ig felváltható
oror ((i>1) ((i>1) andand (Cimletek.cimlet[i]<X) (Cimletek.cimlet[i]<X) andand //i. felhasználható//i. felhasználható
FV(X-Cimletek.cimlet[i],i-1)) FV(X-Cimletek.cimlet[i],i-1)) //és a maradék i-1.-ig felváltható//és a maradék i-1.-ig felváltható
endend;;////FVFV
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
1)-iFV(X, 1i
1)-i,p-FV(X Xpi 1i
Xpi 0i
:i)FV(X, i
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 99/57/57
Próbák – elemzések:Próbák – elemzések:a) Kis címletszám (pl. {1,2,5})
mellett „igenlő” a megoldás (pl. 8) – hívási
sorrend „tagadó” a megoldás (pl. 9) – hívási
sorrend mindkét végeredményhez olyan ada-
tok alapján, amelyben van ismétlődő címlet – hívási sorrend, hívás-szám
b) Különféle címletszám (pl. 5, 9, 15, …) mellett olyan összeg, amely azért nem váltható fel, mert túl nagy – hívás-szám növekedése
Próbáljuk ki és következtessünk! Zip, exe
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1010/57/57
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
…… FV:=((i>0) FV:=((i>0) andand (Cimletek.cimlet[i]=X)) (Cimletek.cimlet[i]=X))
//i. éppen a kellő címlet//i. éppen a kellő címlet oror ((i>1) ((i>1) andand FV(X,i-1)); FV(X,i-1));
//nem az, de i-1.-ig felváltható//nem az, de i-1.-ig felváltható oror ((i>1) ((i>1) andand (Cimletek.cimlet[i]<X) (Cimletek.cimlet[i]<X) andand
//i. felhasználható//i. felhasználható FV(X-Cimletek.cimlet[i],i-1)) FV(X-Cimletek.cimlet[i],i-1))
//és a maradék i-1.-ig felváltható//és a maradék i-1.-ig felváltható……
a) tesztek
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1111/57/57
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
…… FV:=((i>0) FV:=((i>0) andand (Cimletek.cimlet[i]=X)) (Cimletek.cimlet[i]=X))
//i. éppen a kellő címlet//i. éppen a kellő címlet oror ((i>1) ((i>1) andand FV(X,i-1)); FV(X,i-1));
//nem az, de i-1.-ig felváltható//nem az, de i-1.-ig felváltható oror ((i>1) ((i>1) andand (Cimletek.cimlet[i]<X) (Cimletek.cimlet[i]<X) andand
//i. felhasználható//i. felhasználható FV(X-Cimletek.cimlet[i],i-1)) FV(X-Cimletek.cimlet[i],i-1))
//és a maradék i-1.-ig felváltható//és a maradék i-1.-ig felváltható……
a)tesztek (folytatás)
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1212/57/57
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
TapasztalatokTapasztalatok::A hívások módszeresen következnek egy-
másután. Akár iterációval is „utánozhat-nánk”. (Legalábbis az ismétlésmentes esetben.)
Az ismétlésmentes esetekben a hívás-szá-mok legfeljebb 1 értékűek, azaz legfeljebb egyszeres számolást jeleznek, ami a haté-konyság szempontjából megnyugtató. A 3. futásnál is még legfeljebb 2 az ismétlődő számítás, de a 4.-nél, ami alig különbözik a 3.-tól, már 4 helyen is „tripletet” látunk. S ez rosszat sejtet. kódkód
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1313/57/57
11 Egy Egy gondolatébresztő példagondolatébresztő példa
A hívások során egy bináris fát „járunk be”.
Pl. a „9 összeg {1,2,5} címletekkel” futáshoz tartozó bináris fa.
kódkód
…… FV:=((i>0) FV:=((i>0) andand (Cimletek.cimlet[i]=X)) (Cimletek.cimlet[i]=X))
//i. éppen a kellő címlet//i. éppen a kellő címlet oror ((i>1) ((i>1) andand FV(X,i-1)); FV(X,i-1));
//nem az, de i-1.-ig felváltható//nem az, de i-1.-ig felváltható oror ((i>1) ((i>1) andand (Cimletek.cimlet[i]<X) (Cimletek.cimlet[i]<X) andand
//i. felhasználható//i. felhasználható FV(X-Cimletek.cimlet[i],i-1)) FV(X-Cimletek.cimlet[i],i-1))
//és a maradék i-1.-ig felváltható//és a maradék i-1.-ig felváltható……
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1414/57/57
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
b)tesztek
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1515/57/57
11 Egy Egy gondolatébresztő példagondolatébresztő példa
Újabb tapasztalatokÚjabb tapasztalatok::Durván növekszik a hívás-szám (mindkét)
paraméter növekedtével..A legrosszabb (negatív végeredményű)
esetekben a hívás-számokra „gyanús” értékeket kaptunk.Állítás:
Ha RekHDb(X,i) az X összeg felbonthatósá-gához szükségez rekurzív hívások számát jelenti (i. címlettel bezárólag), akkor legked-vezőtlenebb esetben a szükséges rekurzív hívások száma:
RekHDb(X,i) = 2RekHDb(X,i) = 2ii–1–1 A hívás-szám maximumát igenlő esetben A hívás-szám maximumát igenlő esetben
is elérhetjük. Példát erre láss is elérhetjük. Példát erre láss itt!!
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1616/57/57
11 Egy Egy gondolatébresztő példagondolatébresztő példa
A dinamikus programozásos megoldásA dinamikus programozásos megoldás Táblázatba gyűjtjük a részproblé-Táblázatba gyűjtjük a részproblé-mákra adott válaszokat.mákra adott válaszokat.A táblázat sorai az egyes X összegek-A táblázat sorai az egyes X összegek-hez, oszlopai az egyes phez, oszlopai az egyes p ii címletekhez címletekhez rendeli az FV(X,i) értékeket.rendeli az FV(X,i) értékeket.Éppúgy, ahogy az előbbi programnál tettünk, Éppúgy, ahogy az előbbi programnál tettünk, csakhogy ott tisztán adminisztratív, működés-csakhogy ott tisztán adminisztratív, működés-megértési céllal.megértési céllal.
A táblázatkitöltést a kis értékek felöl A táblázatkitöltést a kis értékek felöl kezdjük: hiszen az FV(X,i) rekurzió-kezdjük: hiszen az FV(X,i) rekurzió-jában FV(X,ijában FV(X,i–1–1) és FV(X) és FV(X–p–pii,i,i–1–1) szere-) szere-pel.pel.
Röviden: DP.Röviden: DP.
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1717/57/57
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
A megoldó kód vázlata:A megoldó kód vázlata:Az sgRekTab jelenti most a táblázatot:Az sgRekTab jelenti most a táblázatot:
function PenzValtas_DinProg:boolean;begin Tablafeltoltes(Felvaltando,Cimletek.db); PenzValtas_DinProg:=sgRekTab.Cells[Cimletek.db+1, Felvaltando+2]='+';end;
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1818/57/57
11 Egy Egy gondolatébresztő példagondolatébresztő példa
procedure Tablafeltoltes (const E{felváltandó}, N{max.index}:integer);
var i,x:integer;begin with fmPenzValtas do begin for x:=1 to E do begin sgRekTab.Cells[2,x+2]:='-';//első oszlop (=2 indexű) Hamis
end;//for x //kivéve az 1. cimletnél: if Cimletek.cimlet[1]<=E then //van még cimlet[1]-dik sor? begin sgRekTab.Cells[2,Cimletek.cimlet[1]+2]:='+'; end;//if …
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 1919/57/57
11 Egy gondolatébresztő Egy gondolatébresztő példapélda
… for i:=2 to N do//az i. oszlop számítása begin for x:=1 to E do begin if (Cimletek.cimlet[i]=x)
or (sgRekTab.Cells[i,x+2]='+') or ((Cimletek.cimlet[i]<x) and
(sgRekTab.Cells[i,x-Cimletek.cimlet[i]+2]='+')) then sgRekTab.Cells[i+1,x+2]:='+‘//igaz else sgRekTab.Cells[i+1,x+2]:='-'//hamis {endIf}; end;//for x end;//for i end;//withend;//Tablafeltoltes
Rekurzív hívás helyett Rekurzív hívás helyett táblahasználattáblahasználat
kódkód
…… FV:=((i>0) FV:=((i>0) andand (Cimletek.cimlet[i]=X)) (Cimletek.cimlet[i]=X))
//i. éppen a kellő címlet//i. éppen a kellő címlet oror ((i>1) ((i>1) andand FV(X,i-1)); FV(X,i-1));
//nem az, de i-1.-ig felváltható//nem az, de i-1.-ig felváltható oror ((i>1) ((i>1) andand (Cimletek.cimlet[i]<X) (Cimletek.cimlet[i]<X) andand
//i. felhasználható//i. felhasználható FV(X-Cimletek.cimlet[i],i-1)) FV(X-Cimletek.cimlet[i],i-1))
//és a maradék i-1.-ig felváltható//és a maradék i-1.-ig felváltható……
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2020/57/57
11 Egy Egy gondolatébresztő példagondolatébresztő példa
Összehasonlító futás:Összehasonlító futás:
Próbáljuk ki és következtessünk! Zip, exe
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2121/57/57
11 Egy Egy gondolatébresztő példagondolatébresztő példa
Megjegyzések:Megjegyzések: A rekurzív megoldás fajlagos A rekurzív megoldás fajlagos
ismétlési száma: 1 048 575 / 25 267 ismétlési száma: 1 048 575 / 25 267 41 . 41 .
A DP 222 220 darab táblaelemet szá-A DP 222 220 darab táblaelemet szá-mol ki, de csak egyszer.mol ki, de csak egyszer.
A fajlagos sebesség növekedés: A fajlagos sebesség növekedés: 1 048 575 / 222 220 1 048 575 / 222 220 4,7 . 4,7 .
A „feleslegesen” kiszámolt táblaelem A „feleslegesen” kiszámolt táblaelem szám: (222 220 – 25 267) = 196 953 szám: (222 220 – 25 267) = 196 953 7,8 szorosa a szükségesnek. 7,8 szorosa a szükségesnek.
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2222/57/57
11 Egy Egy gondolatébresztő példagondolatébresztő példa
Egy „okosabb” DP megoldásEgy „okosabb” DP megoldás Ötlet: ötvözni a rekurzív megoldás Ötlet: ötvözni a rekurzív megoldás célratörését, azaz „célratörését, azaz „csak azt csak azt kiszámol-ni, amit muszájkiszámol-ni, amit muszáj” elvét a ” elvét a DP megoldás „DP megoldás „mindent csak mindent csak egyszer kiszámolniegyszer kiszámolni” elvével.” elvével.Tehát a számítás logikája rekurzív Tehát a számítás logikája rekurzív marad, de mielőtt egy rekurzív marad, de mielőtt egy rekurzív hívást kezdeményeznénk, hívást kezdeményeznénk, megnézzük, nem lett-e már megnézzük, nem lett-e már kiszámolva.kiszámolva.
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2323/57/57
11 Egy Egy gondolatébresztő példagondolatébresztő példa
function FV(const X,i:integer):boolean;begin if (fmPenzValtas.sgRekTab.Cells[i+1,X+2]='+') then begin FV:=true end else if (fmPenzValtas.sgRekTab.Cells[i+1,X+2]='-') then begin FV:=false end else
begin FV:=((i>0) and (Cimletek.cimlet[i]=X)) or ((i>1) and FV(X,i-1)) or ((i>1) and (Cimletek.cimlet[i]<X) and FV(X-Cimletek.cimlet[i],i-1)) end {endif};end;//FV
már ismert a '+' válasz
kódkód
már ismert a ‘-' válasz
még nem ismert a válasz
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2424/57/57
11 Egy Egy gondolatébresztő példagondolatébresztő példa
Összehasonlító futás:Összehasonlító futás:
Próbáljuk ki és következtessünk! Zip, exe
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2525/57/57
11 Egy Egy gondolatébresztő példagondolatébresztő példa
1.3 A DP módszerének váza 1.3 A DP módszerének váza 1.1. A megoldás szerkezetének A megoldás szerkezetének
tanulmányozásatanulmányozása – részproblémákra bontás – részproblémákra bontás megsejtésemegsejtése
2.2. Részproblémákra és összetevőkre bontásRészproblémákra és összetevőkre bontás– részproblémák és paramétereik körvonala-– részproblémák és paramétereik körvonala-zása: a rekurzió előkészítése zása: a rekurzió előkészítése
3.3. Részproblémák megoldásának kifejezése Részproblémák megoldásának kifejezése rekurzívan az összetevők megoldásaibólrekurzívan az összetevők megoldásaiból– formalizálás: függvény definíció– formalizálás: függvény definíció
4.4. Részproblémák megoldásának kiszámításaRészproblémák megoldásának kiszámítása – a táblaszámítás algoritmizálása– a táblaszámítás algoritmizálása1.1. kiszámítási sorrend meghatározása: minden részprob-kiszámítási sorrend meghatározása: minden részprob-
léma minden összetevője előbb szerepeljen a léma minden összetevője előbb szerepeljen a felsorolás-banfelsorolás-ban
2.2. az „alulról-felfelé” haladó számításaz „alulról-felfelé” haladó számítás
5.5. A megoldás előállítása a 4. lépésben A megoldás előállítása a 4. lépésben előállított táblázat segítségévelelőállított táblázat segítségével – a megoldás algoritmizálása– a megoldás algoritmizálása
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2626/57/57
22 Első példázat – Első példázat – pénzváltás pénzváltás
2.1 A feladat 2.1 A feladat
BemeneteBemenete:P={p1,...,pN} pozitív egészek – a pénzcímletek, és E pozitív egész – a felváltandó összegKimenete:Kimenete:SP – a felváltásban szereplő pénzcímletek; az S halmazban felsorolt címleteket legfeljebb egyszer használhatjuk fel
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2727/57/57
2.2 A megoldás 2.2 A megoldás 2.2.1 2.2.1 A megoldás szerkezetének A megoldás szerkezetének
tanulmányozásatanulmányozása
Ua. mint Ua. mint korábban…
22 Első példázat – Első példázat – pénzváltás pénzváltás
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2828/57/57
2.2.2 2.2.2 Részproblémákra és összetevők-Részproblémákra és összetevők-re bontásre bontás
A részproblémák a korábbiakhoz hason-A részproblémák a korábbiakhoz hason-lóan fogalmazhatók meg.lóan fogalmazhatók meg.
Az FV(X,i) jelentése viszont más: Az FV(X,i) jelentése viszont más: a legna-a legna-gyobb P-beli elem indexegyobb P-beli elem indexe, amely még , amely még előfordul az X felváltásában.előfordul az X felváltásában.
Pl.:Pl.:P={2,4,5} N=3; X=7, akkor S={2,5} FV(7,3)=3, mert p3=5,
FV(7-p3,3-1)=FV(7-5,3-1)=1, mert p1=2,
FV(2-p1,1-1)=FV(2-2,1-1)=FV(0,0).
22 Első példázat – Első példázat – pénzváltás pénzváltás
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 2929/57/57
2.2.3 2.2.3 Részproblémák megoldásának Részproblémák megoldásának kifejezésekifejezése
N1)-i,p-FV(XpX ha ,i
N1)-iFV(X, ha ,1)-iFV(X,
0X ha ,0
0X 0i ha ,1N
:i)FV(X,
ii
Vegyük észre, hogy akkor N+1 az ered-Vegyük észre, hogy akkor N+1 az ered-mény, ha nincs megoldás, s o, ha már mény, ha nincs megoldás, s o, ha már nem kell folytatni.nem kell folytatni.
22 Első példázat – Első példázat – pénzváltás pénzváltás
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3030/57/57
22 Első példázat – Első példázat – pénzváltás pénzváltás
2.2.4 2.2.4 Részproblémák megoldásánakRészproblémák megoldásának kiszámítása kiszámítása
A A FV definíciójábólFV definíciójából látszik: csökkenő palátszik: csökkenő pa--raméterekhez nyúl vissza, így araméterekhez nyúl vissza, így a táblaki-táblaki-töltő számítás kis értékektől indulhat a töltő számítás kis értékektől indulhat a nagyobbak felé…nagyobbak felé…
N1)-i,p-FV(XpX ha ,i
N1)-iFV(X, ha ,1)-iFV(X,
0X ha ,0
0X 0i ha ,1N
:i)FV(X,
ii
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3131/57/57
22 Első példázat – Első példázat – pénzváltás pénzváltás
2.2.5 2.2.5 A megoldás előállításaA megoldás előállítása
A megoldás meghatározása A megoldás meghatározása most bonyodalmasabb, mint most bonyodalmasabb, mint volt korábban: hiszen most volt korábban: hiszen most egy egy indexindexet kapunk a et kapunk a függvény ér-tékeként függvény ér-tékeként (k(k11=FV(E,N)). A táblá-zatból =FV(E,N)). A táblá-zatból kiolvasható a követke-zőé kiolvasható a követke-zőé (k(k22=FV(E–p=FV(E–pkk11,k,k11–1)), majd az –1)), majd az
azt követőé éít. Amíg a fel-azt követőé éít. Amíg a fel-váltandó összegparaméter 0-váltandó összegparaméter 0-ra nem csökken.ra nem csökken.
Rekurzív megoldás esetén persze ez Rekurzív megoldás esetén persze ez a visszalépdelés is rekurzívan a visszalépdelés is rekurzívan történne.történne.
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3232/57/57
22 Első példázat – Első példázat – pénzváltáspénzváltás
begin//PenzValtas_DinProg Tablafeltoltes(Felvaltando,Cimletek.db); KiCimletek.db:=0; if strToInt(sgRekTab.Cells[Cimletek.db+1,Felvaltando+2])<=
Cimletek.db then begin kX:=Felvaltando; k:=Cimletek.db; while kX>0 do begin k:=strToInt(sgRekTab.Cells[k+1,kX+2]); inc(KiCimletek.db); KiCimletek.cimlet[KiCimletek.db]:=Cimletek.cimlet[k]; kX:=kX-Cimletek.cimlet[k]; dec(k); end;//while end;//ifend;//PenzValtas_DinProg
k. címlet már nem lehet, legfeljebb kisebb indexű
kX felváltásához szükséges legnagyobb címlet indexe: k
kX: a maradék összeg
van megoldás: leg-alább egy címlet
Az sgRekTab-ban az FV-értékek; a KiCimletek-ben képződik az eredmény
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3333/57/57
DP
22 Első példázat – Első példázat – pénzváltáspénzváltás
Összehasonlító futás:Összehasonlító futás:
Próbáljuk ki és következtessünk!Rekurzív: Zip, exe; DP: Zip, exe;„okos” DP: Zip, exe.
Rekurzív
„okos” DP
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3434/57/57
33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás
3.1 A feladat 3.1 A feladat
BemeneteBemenete:P={p1,...,pN} pozitív egészek – a pénzcímletek, és E pozitív egész – a felváltandó összegKimenete:Kimenete:SP – a felváltásban szereplő pénzcímletek; az S halmazban felsorolt címleteket legfeljebb egyszer használhatjuk fel; S a lehető legkisebb elemszámú
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3535/57/57
3.2 A megoldás 3.2 A megoldás … … és nem lehetne „mohóskodni”… ?és nem lehetne „mohóskodni”… ?
A problémánkhoz illeszkedő mohó A problémánkhoz illeszkedő mohó választás: választás: a még választhatók közül a még választhatók közül a legnagyobb címleta legnagyobb címlet. .
Egy ellenpélda: P={5,4,4,1,1,1} és Egy ellenpélda: P={5,4,4,1,1,1} és E=8; a mohó megoldás: E=8; a mohó megoldás: 8=5+1+1+1, ennél jobb: 8=4+4. 8=5+1+1+1, ennél jobb: 8=4+4.
33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3636/57/57
3.2.1 3.2.1 A megoldás szerkezetének A megoldás szerkezetének tanulmányozásatanulmányozása
Ua. mint korábban…Ua. mint korábban…
33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3737/57/57
3.2.2 3.2.2 Részproblémákra és Részproblémákra és összetevők-re bontásösszetevők-re bontás
A részproblémák a korábbiakhoz hason-A részproblémák a korábbiakhoz hason-lóan fogalmazhatók meg.lóan fogalmazhatók meg.
Két lépésben oldjuk meg a feladatot.Két lépésben oldjuk meg a feladatot.
1.1. Az Opt(X,i) jelentése: X felváltásához Az Opt(X,i) jelentése: X felváltásához szükséges (első i közül választható) szükséges (első i közül választható) címletek száma.címletek száma.
2.2. Az FV(X,i) jelentése: a legnagyobb P-Az FV(X,i) jelentése: a legnagyobb P-beli elem indexe (beli elem indexe (i), amely még elő-i), amely még elő-fordul a X felváltásában. (Építünk az fordul a X felváltásában. (Építünk az Opt-ra.)Opt-ra.)
33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3838/57/57
33 Második példázat Második példázat – optimális pénzváltás– optimális pénzváltás
3.2.3 3.2.3 Részproblémák megoldásának Részproblémák megoldásának kifejezésekifejezése
Vegyük észre, hogy akkor N+1 az ered-Vegyük észre, hogy akkor N+1 az ered-mény, ha nincs megoldás; 0, ha célhoz mény, ha nincs megoldás; 0, ha célhoz értünk.értünk.
Xp ha ,1)iOpt(X,
Xp ha,1))iOpt(X,1),i,pOpt(XMin(1
0X ha ,0
0X 0i ha ,1N
:i)Opt(X,
i
ii
Xp ha ,1)iFV(X,1)iOpt(X,1)i,pOpt(X1 Xp ha ,i
0X ha ,00X 0i ha ,1N
:i)FV(X,
i
ii
N1)-i,p-FV(XpX ha ,i
N1)-iFV(X, ha ,1)-iFV(X,
0X ha ,0
0X 0i ha ,1N
:i)FV(X,
ii
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 3939/57/57
Egy váratlan probléma:Egy váratlan probléma:
A futás adminisztrálását végző táblapár nincs A futás adminisztrálását végző táblapár nincs szinkron-ban. Bajt okoz, hogy a bal-felső tábla (1,2) szinkron-ban. Bajt okoz, hogy a bal-felső tábla (1,2) eleme üres. Pedig az alkalmazás foglalkozott vele, eleme üres. Pedig az alkalmazás foglalkozott vele, hiszen a bal-alsó tábla (1,2) cellája helyesen 1 értéket hiszen a bal-alsó tábla (1,2) cellája helyesen 1 értéket tartalmaz.tartalmaz.
33 Második példázat Második példázat – optimális pénzváltás– optimális pénzváltás
FV
Opt
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4040/57/57
33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás
A probléma magyarázata:A probléma magyarázata:
Az FV definíciójának optimumra hivatko-Az FV definíciójának optimumra hivatko-zó rekurzív (3.) ágánál tartunk, zó rekurzív (3.) ágánál tartunk, „készen kapja” a döntéséhez „készen kapja” a döntéséhez szükséges informá-ciót. Ezért nem szükséges informá-ciót. Ezért nem bontogatja le sem az (X–pbontogatja le sem az (X–pii,i–1), sem az ,i–1), sem az (X,i–1) részproblémákra; (X,i–1) részproblémákra;
így a megoldás alapjául szolgáló, admi-így a megoldás alapjául szolgáló, admi-nisztratív táblázat ezen elemei kitöltet-nisztratív táblázat ezen elemei kitöltet-lenek maradnak; éslenek maradnak; és
a címleteket összeszedő részben katasz-a címleteket összeszedő részben katasz-trófát okoztrófát okoz. .
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4141/57/57
33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás
A probléma megoldása:A probléma megoldása:
Az optimum kiszámításra többlet admi-Az optimum kiszámításra többlet admi-nisztrációt kell bízni: feljegyzi nisztrációt kell bízni: feljegyzi az FV-az FV-hez tartozó táblázatba hez tartozó táblázatba az általa e pil-az általa e pil-lanatban még ismert információt, hogy lanatban még ismert információt, hogy hányadik címlet szerepel a felbontás-hányadik címlet szerepel a felbontás-ban.ban.
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4242/57/57
33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás
3.2.4 3.2.4 Részproblémák megoldásának Részproblémák megoldásának kiszámításakiszámítása
A táblázatgenerálás sorrendje:A táblázatgenerálás sorrendje:A címletek szerint „alulról fölfelé” A címletek szerint „alulról fölfelé” halad-va, de az érték szerint halad-va, de az érték szerint fordítvafordítva..
A fordított irány magyarázatául:A fordított irány magyarázatául: az optimumot kiszámoló függvényhez az optimumot kiszámoló függvényhez
tar-tozó táblázatot megspórolhatjuktar-tozó táblázatot megspórolhatjuk ( (nincs nincs szükség rá a végeredmény generálásáhozszükség rá a végeredmény generálásához););
mivel csak az mivel csak az előzőelőző címlet címlet oszloposzlopára ára hivat-kozik, elegendő azt és az éppen hivat-kozik, elegendő azt és az éppen számítás alatt állót megtartani, sőtszámítás alatt állót megtartani, sőt
egyetlen oszlopegyetlen oszlop is elegendő is elegendő (lenne:-)(lenne:-), ha a , ha a kiszámítás sorrendjét megfordítjukkiszámítás sorrendjét megfordítjuk..
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4343/57/57
3 Második példázat – 3 Második példázat – optimális pénzváltásoptimális pénzváltás
3.2.5 3.2.5 A megoldás előállításaA megoldás előállítása A megoldás meghatározása most az A megoldás meghatározása most az előző-vel megegyező módon történik.előző-vel megegyező módon történik.
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4444/57/57
33 Második példázat Második példázat – optimális pénzváltás– optimális pénzváltás
az „okos” DP szokásos az „okos” DP szokásos jelzőjejelzőjeA puding próbája:A puding próbája:
Az alábbi táblázat összefoglalja a re-Az alábbi táblázat összefoglalja a re-kurzív és a memorizálós DP alkal-kurzív és a memorizálós DP alkal-mazás rekurzív hívásainak számát az mazás rekurzív hívásainak számát az {1,2,5,10,20,50,100,200,500,1000,1,{1,2,5,10,20,50,100,200,500,1000,1,2,5,10,20,50,100,200,500,1000} 2,5,10,20,50,100,200,500,1000} címletek esetén: címletek esetén:
FV + OptFV + Opt
FVFV OptOpt
E
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4545/57/57
33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás
A nem optimális, rekurzív A nem optimális, rekurzív megoldásmegoldás
Összehasonlító futás:Összehasonlító futás:
Próbáljuk ki és elemezzük!Rekurzív: Zip, exe; DP: Zip, exe; „okos” DP: Zip, exe.
Az optimális, rekurzív megoldásAz optimális, rekurzív megoldás
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4646/57/57
33 Második példázat – Második példázat – optimális pénzváltásoptimális pénzváltás
Megjegyzések:Megjegyzések: Kitöltött táblaelemek száma Kitöltött táblaelemek száma kicsivel kicsivel
többtöbb, mint a , mint a nemnem optimális optimális megoldást kereső esetében. (megoldást kereső esetében. (Mindkét Mindkét táblát figyelem-be véve valamivel több, táblát figyelem-be véve valamivel több, mint kétszerese.mint kétszerese.) )
FV rekurzív hívások száma FV rekurzív hívások száma minimálisminimális. . Az FV-hez tartozó táblázat kitöltését Az FV-hez tartozó táblázat kitöltését döntően az Opt függvény végzi. döntően az Opt függvény végzi.
A rekurzív hívások száma A rekurzív hívások száma kisebbkisebb az az optimumra optimumra nemnem törekvőénél. törekvőénél.
Sokkal Sokkal kevésbé nőkevésbé nő az össz rekurzív az össz rekurzív hívások száma az előbbinél. hívások száma az előbbinél.
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4747/57/57
44 Harmadik példázat Harmadik példázat – tükörszavak– tükörszavak
4.1 A feladat 4.1 A feladat
BemeneteBemenete:szó={b1,...,bN} szó – jelek sorozata
Kimenete:Kimenete:bj természetes szám – minimálisan ennyi jel beillesztésével tehető a szó palindrommá (tükörszóvá).
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4848/57/57
44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak
4.2 A megoldás 4.2 A megoldás 4.2.1 4.2.1 A megoldás szerkezetének A megoldás szerkezetének
tanulmányozásatanulmányozása
TSz(S): az a szöveg, amely minimális TSz(S): az a szöveg, amely minimális számú jel beillesztésével képződik számú jel beillesztésével képződik az S-ből. az S-ből.
Ilyen biztosan van: S&S’, ahol S’ az S Ilyen biztosan van: S&S’, ahol S’ az S megfordítása.megfordítása.
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 4949/57/57
Esetek:Esetek:Ha S=Ha S=, akkor TSz(S)=, akkor TSz(S)==S.=S.Ha S egy jelből áll, akkor maga is Ha S egy jelből áll, akkor maga is
tükörszó, azaz TSz(S)=S. tükörszó, azaz TSz(S)=S. Legyen S=x&R&y, ahol x, y az S első Legyen S=x&R&y, ahol x, y az S első
és utolsó jele, és R akár üres is lehet. és utolsó jele, és R akár üres is lehet. Ha x=y, akkor TSz(S)=x&TSz(R)&y. Ha x=y, akkor TSz(S)=x&TSz(R)&y.
……
44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5050/57/57
44 Harmadik példázat Harmadik példázat – tükörszavak– tükörszavak
…… Ha xHa xy, akkor TSz(S) első és utolsó y, akkor TSz(S) első és utolsó
jele vagy x vagy y.jele vagy x vagy y.Ha TSz(S)=x&U&Ha TSz(S)=x&U&xx, ekkor x-et szúr-, ekkor x-et szúr-
tunk be a végére, azaz U=TSz(R&y).tunk be a végére, azaz U=TSz(R&y).Ha TSz(S)=Ha TSz(S)=yy&U&y, ekkor y-t szúrtunk &U&y, ekkor y-t szúrtunk
be az elejére, azaz U=TSz(x&R).be az elejére, azaz U=TSz(x&R).
Vagyis U gyanánt (ami eggyel Vagyis U gyanánt (ami eggyel rövidebb S-nél) a TSz(R&y) és a rövidebb S-nél) a TSz(R&y) és a TSz(x&R) közül azt kell választani, TSz(x&R) közül azt kell választani, amely kevesebb beszúrással kapható amely kevesebb beszúrással kapható meg. meg.
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5151/57/57
44 Harmadik példázat Harmadik példázat – tükörszavak– tükörszavak
4.2.2 4.2.2 Részproblémákra és Részproblémákra és összetevők-re bontásösszetevők-re bontás
Jelölések:Jelölések:MSz(i,j) – a minimális jel-MSz(i,j) – a minimális jel-
beillesztések száma, és beillesztések száma, és
szó(i..j) – a szó szöveg i. és j. jele szó(i..j) – a szó szöveg i. és j. jele kö-zötti részekö-zötti része
szó(i):=szó(i..i) – a szó i. jele.szó(i):=szó(i..i) – a szó i. jele.
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5252/57/57
44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak
Kapcsolatok:Ha ij, akkor nincs mit tenni.Ha i<j és
szó(i)szó(i)=szó(j), akkor jel beillesztések szó(j), akkor jel beillesztések számát az MSz(i+1,j–1) számát az MSz(i+1,j–1) részprobléma határozza meg.részprobléma határozza meg.
szó(i)szó(i)szó(j), akkor az MSz(i+1,j) és szó(j), akkor az MSz(i+1,j) és az MSz(i,j–1) közül a kisebb értékűt az MSz(i,j–1) közül a kisebb értékűt kell választanunk. kell választanunk.
A kiinduló probléma e jelölésekkel: A kiinduló probléma e jelölésekkel: MSz(1,Hossz(szó)). MSz(1,Hossz(szó)).
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5353/57/57
4.2.3 4.2.3 Részproblémák Részproblémák megoldásának kifejezésemegoldásának kifejezése
44 Harmadik példázat Harmadik példázat – tükörszavak– tükörszavak
sz(j)szó(i) ji ha ,
sz(j)szó(i) ji ha ,
ji ha ,
1))-jMSz(i,j),1,Min(MSz(i1
1)-j1,MSz(i
0
:j)MSz(i,
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5454/57/57
4.2.4 4.2.4 Részproblémák megoldásának Részproblémák megoldásának kiszámításakiszámítása
A táblázat generálás sorrendje:A táblázat generálás sorrendje:
Az (i,j)-vel azonosított részprobléma az Az (i,j)-vel azonosított részprobléma az (i+1,j–1), az (i+1,j) és az (i,j–1) rész-(i+1,j–1), az (i+1,j) és az (i,j–1) rész-problémáktól függ. Tehát a problémáktól függ. Tehát a kiszámítási sorrend i-értelemben kiszámítási sorrend i-értelemben fogyófogyó, j-értelem-ben , j-értelem-ben növekvőnövekvő lehet. lehet.
Mivel a rekurzió során csak a közvetlen Mivel a rekurzió során csak a közvetlen szomszédra van szükség ezért szomszédra van szükség ezért elegendő elegendő egyetlen oszlopegyetlen oszlopot tárolni.ot tárolni.
44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5555/57/57
44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak
A kód lényegi része:A kód lényegi része:function TukorSzo(const s:string):integer; var T:array [1..MaxN] of integer; i,j,ment,menti:integer;begin T[1]:=0; for j:=2 to N do begin T[j]:=0; menti:=0; for i:=j-1 downto 1 do begin ment:=T[i] if s[i]=s[j] then T[i]:=menti else T[i]:=1+Min(T[i],T[i+1]); menti:=ment; end;//for i end;//for j TukorSzo:=T[1]end;//TukorSzo
MSz(1,1)0MSz(j,j)0
T(i)MSz(i,j)
MSz(i,j)MSz(i+1,j-1)
MSz(i,j)1+Min(MSz(i,j-1),MSz(i+1,j))
TukorSzoMsz(1,N)
MSzMSz
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5656/57/57
44 Harmadik példázat – Harmadik példázat – tükörszavaktükörszavak
4.2.5 4.2.5 A megoldás előállításaA megoldás előállítása
… … nem nagy kaland: nem nagy kaland:
a tábla (1,Hossz(szó)) eleme, a tábla (1,Hossz(szó)) eleme, amelyet az algoritmusbeli T vektor amelyet az algoritmusbeli T vektor első eleme tartalmaz.első eleme tartalmaz.
04/20/2304/20/23 Szlávi Péter: Dinamikus programozásSzlávi Péter: Dinamikus programozás 5757/57/57
55 IrodalomIrodalom
[HGy] Horváth Gyula:[HGy] Horváth Gyula:„„Tehetséggondozó Program –Tehetséggondozó Program –Dinamikus programozásDinamikus programozás”, NJSzT, 2005”, NJSzT, 2005
[RISz] Rónyai L.,Ivanyos G.,Szabó R.:[RISz] Rónyai L.,Ivanyos G.,Szabó R.:Algoritmusok, TYPOTEX, 1999Algoritmusok, TYPOTEX, 1999
[SzP] Szlávi Péter:[SzP] Szlávi Péter:„„Dinamikus programozásDinamikus programozás”, kézirat”, kézirathttp://people.inf.elte.hu/szlavi/DP/http://people.inf.elte.hu/szlavi/DP/
DinamikusProgramozas.pdf DinamikusProgramozas.pdf
[SzP2] Szlávi Péter et al.: „[SzP2] Szlávi Péter et al.: „További példák aTovábbi példák adinamikus programozáshozdinamikus programozáshoz”, kézirat”, kézirathttp://people.inf.elte.hu/szlavi/http://people.inf.elte.hu/szlavi/
PrM4felev/DinaProg/ PrM4felev/DinaProg/