Dinamikus programozás ELŐADÁS Sapientia-EMTE

Hasonló dokumentumok
Dinamikus programozás

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

INFORMATIKA javítókulcs 2016

Fibonacci számok. Dinamikus programozással

Programozási módszertan. Mohó algoritmusok

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

INFORMATIKA tétel 2019

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

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

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

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

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

2015, Diszkrét matematika

Felvételi tematika INFORMATIKA

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

A rész (30 pont) A.1. Vajon mit csinál? (5 pont) A generál(n) algoritmus egy n természetes számot dolgoz fel (0 < n < 100).

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

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

Assignment problem Hozzárendelési feladat (Szállítási feladat speciális esete)

Programozás C nyelven 6. ELŐADÁS. Sapientia EMTE

Dinamikus programozás II.

INFORMATIKA tétel 2017

Gráf-algoritmusok Legrövidebb utak

Algoritmuselmélet 2. előadás

INFORMATIKA tétel 2018

A számítástudomány alapjai. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

Amortizációs költségelemzés

1. numere.txt n (1 n 10000) n növekvő kilenc a) Pascal/C++ Például: NUMERE.TXT

Mesterséges intelligencia 3. laborgyakorlat

Általános algoritmustervezési módszerek

Approximációs algoritmusok

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

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

Branch-and-Bound. 1. Az egészértéketű programozás. a korlátozás és szétválasztás módszere Bevezető Definíció. 11.

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

Totális Unimodularitás és LP dualitás. Tapolcai János

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

2018, Diszkrét matematika

FEGYVERNEKI SÁNDOR, Valószínűség-sZÁMÍTÁs És MATEMATIKAI

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

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

BACKTRACKING Visszalépéses keresés

Rendezettminta-fa [2] [2]

Programozási segédlet

2018, Diszkre t matematika. 10. elo ada s

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

BABEŞ-BOLYAI TUDOMÁNYEGYETEM MATEMATIKA-INFORMATIKA KAR Felvételi verseny - minta Informatika írásbeli

Kupac adatszerkezet. A[i] bal fia A[2i] A[i] jobb fia A[2i + 1]

Bevezetés a programozásba I.

Ö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.

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

8. Mohó algoritmusok Egy esemény-kiválasztási probléma. Az esemény-kiválasztási probléma optimális részproblémák szerkezete

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

angolul: greedy algorithms, románul: algoritmi greedy

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Lineáris algebra gyakorlat

Kupac adatszerkezet. 1. ábra.

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

14. Mediánok és rendezett minták

Haladó rendezések. PPT 2007/2008 tavasz.

2016, Diszkrét matematika

Információs Technológia

2017/ Szegedi Tudományegyetem Informatikai Intézet

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

Algoritmusok és adatszerkezetek 2.

SZÁMÍTÓGÉPES PROBLÉMAMEGOLDÁS

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

Mátrixjátékok tiszta nyeregponttal

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

Mohó algoritmusok. Példa:

Véletlen sorozatok ellenőrzésének módszerei. dolgozat

értékel függvény: rátermettségi függvény (tness function)

Mesterséges intelligencia 2. laborgyakorlat

2018, Diszkrét matematika

LINEÁRIS PROGRAMOZÁSI FELADATOK MEGOLDÁSA SZIMPLEX MÓDSZERREL

Algoritmusok és adatszerkezetek gyakorlat 07

7. fejezet: Mutatók és tömbök

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

Pénzügyi algoritmusok

Összetett programozási tételek

Érdekes informatika feladatok

A 2007/2008 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. II. (programozás) kategória

Lineáris algebra 2. Filip Ferdinánd december 7. siva.banki.hu/jegyzetek

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

III. Gráfok. 1. Irányítatlan gráfok:

Adatbázis és szoftverfejlesztés elmélet. Programozási tételek

2018, Diszkrét matematika

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

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

PROGRAMOZÁSI TÉTELEK

1. ábra. Egy rekurzív preorder bejárás. Egy másik rekurzív preorder bejárás

Egyszerű programozási tételek

van neve lehetnek bemeneti paraméterei (argumentumai) lehet visszatérési értéke a függvényt úgy használjuk, hogy meghívjuk

Algoritmusok bonyolultsága

11. Előadás. 11. előadás Bevezetés a lineáris programozásba

