Dinamikus programozás II.

Hasonló dokumentumok
Partíció probléma rekurzíómemorizálással

Dinamikus programozás

Fibonacci számok. Dinamikus programozással

Dinamikus programozás. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Dinamikus programozás

Algoritmizálás, adatmodellezés tanítása 8. előadás

Algoritmusok és adatszerkezetek I. 10. előadás

A 2008/2009 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Optimalizációs stratégiák 1.

Algoritmizálás, adatmodellezés tanítása 7. előadás

Programozási módszertan. Dinamikus programozás: A leghosszabb közös részsorozat

Algoritmizálás, adatmodellezés tanítása 11. előadás. (Horváth Gyula előadása alapján)

3. Előadás. Megyesi László: Lineáris algebra, oldal. 3. előadás Lineáris egyenletrendszerek

Programozási módszertan. Dinamikus programozás: szerelőszalag ütemezése Mátrixok véges sorozatainak szorzása

A 2010/2011 tanévi Országos Középiskolai Tanulmányi Verseny második fordulójának megoldása. II. (programozás) kategória

Programozási módszertan. Mohó algoritmusok

A 2011/2012 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

A 2013/2014 tanévi Országos Középiskolai Tanulmányi Verseny második forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Dinamikus programozás - Szerelőszalag ütemezése

Hatékonyság 1. előadás

Rendezések. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar október 24.

Informatikai tehetséggondozás:

Dinamukus programozás

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Időjárási csúcsok. Bemenet. Kimenet. Példa. Korlátok. Nemes Tihamér Nemzetközi Informatikai Tanulmányi Verseny, 2-3. korcsoport

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

Adatszerkezetek II. 10. előadás

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

A 2017/2018 tanévi Országos Középiskolai Tanulmányi Verseny első fordulójának feladatai. INFORMATIKA II. (programozás) kategória

Adatszerkezetek II. 1. előadás

Dinamikus programozás vagy Oszd meg, és uralkodj!

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

Feladatmegoldási stratégiák

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

bármely másikra el lehessen jutni. A vállalat tudja, hogy tetszőlegesen adott

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny második forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Felvételi tematika INFORMATIKA

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny második fordulójának feladatai. INFORMATIKA II. (programozás) kategória

Megoldás meghatározása Ez a szakasz kitölti a c és S táblázatokat, a kiíratás S alapján egy rekurzív algoritmussal megtehető.

Visszalépéses kiválogatás

Sorozatok I. Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma)

Kombinatorikai algoritmusok. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Kombinatorikai algoritmusok

Rekurzív algoritmusok

A programozás alapjai 1 Rekurzió

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Algoritmusok és adatszerkezetek gyakorlat 03 Oszd meg és uralkodj. Nagy

Általános algoritmustervezési módszerek

A félév során előkerülő témakörök

Sorozatok és Sorozatok és / 18

Gyakorlatok. P (n) = P (n 1) + 2P (n 2) + P (n 3) ha n 4, (utolsó lépésként l, hl, u, hu-t léphetünk).

Algoritmuselmélet 2. előadás

Közismereti informatika I. 4. előadás

Polinomok, Lagrange interpoláció

A 2013/2014 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

A 2012/2013 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Dinamikus programozás

2010. október 12. Dr. Vincze Szilvia

Algoritmusokfelülnézetből. 1. ELŐADÁS Sapientia-EMTE

A Szállítási feladat megoldása

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Programozás alapjai. 6. gyakorlat Futásidő, rekurzió, feladatmegoldás

29. Visszalépéses keresés 1.

2. Visszalépéses keresés

Hálózati Folyamok Alkalmazásai. Mályusz Levente BME Építéskivitelezési és Szervezési Tanszék

Programozási módszertan. Dinamikus programozás: Nyomtatási feladat A leghosszabb közös részsorozat

Operációkutatás. Vaik Zsuzsanna. Budapest október 10. First Prev Next Last Go Back Full Screen Close Quit

2017/ Szegedi Tudományegyetem Informatikai Intézet

Multihalmaz, intervallumhalmaz

Mohó stratégia. Feladat: Megoldás:

Algoritmusok és adatszerkezetek I. 4. előadás

Problémamegoldási stratégiák

i=1 i+3n = n(2n+1). j=1 2 j < 4 2 i+2 16 k, azaz az algoritmus valóban konstans versenyképes.

Algoritmusok és adatszerkezetek gyakorlat 07