Rakov(34125)= Rakov(12543)= Rakov(14532)= Rakov(54321)=-

értékel függvény: rátermettségi függvény (tness function)

Adatbázis rendszerek Gy: Algoritmusok C-ben

Programozás I. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar szeptember 10.

Átírás:

Dinamikus programozás 1 10. ELŐADÁS Sapientia-EMTE 2020-21

1801, Karácsony 1801-ben Karácsonyra, Thomas Jefferson, az Amerikai Egyesült Államok akkori elnöke levelet kapott egyik matematikus barátjától, Robert Patterson-tól, aki egy általa tökéletesnek nevezett titkosítási rendszerről számolt be. Jefferson nyilván nem tudta feltörni a tökéletes rendszert, és az ezt követő 200 évben mások sem, viszont a közelmúltban egy Lawren Smithline nevű matematikusnak, számítógépes programok segítségével, sikerült.

Dinamikus programozás

A történet Richard Bellman 1957: Bellman, Dynamic Programming 1962: Bellman, Dreyfus, Applied dynamic programming Alkalmazási területek Information theory Control theory Bioinformatics Operations research Computer science Macro economy Game theory

Milyen feladatok oldhatók meg dinamikus programozással? Lebontásukból származó különböző részfeladatok száma a bemenet méretének polinom függvénye a lebontásból származó exponenciálisan sok részfeladat közül számottevően sok azonos Optimalizálás alapelve az optimális megoldás optimális részmegoldásokból épül fel elegendő minden részfeladatnak csak az optimális megoldását meghatározni/tárolni

Egyszerűtől a bonyolult fele (1) Fibonacci számok generálása 0 1 1 2 3 5 8 13 21 0 1 2 3 4 5 6 7 8

Egyszerűtől a bonyolult fele (2) Adott n féle pénzérme, melyek értékeit a w[1 n] tömb tárolja, valamint egy S összeg. Fizessük ki az S összeget minimális pénzérme felhasználásával (bármelyikből bármennyi felhasználható). INPUT: S=11 n=3, w[1..3] = {2,3,5} OUPTUP: 11 = 3+3+5 Öss zeg Minérmeszám 0 0-1 - 2 1 2 3 1 3 4 2 2, 2 5 1 5 6 2 3, 3 7 2 2, 5 8 2 3, 5 Felhasznált érmék 9 3 2, 2, 5 10 2 5, 5 11 3 3, 3, 5

S=11, n=3, w[1..3] = {2,3,5} c +1 +1 +1 0 1 1 2 1 2 2 2 3 2 3 0 1 2 3 4 5 6 7 8 9 10 11-5 -3-2 A megoldást felépítjük, lépésről-lépésre: Megoldjuk a feladatot rendre i = 0, 1,, S összegekre Adott i-re a minimális pénzérme-számot tárolja c[i] Kurrens i-re a c[i]-t, a már rendelkezésre álló c[j]-kből (j<i) számítjuk ki Kell egy rekurzív képlet, amely ezt az építkezést matematikailag leírja i=0 esetre a minimális pénzérme-szám 0 (c[0] = 0) Az i összeg, mely j összegekből (j<i) építhető fel egy pénzérme hozzáadásával? c[i] = min{c[i-w[k]] + 1; minden k=1..n-re, ahol w[k] <= i} -5-3 -2

c 0 1 1 2 1 2 2 2 3 2 3 0 1 2 3 4 5 6 7 8 9 10 11 i-w[3] i-w[2] i-w[1] i c[0] = 0; for ( i = 1 ; i <= S ; ++i ){ c[i] = VEGTELEN; for ( k = 1 ; k <= n ; ++k ){ if ( i-w[k] >= 0 && c[i-w[k]] < c[i] ){ c[i] = c[i-w[k]]; } } ++c[i]; } cout << c[s]; c[11] = 1 + min { c[9], c[8], c[6] } c[s] csak a minimális pénzérme-számot adja meg. Hogyan határoznád meg, hogy mely pénzérmék biztosítják ezt az optimális értéket? Például: 3 + 3 + 5 = 11. És ha az is érdekel, hogy hányféleképpen lehet minimális számú pénzérmével kifizetni S-t? És melyek ezek?

Barátságos mérkőzések PÁRBAN Legyen egy n elemű természetes számsorozat (n páros). A játékosok felváltva választanak egy-egy elemet a számsor valamelyik végéről. Az nyer, aki a nagyobb összeget gyűjti össze. Meg lehet-e verni a tanárt, amennyiben hagyod, hogy ő kezdjen? 19 2 4 16 3 15 4 14 17 1 1 2 3 4 5 6 7 8 9 10

A kezdő minden lépésben, következetesen választhat páros/páratlan indexű elem között 19 2 4 16 3 15 4 14 17 1 1 2 3 4 5 6 7 8 9 10 47 48

Mennyi a maximális összeg, amit a kezdő garantáltan összeszedhet? Input: a[1..n] Cél: maximalizálni a kezdő garantált összegét A barátod is mindig jól választ! Persze az általad, mint kezdő által, diktált keretek között.

Döntési fa [1..10] Minden fordulóban 2-vel rövidül a számsor [1..8] [2..9] [3..10] [1..6] [2..7] [3..8] [4..9] [5..10] [1..4] [2..5] [3..6] [4..7] [5..8] [6..9] [7..10] [1..2] [2..3] [3..4] [4..5] [5..6] [6..7] [7..8] [8..9] [9..10]

Mennyi a maximális összeg, amit a kezdő garantáltan összeszedhet? Eredeti feladat: mi a teljes tömbre (a[1..n]) vonatkozó optimum? Általános részfeladat: mi az optimum az a[i..j], páros hosszú tömbszakaszra vonatkozóan, ha a kezdő van soron? a[i] a[i+1] a[i+2] a[j-2] a[j-1] a[j] 1 i j n

Két út áll előttem, melyiket válasszam? a[i]-t vagy a[j]-t? Az előnyösebbet! Ha én a[i]-t választom, akkor Két út áll előtted, melyiket választod? a[j] vagy a[i+1]? A számomra előnytelenebbet! a[i] a[i+1] a[i+2] a[j-2] a[j-1] a[j] 1 i j n a[i] a[i+1] a[i+2] a[j-2] a[j-1] a[j] 1 i j n c[i][j] = max{a[i] + min{c[i+1][j-1], c[i+2][j]}, }

Két út áll előttem, melyiket válasszam? a[i]-t vagy a[j]-t? Az előnyösebbet! Ha én a[j]-t választom, akkor Két út áll előtted, melyiket választod? a[i] vagy a[j-1]? A számomra előnytelenebbet! a[i] a[i+1] a[i+2] a[j-2] a[j-1] a[j] 1 i j n a[i] a[i+1] a[i+2] a[j-2] a[j-1] a[j] 1 i j n c[i][j] = max{a[i] + min{c[i+1][j-1], c[i+2][j]}, a[j] + min{c[i+1][j-1], c[i][j-2]}}

19 2 4 16 3 15 4 14 17 1 1 2 3 4 5 6(j) 7 8 9 10 19 1 2 2 +a[j] 4 (i)3 i,j-2 i,j +a[i] 16 4 i+1,j-1 3 5 i+2,j 15 6 4 7 14 8 17 9 1 10 c[i][j] = max{a[i] + min{c[i+1][j-1], c[i+2][j]}, a[j] + min{c[i+1][j-1], c[i][j-2]}}

19 2 4 16 3 15 4 14 17 1 1 2 3 4 5 6 7 8 9 10 19 1 19 +16 23 37 52 +1 65 2 2 4 +19 18 33 50 +19 4 3 16 31 45 46 16 4 16 31 46 3 5 15 29 30 15 6 15 31 4 7 14 21 14 8 17 17 9 17 1 10 c[i][j] = max{a[i] + min{c[i+1][j-1], c[i+2][j]}, a[j] + min{c[i+1][j-1], c[i][j-2]}}

Forduló 1 1 5 5 4 4 3 3 2 2 19 2 4 16 3 15 4 14 17 1 1 2 3 4 5 6 7 8 9 10 1 19 1 19 23 37 52 +1 65 1 2 2 4 18 33 50 +19 5 4 3 0 +16 16 +15 31 +14 45 +1 46 5 16 4 0 +4 16 +4 31 +4 46 +4 4 3 5 0 15 29 30 4 15 6 15 31 3 4 7 14 21 3 14 8 17 2 17 9 17 2 1 10 c[i][j] = max{a[i] + min{c[i+1][j-1], c[i+2][j]}, a[j] + min{c[i+1][j-1], c[i][j-2]}}