Gauss-Seidel iteráció

A 2014/2015 tanévi Országos Középiskolai Tanulmányi Verseny második forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Szélsőérték-számítás

A 2012/2013 tanévi Országos Középiskolai Tanulmányi Verseny második fordulójának megoldása. informatika II. (programozás) kategória

I. VEKTOROK, MÁTRIXOK

2. forduló. MEGOLDÁSOK Pontszerző Matematikaverseny 2014/2015 tanév. 1. Számkeresztrejtvény:

A 2015/2016 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Mátrixok 2017 Mátrixok

Algoritmusok és adatszerkezetek I. 1. előadás

Informatikai tehetséggondozás:

60 db Várlap A várlapkák ház. udvar speciális lapkák. osztja az utat. különböző részre az útvonalat) Bástya 2 pontozó mező is van egy téglalapon

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Programozási módszertan. Függvények rekurzív megadása "Oszd meg és uralkodj" elv, helyettesítő módszer, rekurziós fa módszer, mester módszer

NULLADIK MATEMATIKA ZÁRTHELYI

Programozási alapismeretek 11. előadás

Feladatok matematikából 3. rész

Kompetencia Alapú Levelező Matematika Verseny

Az informatika kulcsfogalmai

Feladatok megoldásokkal az ötödik gyakorlathoz (Taylor polinom, szöveges szélsőérték problémák)

A 2013/2014 tanévi Országos Középiskolai Tanulmányi Verseny döntő forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Gyakorló feladatok ZH-ra

Rendezések. Összehasonlító rendezések

1. Jelölje meg az összes igaz állítást a következők közül!

= x + 1. (x 3)(x + 3) D f = R, lim. x 2. = lim. x 4

INFORMATIKA javítókulcs 2016

Átírás:

Dinamikus programozás II.

Dinamikus programozás stratégiája A dinamikus programozás stratégiája 1. Az [optimális] megoldás szerkezetének tanulmányozása. 2. Részproblémákra és összetevőkre bontás úgy, hogy: az összetevőktől való függés körmentes legyen; minden részprobléma [optimális] megoldása kifejezhető legyen (rekurzívan) az összetevők [optimális] megoldásaival. 3. Részproblémák [optimális] megoldásának kifejezése (rekurzívan) az összetevők [optimális] megoldásaiból. 2/33

Dinamikus programozás stratégiája 4. Részproblémák [optimális] megoldásának kiszámítása alulról-felfelé haladva: A részproblémák kiszámítási sorrendjének meghatározása. Olyan sorba kell rakni a részproblémákat, hogy minden p részprobléma minden összetevője (ha van) előbb szerepeljen a felsorolásban, mint p. A részproblémák kiszámítása alulról-felfelé haladva, azaz táblázatkitöltéssel. 5. Egy [optimális] megoldás előállítása a 4. lépésben kiszámított (és tárolt) információkból. 3/33

leghosszabb közös rész Feladat: Adjuk meg két sorozat X=(x 1,x 2, x n ) és Y=(y 1,y 2, y m ) leghosszabb közös részsorozatát! Egy akkor részsorozata egy másiknak, ha abból elemek elhagyásával megkapható. Megoldás: Jelölje XX i =(x 1,x 2, x i ) az X, YY j =(y 1,y 2, y j ) pedig az Y sorozat egy-egy prefixét! Legyen Z=(z 1,z 2, z k ) egy megoldása a feladatnak! 4/33

leghosszabb közös rész A megoldás elemzése: Ha x n =y m, akkor z k =x n =y m, és ZZ k-1 az XX n-1 és YY m-1 leghosszabb közös részsorozata. Ha x n y m, akkor Z az XX n-1 és Y vagy az X és YY m-1 leghosszabb közös részsorozata. Az XX i és YY j leghosszabb közös részsorozatának hossza: h i, j hi 1, j 1 1 max hi 1, j, hi, j 1 0 ha ha egyébként x i i 0 y j vagy j 0 5/33

leghosszabb közös rész A rekurzív algoritmus: Hossz(i,j): Ha i=0 vagy j=0 akkor Hossz:=0 különben ha X(i)=Y(j) akkor Hossz:=Hossz(i-1,j-1)+1 különben Hossz:=max(Hossz(i-1,j),Hossz(i,j-1)) Függvény vége. 6/33

leghosszabb közös rész A jó megoldás rekurzió memorizálással: Hossz(i,j): Ha H(i,j)=-1 akkor Ha i=0 vagy j=0 akkor H(i,j):=0 különben ha X(i)=Y(j) akkor H(i,j):=Hossz(i-1,j-1)+1 különben H(i,j):=max(Hossz(i-1,j),Hossz(i,j-1)) Elágazás vége Hossz:=H(i,j) Függvény vége. Azaz, amit már egyszer kiszámoltunk, azt tároljuk és ne számoljuk ki újra! A H mátrixot kezdetben -1 értékekkel töltjük ki! 7/33

toronyépítés Feladat: Adott M 1,M 2, M n méretű kockákból (amelyek súly szerint csökkenő sorrendbe vannak rendezve) építsünk maximális magasságú stabil tornyot! A stabil toronyban felfelé haladva a méret és a súly is csökken. Megoldás: Tegyük fel, hogy M i ; M i ;...; M i i... i megoldás! 1 2 k 1 k Ekkor n=i k-1 -re M is megoldás, azaz i ; M ;...; 1... 1 i M 2 i i i k1 k1 az adott részproblémának megoldása a megoldás megfelelő részlete. 8/33

toronyépítés Tehát a feladat a legmagasabb olyan torony magasságának kiszámolása, ahol az i. kocka van legfelül: Kocka i Kérdés: Mi változik, ha a legtöbb kockából álló torony kockaszámát kérdeznénk? 1 2 Kocka Kocka max... Mi M M i i ha ha egyébként M M i i M M 1 2 9/33

toronyépítés A rekurzív megoldás: Kocka(i): K:=M(i) Ciklus j=1-től i-1-ig Ha M(i) M(j) akkor Ha Kocka(j)+M(i)>K akkor K:=Kocka(j)+M(i) Ciklus vége Kocka:=K Függvény vége. A rengeteg rekurzív hívás miatt nagyon lassú. Látható azonban, hogy Kocka(i) kiszámításához csak a korábbiakra van szükség. 10/33

toronyépítés Toronyépítés: Kocka(1):=M(1) Ciklus i=2-től N-ig K:=M(i) Ciklus j=1-től i-1-ig Ha M(i) M(j) akkor Ha Kocka(j)+M(i)>K akkor K:=Kocka(j)+M(i) Ciklus vége Kocka(i):=K Ciklus vége Eljárás vége. A táblázatkitöltős megoldás. 11/33

toronyépítés Ezzel még nincs kész a megoldás, csak azt tudjuk minden i-re, hogy mekkora a legmagasabb torony, amikor az i-edik kocka van felül. A megoldás ezen számok maximuma. Ha bevezetnénk egy N+1., 0 méretű kockát, akkor a megoldás értéke Kocka(N+1) lenne. Ha a tornyot fel is kellene építeni, akkor még azt is tárolni kell, hogy melyik kockát melyikre kell rátenni. 12/33

toronyépítés Toronyépítés: Kocka(1):=M(1); Mire(1):=0; M(N+1):=0 Ciklus i=2-től N+1-ig K:=M(i); Mire(i):=0 Ciklus j=1-től i-1-ig Ha M(i) M(j) akkor Ha Kocka(j)+M(i)>K akkor K:=Kocka(j)+M(i); Mire(i):=j Ciklus vége Kocka(i):=K Ciklus vége Eljárás vége. 13/33

toronyépítés Torony: Toronyépítés Toronykiírás(N+1) Eljárás vége. Toronykiírás(i): Ha Mire(i)>0 akkor Toronykiírás(Mire(i)) Ki: Mire(i) Eljárás vége. 14/33

kemence Feladat: 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ő! Megoldás: Tegyük fel, hogy ((1,,i 1 ),, (i m-1 +1,,N)) a megoldás! Ekkor az N. tárgy vagy önmagában kerül a kemencébe, vagy legfeljebb K-1 előző tárggyal együtt. 15/33

kemence Számítsuk ki az első i tárgy kiégetéséhez szükséges időt (Idő(0)=0)! Idő i min Idő Idő i 1 Égeti j 1 max Éget j.. i ahol i j 1 K 16/33

kemence Kemence: Idő(0):=0 Ciklus i=1-től N-ig H:=Idő(i-1)+Éget(i); max:=éget(i); G:=i j:=i-1 Ciklus amíg j>0 és i+j-1 K Ha max<éget(j) akkor max:=éget(j) Ha Idő(j-1)+max<H akkor H:=Idő(j-1)+max; G:=j j:=j-1 Ciklus vége Idő(i):=H; Db(i):=i-G+1 Ciklus vége Eljárás vége. Db(i) az i. tárggyal hány tárgyat égetünk együtt? 17/33