Döntési fa 65 [1..10] +1 +19 10 52 50 46 [1..8] [2..9] [3..10] 8 +1 37 [1..6] 33 45 46 30 [2..7] [3..8] [4..9] [5..10] +14 6 23 [1..4] 18 [2..5] 31 31 29 31 21 [3..6] [4..7] [5..8] [6..9] [7..10] 4 +15 19 4 16 16 15 15 14 17 17 [1..2] [2..3] [3..4] [4..5] [5..6] [6..7] [7..8] [8..9] [9..10] 2

Implementációs feladatok Implementált kétszemélyes játékként a páros/páratlan stratégiát, úgy hogy a gép kezd!. Implementáld a garantáltan legjobb összeg algoritmust az optimális összeg meghatározására! Implementáld rekurzívan is! Hogy oldanád meg memóriatakarékosan? Határozd meg az optimális választás-sorozatot is! Implementáld a garantáltan legjobb összeg algoritmust, mint kétszemélyes játékot (a gép kezd)

Megoldás: optimum-érték (1)... for( ; ; ){ //átlóról-átlóra for( ; ; ){ //kurrens átló mentén c[i][j] = maxi( a[i] + mini(c[i+1][j-1], c[i+2][j]), a[j] + mini(c[i+1][j-1], c[i][j-2])); } }...

Megoldás: optimum-érték (2) // a 0. átló csupa nullát tartalmaz for( k = 1 ; k < n ; k += 2 ){ //átlónként for( i = 1, j = i + k ; j <= n ; ++i, ++j ){ // átlón c[i][j] = maxi(a[i] + mini(c[i+1][j-1],c[i+2][j]), a[j] + mini(c[i+1][j-1],c[i][j-2])); } } printf("eredmeny: %i\n", c[1][n]);

Optimális játék (1) i = 1; j = n; int s1 = 0, s2 = 0; for( k = 1 ; k <= n/2 ; ++k ){ //fordulonkent kiir_aktualis_allas(a,n,i,j,s1,s2); //lep PC if ( c[i][j] == ooo ){ ooo } else{ ooo } kiir_aktualis_allas(a,n,i,j,s1,s2); //lep USER printf("he te LOSER, azaz USER, mit valasztasz, (b)al vagy (j)obb?\n"); char c = getch(); if ( c == 'b' ){ ooo } else{ ooo } } printf("eredmeny:\n"); kiir_aktualis_allas(a,n,i,j,s1,s2);

Optimális játék (2) i = 1; j = n; int s1 = 0, s2 = 0; for( k = 1 ; k <= n/2 ; ++k ){ //fordulonkent kiir_aktualis_allas(a,n,i,j,s1,s2); //lep PC if ( c[i][j] == a[i] + mini(c[i+1][j-1],c[i+2][j] ){ s1 += a[i]; ++i; } else{ ooo } kiir_aktualis_allas(a,n,i,j,s1,s2); //lep USER printf("he te LOSER, azaz USER, mit valasztasz, (b)al vagy (j)obb?\n"); char c = getch(); if ( c == 'b' ){ s2 += a[i]; ++i; } else{ ooo } } printf("eredmeny:\n"); kiir_aktualis_allas(a,n,i,j,s1,s2);

A gyorsaknak! Balanced Partition You have a set of n integers each in the range 0... K. Partition these integers into two subsets such that you minimize S1 - S2, where S1 and S2 denote the sums of the elements in each of the two subsets. https://people.cs.clemson.edu/~bcdean/ dp_practice/dp_4.swf

Stratégia Egyszerűtől bonyolult fele haladva oldjuk meg a részfeladatokat (?) Részfeladatonként egy értéket tárolunk el (tömbben) (?) optimális megoldást képviselő optimum értéket (?) Rekurzív képlet írja le, hogy a kurrens részfeladat: optimuma miként építhető fel a közvetlen fiúrészfeladatok optimumaiból (optimális építkezés: optimumokból optimálisan) (?)

Stratégia 1. Meghatározzuk a részfeladatok általános alakját. 2. Eldöntjük, hol fogjuk eltárolni az egyes részfeladatok optimális megoldásait jellemző optimum értékeket (vagy a megoldások számát). 3. Megkeressük azt a rekurzív képletet, amely matematikailag leírja, miként épül fel az általános részfeladat optimális megoldását jellemző optimum érték a részfeladatok optimum értékéből. A kurrens részfeladat optimuma mely közvetlen fiúrészfeladatok optimumaiból építhető fel, és hogyan? 4. A rekurzív képlet alapján - az egyszerűtől haladva a bonyolult fele - feltöltjük a tömböt a részfeladatok optimum értékeivel.

Virágüzlet-feladat Egy virágüzlet kirakatában van m váza (1, 2,, m sorrendben) és ezekbe úgy kell elhelyezni az 1, 2,, n virágokat (ebben a sorrendben; n m), hogy az esztétikai összhatás maximális legyen. (Az e[1..n,1..m] tömb e[i,j] cellája azt tárolja, hogy az i virág a j vázában milyen esztétikai hatást kelt; az üresen maradt vázák esztétikai hatása nulla) (Nemzetközi Informatika Olimpiász, Törökország, 1999)

Virágüzlet-feladat Példa 3 virágra és 5 vázára. Az maximális esztétikai összhatás: 53. e 1 2 3 4 5 1 7 23-5 -24 16 2 5 21-4 10 23 3-21 5-4 -20 20 1 2 3 1 2 3 4 5

Meghatározzuk a részfeladatok általános alakját Általános alak: az 1..i virágok optimális elhelyezése az 1..j vázákba. Optimum-érték: az optimális elhelyezés keltette esztétikai összhatás értéke. Optimális megoldás: az optimális elhelyezés módja. Triviális részfeladatok: i=0 (nulla virág elhelyezése bármennyi vázába); i=j (ugyanannyi a virág, mint a váza). Eredeti feladat: i=n, j=m. Lentről felfele irány: i és j növekednek.

Hol tároljuk a részfeladatok optimális megoldásait képviselő optimum értékeket? Optimum-értékek tömbje: c[0..n,0..m] 2-dimenziós tömb satírozott területe (i=1..n, j=i..m-n+i). Triviális részfeladatokat képviselő cellák: c[0,j], j=0,m-n; c[i,i], i=0..n. (világos szürke) Eredeti feladatot képviselő cella: c[n,m]. (sötét szürke) c 0 1 2 3 4 5 0 1 2 3

Meghatározunk egy általános rekurzív képletet Utolsó döntés az (i,j) feladatot illetően: (1) az i. virág a j. vázába kerül, vagy fiú-részfeladat: (i-1,j-1) (2) a j. váza üresen marad. fiú-részfeladat: (i,j-1) A képlet optimalizálási ága: c[i,j] = max{c[i-1,j-1] + e[i,j]; c[i,j-1] + 0} A képlet triviális ágai: c[0,j] = 0; c[i,i] = c[i-1,i-1] + e[i,i]

Megírjuk az iteratív algoritmust (1) c 0 1 2 3 4 5 0 0 0 0 1 7 2 28 3 24 e 1 2 3 4 5 1 7 23-5 -24 16 2 5 21-4 10 23 3-21 5-4 -20 20

c 0 1 2 3 4 5 0 0 0 0 1 7 23 2 28 3 24 c 0 1 2 3 4 5 0 0 0 0 1 7 23 23 2 28 28 33 3 24 24 53 e 1 2 3 4 5 1 7 23-5 -24 16 2 5 21-4 10 23 3-21 5-4 -20 20

Megírjuk az iteratív algoritmust (2) minden j 0 m-n végezd //triviális eset-1 c[0,j] 0 vége minden minden i 1 n végezd //triviális eset-2 c[i,i] c[i-1,i-1] + e[i,i] vége minden minden i 1 n végezd //apáról-apára minden j i+1 m-n+i végezd ha c[i-1,j-1] + e[i,j] > c[i,j-1] akkor c[i,j] c[i-1,i-1] + e[i,j] különben c[i,j] c[i,i-1] vége ha vége minden vége minden

Kiolvassuk ( fentről-lefele irányba) az optimális döntéssorozatot c 0 1 2 3 4 5 0 0 0 0 1 7 23 23 2 28 28 33 3 24 24 53

Folytatás