kemence Kemence_megoldás: Kemence Kemence_eredmény(N) Eljárás vége. Kemence_eredmény(i): Ha i-db(i)>0 akkor Kemence_eredmény(i-Db(i)) Ki: Idő(i),i-Db(i)+1 Eljárás vége. 18/33

kemence Feladat: 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 S összsúlyú tárgy tehető. 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/33

kemence Megoldás: Tegyük fel, hogy ((1,,i 1 ),, (i m-1 +1,,N)) a megoldás! Ekkor az N. tárgy vagy önmagában kerül a kemencébe, vagy legfeljebb S súlyú előző tárggyal együtt. Számítsuk ki az első i tárgy kiégetéséhez szükséges időt (Idő(0)=0)! Idő i min Idő Idői 1 Égeti j 1 max Éget j.. i ahol Súly j.. i S 20/33

kemence Kemence: Idő(0):=0 Ciklus i=1-től N-ig H:=Idő(i-1)+Éget(i); max:=éget(i); G:=i j:=i-1; Su:=Súly(i) Ciklus amíg j>0 és Su+Súly(j) S Ha max<éget(j) akkor max:=éget(j) Su:=Su+Súly(j) Ha Idő(j-1)+max<H akkor H:=Idő(j-1)+max; G:=j j:=j-1 Ciklus vége Idő(i):=H; Db(i):=i-G+1 Ciklus vége Eljárás vége. 21/33

kincs Feladat: Egy N*M-es téglalap alakú területen egy járművel szedhetjük össze az elrejtett kincseket, a bal felső sarokból a jobb alsó felé haladva. A terep jobbra és lefelé lejt, azaz a jármű csak jobbra és lefelé haladhat. Add meg, hogy maximum hány kincset gyűjthet be és ehhez merre kell mennie!! A megoldás elemzése: Ha a megoldás egy L 1, L 2,,L j,, L k úton érhető el, akkor az L 1, L 2,,L j egy olyan út, amin elért pontban az odáig begyűjthető legtöbb kincset kapjuk. Kezdőpozíció: (1,1) Végpozíció: (N,M) 22/33

kincs Megoldás: Számítsuk ki minden lehetséges mezőre, hogy addig eljutva mennyi a maximálisan begyűjthető kincsek száma! Gy i, j max Gyi 1, j,gyi, j1 ha Kincs i, j max Gyi 1, j,gyi, j1 1 ha Kincs i, j 1 ha i 0 "" " " vagy j 0 * * * * * * * * * 23/33

kincs Kincsek: Gy(0,2..M):=-1; Gy(2..N,0):=-1 Gy(0,1):=0; Gy(1,0):=0 Ciklus i=1-től N-ig Ciklus j=1-től M-ig Ha Kincs(i,j)= * akkor k:=1 különben k:=0 Ha Gy(i,j-1)>Gy(i-1,j) akkor Gy(i,j):=Gy(i,j-1)+k különben Gy(i,j):=Gy(i-1,j)+k Ciklus vége Ciklus vége Eljárás vége. A megoldás: Gy(N,M) 24/33

kincs Ha a bejárt útra is szükségünk lenne, akkor a Gy mátrix alapján az út visszakövethető. Azt kell figyelnünk, hogy minden helyre a nagyobb értékű szomszédból kellett jönnünk. Útkiírás(i,j): Ha i 1 vagy j 1 akkor Ha Gy(i,j-1)>Gy(i-1,j) akkor Útkiírás(i,j-1); Ki: J különben Útkiírás(i-1,j); Ki: L Eljárás vége. A megoldás a számítások után: Útkiírás(N,M) 25/33

kincs Feladat: Egy N*M-es téglalap alakú területen egy járművel szedhetjük össze az elrejtett kincseket. A terep balról jobbra lejt, azaz a jármű csak jobbra, felfelé és lefelé haladhat. Add meg, hogy maximum hány kincset gyűjthet be!! Minden mezőre csak egyszer léphetünk! A megoldás elemzése: Ha a megoldás egy L 1, L 2,,L j,, L k úton érhető el, akkor az L 1, L 2,,L j egy olyan út, amin elért pontban az odáig begyűjthető legtöbb kincset kapjuk, de ide jöhetünk lentről is. Kezdőpozíció: (1,1) Végpozíció: (N,M) 26/33

kincs Megoldás: Számítsuk ki minden lehetséges mezőre, hogy addig eljutva mennyi a maximálisan begyűjthető kincsek száma, ha lentről, illetve, ha fentről léptünk be! j max Li 1, j,li, j1,fi, j1 ha Kincs i, j max Li 1, j, Li, j1, Fi, j1 1 ha Kincs i, j L i, 1 ha i N 1 j max Fi 1, j,li, j1,fi, j1 ha Kincs i, j max Fi 1, j,li, j1,fi, j1 1 ha Kincs i, j F i, 1 ha i 0 "" " " "" " " vagy vagy j 0 j 0 27/33

kincs Kincsek: L(N+1,2..M):=-1; L(2..N,0):=-1; L(N+1,1):=0; L(1,0):=0 F(0,2..M):=-1; F(2..N,0):=-1; F(0,1):=0; F(1,0):=0 Ciklus j=1-től M-ig Ciklus i=1-től N-ig Ha Kincs(i,j)= * akkor k:=1 különben k:=0 F(i,j):=max(F(i-1,j),L(i,j-1),F(i,j-1))+k Ciklus vége Ciklus i=n-től 1-ig -1-esével Ha Kincs(i,j)= * akkor k:=1 különben k:=0 L(i,j):=max(L(i+1,j),L(i,j-1),F(i,j-1))+k Ciklus vége Ciklus vége Eljárás vége. A megoldás: F(N,M) 28/33

kincs Feladat: Egy N*M-es téglalap alakú területen egy járművel szedhetjük össze az elrejtett kincseket. A terep jobbra és lefelé lejt, azaz a jármű csak jobbra és lefelé haladhat. Bizonyos helyeken akadályok vannak, ahova nem léphet! Add meg, hogy maximum hány kincset gyűjthet be!! A megoldás elemzése: Ha a megoldás egy L 1, L 2,,L j,, L k úton érhető el, akkor az L 1, L 2,,L j egy olyan út, amin elért pontban az odáig begyűjthető legtöbb kincset kapjuk. Kezdőpozíció: (1,1) Végpozíció: (N,M) 29/33

kincs Megoldás: Számítsuk ki minden lehetséges mezőre, hogy addig eljutva mennyi a maximálisan begyűjthető kincsek száma! Gy i, j max max 1 ha N M ha Kincs i, j Gyi 1, j,gyi, j1 ha Kincs i, j Gyi 1, j,gyi, j1 1 ha Kincs i, j i 0 " " "" " " vagy j 0 * * * + + * * + * + + * * * * + 30/33

kincs Kincsek: Gy(0,2..M):=-1; Gy(2..N,0):=-1 Gy(0,1):=0; Gy(1,0):=0 Ciklus i=1-től N-ig Ciklus j=1-től M-ig Ha Kincs(i,j)= * akkor k:=1 különben k:=0 Ha Kincs(i,j)= + akkor Gy(i,j):=-N*M különben ha Gy(i,j-1)>Gy(i-1,j) akkor Gy(i,j):=Gy(i,j-1)+k különben Gy(i,j):=Gy(i-1,j)+k Ciklus vége Ciklus vége Eljárás vége. A megoldás: Gy(N,M) 31/33

Dinamikus programozás stratégiája A dinamikus programozás stratégiája 1. Az [optimális] megoldás szerkezetének tanulmányozása. 2. Részproblémákra és összetevőkre bontás úgy, hogy: az összetevőktől való függés körmentes legyen; minden részprobléma [optimális] megoldása kifejezhető legyen (rekurzívan) az összetevők [optimális] megoldásaival. 3. Részproblémák [optimális] megoldásának kifejezése (rekurzívan) az összetevők [optimális] megoldásaiból. 32/33

Dinamikus programozás stratégiája 4. Részproblémák [optimális] megoldásának kiszámítása alulról-felfelé haladva: A részproblémák kiszámítási sorrendjének meghatározása. Olyan sorba kell rakni a részproblémákat, hogy minden p részprobléma minden összetevője (ha van) előbb szerepeljen a felsorolásban, mint p. A részproblémák kiszámítása alulról-felfelé haladva, azaz táblázatkitöltéssel. 5. Egy [optimális] megoldás előállítása a 4. lépésben kiszámított (és tárolt) információkból. 33/33

Dinamikus programozás II.