Dynamické programování

Podobné dokumenty
Dynamické programování

Dynamické programování. Optimální binární vyhledávací strom

R zné algoritmy mají r znou složitost

Dynamic programming. Optimal binary search tree

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Návrh Designu: Radek Mařík

Dynamické programování

Složitost algoritmů. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Binární vyhledávací stromy pokročilé partie

Binární soubory (datové, typované)

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Stromy, haldy, prioritní fronty

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

5. Dynamické programování

Prohledávání do šířky = algoritmus vlny

Dynamické datové struktury III.

Základní datové struktury III: Stromy, haldy

Algoritmy I, složitost

5 Rekurze a zásobník. Rekurzivní volání metody

4. Trojúhelníkový rozklad p. 1/20

12. Globální metody MI-PAA

Datové struktury 2: Rozptylovací tabulky

Dynamické programování

Algoritmy a datové struktury

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Dynamické programování UIN009 Efektivní algoritmy 1

NPRG030 Programování I, 2018/19 1 / :03:07

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

f(x,y) = max ( f(x 1, y 1)+ f(x 1,y) ) + f(x,y 1) +1 jinak f(x,y,z) = f(x 1, y 1, z 1)+ f(x 1,y,z) + f(x,y 1,z) + f(x,y,z 1)+1 jinak

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

a) b) c) Radek Mařík

Lineární algebra : Násobení matic a inverzní matice

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Rekurzivní algoritmy

C# konzole Podíl dvou čísel, podmínka IF

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Časová a prostorová složitost algoritmů

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno

Základy algoritmizace a programování

Lineární algebra : Násobení matic a inverzní matice

Základy algoritmizace. Pattern matching


ALGORITMY A DATOVÉ STRUKTURY

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Dynamické datové struktury IV.

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Dynamicky vázané metody. Pozdní vazba, virtuální metody

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Doba běhu daného algoritmu/programu. 1. Který fragment programu z následujících dvou proběhne rychleji?

Dynamické programování

63. ročník Matematické olympiády 2013/2014

Aplikovaná numerická matematika - ANM

Grafové algoritmy. Programovací techniky

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Cílem této kapitoly je uvedení pojmu matice a jejich speciálních typů. Čtenář se seznámí se základními vlastnostmi matic a s operacemi s maticemi

Digitální učební materiál

NP-ÚPLNÉ PROBLÉMY. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

IB111 Úvod do programování skrze Python

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

TOKY V SÍTÍCH II. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:

VYBRANÉ PARTIE Z NUMERICKÉ MATEMATIKY

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Základy řazení. Karel Richta a kol.

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Příklad 1/23. Pro rostoucí spojité fukce f(x), g(x) platí f(x) Ω(g(x)). Z toho plyne, že: a) f(x) Ο(g(x)) b) f(x) Θ(g(x)) d) g(x) Ω(f(x))

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

Paralelní grafové algoritmy

Různé algoritmy mají různou složitost

Grafové algoritmy. Programovací techniky

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

2.6. VLASTNÍ ČÍSLA A VEKTORY MATIC

Rozklad problému na podproblémy

Prioritní fronta, halda

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Algoritmy výpočetní geometrie

Obor: Informatika Únor 2006 Okruh: Základy matematiky Otázka: 1. Jméno: Bodů:...

Stromy. Jan Hnilica Počítačové modelování 14

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

68. ročník Matematické olympiády 2018/2019

Algoritmus pro generování normálních magických čtverců

Úvod do teorie grafů

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

10. Složitost a výkon

Struktura programu v době běhu

Kombinatorika, výpočty

Úvod do problematiky

3. Třídy P a NP. Model výpočtu: Turingův stroj Rozhodovací problémy: třídy P a NP Optimalizační problémy: třídy PO a NPO MI-PAA

Obsah prezentace. Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Transkript:

Dynamické programování Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol., 207 Datové struktury a algoritmy, B6B36DSA 05/207, Lekce 2 https://moodle.fel.cvut.cz/course/view.php?id=238 Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, /68

Myšlenka dynamického programování Definice funkce f(x,y) = (x = 0) (y = 0) 2 f(x, y-) + f(x-,y) (x > 0) && (y > 0) Otázka f(0,0) =? Program int f(int x, int y) { if ( (x == 0) (y == 0)) return ; return (2* f(x,y-) + f(x-,y)); } print( f(0,0) ); Odpověď f(0,0) = 27 574 07 Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 2/68

Myšlenka dynamického programování Jednoduchá analýza int count = 0; public static int f(int x, int y) { count++; if ( (x == 0) (y == 0)) return ; return (2* f(x, y-) + f(x-,y)); } xyz = f(0,0); print(count); Výsledek analýzy count = 369 5 Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 3/68

Myšlenka dynamického programování Detailnější analýza strom rekurzivního volání f(0,0) f(0,9) f(9,0) f(0,8) f(9,9) f(9,9) f(8,0) f(0,7) f(9,8) f(9,8) f(8,9) f(9,8) f(8,9) f(8,9) f(7,0) f(0,6) 9,7 9,7 8,8 9,7 8,8 8,8 7,9 9,7 8,8 8,8 7,9 8,8 7,9 7,9 f(6,0) Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 4/68

Myšlenka dynamického programování Detailnější analýza pokračuje efektivita rekurzivního volání f(0,0) počet: volání hodnot f(9,0) 2 2 f(9,9) f(9,9) f(8,0) 4 3 f(9,8) f(8,9) f(9,8) f(8,9) f(8,9) f(7,0) 8 4 9,7 8,8 8,8 7,9 9,7 8,8 8,8 7,9 8,8 7,9 7,9 f(6,0) 6 5 52 0 Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 5/68

Myšlenka dynamického programování f(x,y) = (x = 0) (y = 0) 2 f(x, y-) + f(x-,y) (x > 0) && (y > 0) 0 2 3 9 0 x 0 f(0,0) f(,0) f(2,0) f(0,0) f(0,) f(,) 2 f(0,2) 3 f(x,y-) 2 f(x-,y) f(x,y) f(0,8) 9 f(9,9) f(0,9) 0 f(0,0) f(8,0) f(9,0) f(0,0) y Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 6/68

Myšlenka dynamického programování f(x,y) = (x = 0) (y = 0) 2 f(x, y-) + f(x-,y) (x > 0) && (y > 0) 0 2 3 4 9 0 x 0 3 5 7 9 2 7 7 3 3 5 49 4 3 f(x,y-) 2 f(x-,y) f(x,y) 8085505 9 6807935 32978945 0 28000257 66627 2757407 y Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 7/68

Myšlenka dynamického programování Všechny hodnoty se předpočítají static int dynarr [N+][N+]; void filldynarr() { int xy, x, y; for (xy = 0; xy <= N; xy++) dynarr[0][xy] = dynarr[xy][0] = ; } for (y = ; y <= N; y++) for (x = ; x <= N; x++) dynarr[y][x] = 2*dynArr[y-][x] + dynarr[y][x-]; Volání funkce int f(int x,int y) { return dynarr[y][x]; } Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 8/68

Rozděl-a-panuj vs. dynamické programování Metoda rozděl-a-panuj je vhodná pro řešení úloh, které lze rozdělit na nezávislé podúlohy: Rozděl úlohu na nezávislé podúlohy. Rekurzivně vyřeš podúlohy. Zkombinuj řešení podúloh do celkového výsledku úlohy. Dynamické programování (DP) je vhodné pro řešení úloh, ve kterých se podúlohy překrývají, t.j., řeší se stejné podúlohy. Pro takové úlohy není metoda rozděl-a-panuj vhodná, protože sdílené podúlohy se opakovaně (redundantně) řeší znovu a znovu, což muže vést na řádově vyšší složitost. Metody DP si hodnoty dříve vyřešených podúloh zapamatují a při jejich znovuobjevení je využijí. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 9/68

Význam termínu DP Termín programování v sousloví dynamické programování nemá standardní význam vytváření počítačového kódu. Je odvozen z termínu matematické programování, což je synonymum pro optimalizaci. V této interpretaci, slovo program znamená optimální či přijatelný plán (rozpis, rozvrh) pro provedení nějaké množiny souvisejících úkonů. Programování v tomto smyslu tedy znamená metodu nalezení takového plánu či rozvrhu akcí. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 0/68

Dynamické programování pro řešení optimalizačních úloh Definice optimalizační úlohy: Z více možných řešení hledáme řešení s optimální cenou (maximální či minimální hodnotou). Vytvoření DP algoritmu pro řešení dané optimalizační úlohy se skládá ze 4 kroků: Charakterizuj strukturu optimálního řešení. Rekurzivně definuj hodnotu optimálního řešení. Vypočítej efektivně hodnotu optimálního řešení: metodou shora dolů, metodou zdola nahoru. Zrekonstruuj strukturu optimálního řešení z vypočtených hodnot. Poslední bod odpadá, pokud stačí pouze cena (hodnota) optimálního řešení. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, /68

Definice: Příklad: Řetězové násobení matic Je dána posloupnost matic A,A 2,...,A n, matice A i má rozměry d i d i. Řetězové násobení matic (ŘNM) je úkol vypočítat součin A = A A 2 A n s minimální aritmetickou složitostí (= cenou řešení). Jinými slovy, úkolem je najít takové uzávorkování pořadí násobení matic, které vede na vynásobení s nejmenším počtem aritmetických operací. Předpokládáme klasické násobení matic řádky krát sloupce. Složitost součinu A i A i+ aproximujeme výrazem d i d i d i+ (zanedbáváme konstanty a nižší členy). Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 2/68

Vlastnosti ŘNM Poznámky: Násobení matic je asociativní, proto jakékoli uzávorkování dá správný výsledek A. Různé pořadí násobení má dramatický vliv na aritmetickou složitost výpočtu. Přitom kombinatorická složitost ŘNM je exponenciální, takže řešení hrubou silou, zkoušením všech možností, není myslitelná. Příklad: Uvažujme n = 3 a d 0 = 5, d = 50, d 2 = 0 a d 3 = 30. Pak uzávorkování (A A2) A3 má aritmetickou složitost 5 50 0 + 5 0 30 = 2500 + 500 = 4000, zatímco: uzávorkování A (A2 A3) má složitost 50 0 30 + 5 50 30 = 5000 + 7500 = 22500!!! Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 3/68

Počet různých uzávorkování Označme Z(n) počet všech různých způsobů, jak uzávorkovat součin A A 2 A n. Posloupnost matic můžeme rozdělit na dvě části hranicí mezi A k a A k+ pro libovolné k =, 2,..., n a pak uzávorkovat rekurzívně a nezávisle na sobě obě vzniklé podposloupnosti A,...,A k a A k+,...,a n. Proto platí rekurentní vztah: Řešením jsou tzv. Catalanova čísla: Z(n) = C(n ): Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 4/68

Příklady použití Catalanových čísel Počet kořenových binárních stromů s n listy je C(n-). Počet korektních uzávorkování 2n závorek je C(n). ((())) ()(()) ()()() (())() (()()) Počet způsobů, jak se v mřížce n n dostat z levého dolního do pravého horního rohu, aniž bychom překročili diagonálu nebo se vraceli, je C(n). Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 5/68

První krok DP: Charakterizování optimálního závorkování Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 6/68

Druhý krok DP: Rekurzivní definice ceny optimálního závorkování Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 7/68

Třetí krok DP: Algoritmus výpočtu ceny optimálního závorkování Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 8/68

Strom rekurzivních volání RECRNM Důvod exponenciální složitosti je podobný jako u rekurzivního výpočtu Fibonacciho čísel. Celkový počet hodnot m[*,* ], které je třeba vypočítat pro zjištění hodnoty m[, n], je pouze počet všech dvojic i, j takových, že i j n, což je Dochází však masivně k opakovanému výpočtu stejných hodnot, viz příklad stromu rekurzivních volání RECRNM(, 4). Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 9/68

Časová složitost RECRNM(d,, n) Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 20/68

Třetí krok DP algoritmu: Efektivní varianta. Nerekurzivní algoritmus výpočtu ceny optim. závorkování zdola nahoru. Předpoklady: Vstupem je pole d[0,..., n] rozměrů matic. Výstupem jsou 2 pole: m[,..., n,,..., n], kam se ukládají ceny optimálního závorkování pro výpočet A i...j, h[... n, 2... n], kam se ukládají příslušné hodnoty hranic optimálního závorkování. Princip: Systematické zaplňování tabulky zdola nahoru pro všechny dvojice i, j, kde i j n ( hodnot). Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 2/68

Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 22/68

Příklad běhu BOTTOMUPRNM(6, d,m, h) Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 23/68

Příklad běhu BOTTOMUPRNM(6, d,m, h) Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 24/68

Příklad běhu BOTTOMUPRNM(6, d,m, h) Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 25/68

Příklad běhu BOTTOMUPRNM(6, d,m, h) Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 26/68

Příklad běhu BOTTOMUPRNM(6, d,m, h) Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 27/68

Třetí krok DP algoritmu: Varianta 2 Rekurzivní algoritmus (shora dolu) výpočtu ceny optimálního závorkování s tabelací Princip tabelace (anglicky memoization): Algoritmus také vytváří tabulku s hodnotami řešení podúloh. Každá položka tabulky je také inicializována speciální hodnotou Neurceno. Řídící struktura pro zaplňování však není záplavové plnění zdola nahoru jako ve variantě, ale pořadí vyvolávané rekurzívním algoritmem. První rekurzívně vyvolané řešení dané podúlohy provede výpočet a výsledek uloží do příslušného místa v tabulce. Následné opakované volání řešení téže podúlohy pouze přečte tuto hodnotu z tabulky. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 28/68

Rekurzivní algoritmus s tabelací Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 29/68

Strom rekurzivních volání MEMRECRNM Zakroužkované uzly stromu rekurzivních volání se nepočítají, ale pouze načtou z tabulky. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 30/68

Srovnání MEMRECRNM a BOTTOMUPRNM Lemma: Oba algoritmy mají složitost O(n 3 ). Srovnání: Algoritmus MEMRECRNM je svojí podstatou metoda shora dolů, kdežto BOTTOMUPRNM je metoda zdola nahoru. Pokud logika výpočtu vyžaduje, aby každá podúloha byla řešena aspoň jednou, pak BOTTOMUPRNM je rychlejší o multiplikativní konstantu. Pravidelnost přístupu do tabulky pak uspoří čas i díky menším výpadkům skrytých pamětí a efektivnějším tokům dat mezi pamětí a procesorem. Pokud rekurzivní sestup umožní, že některé podúlohy se vůbec nevyvolají, pak může být rychlejší MEMRECRNM. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 3/68

Čtvrtý krok DP algoritmu: Konstrukce optimálního řešení úlohy ŘNM Tabulka h[... n, 2... n] obsahuje hodnoty hranic pro optimální závorkování při ŘNM. Díky Lemmatu o možném uzávorkování je konstrukce optimálního řešení triviální - rekurzivním sestupem. Na nejvyšší úrovni to je h[, n]: Nejprve rekurzívně optimálně vypočteme A A h[,n], pak A h[,n]+ A n a výsledné matice nakonec vynásobíme. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 32/68

Čtvrtý krok DP algoritmu: Konstrukce optimálního řešení úlohy ŘNM Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 33/68

DYNAMICKÉ PROGRAMOVÁNÍ: OPTIMÁLNÍ BINÁRNÍ VYHLEDÁVACÍ STROM Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 34/68

Optimální binární vyhledávací strom Vyvážený, ale ne optimální 0.0 Dana Hugo 0.04 Lea 0.09 0.08 Ben Fred 0.05 0.05 Jack Nick 0.03 Ann Cole Edna Gene Irma Ken Mark Orrie 0.03 0.2 0.04 0.22 0.06 0.5 0.02 0.0 Klíč Pravděpodobnost dotazu Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 35/68

Optimální binární vyhledávací strom Cena jednotlivých uzlů v BVS cena uzlu = pravděpodobnost hloubka Hugo 0.04 0.04 = 0.04 0.0 Dana 2 0.0 2 = 0.02 Fred 0.05 3 0.05 3 = 0.5 Gene 0.22 hloubka 4 0.22 4 = 0.88 cena uzlu = průměrný počet testů na nalezení uzlu při jednom dotazu (Find) Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 36/68

Cena vyváženého stromu klíč pravděp. p k hloubka d k p k d k Ann Ben Cole Dana Edna Fred Gene Hugo Irma Jack Ken Lea 0.03 0.08 0.2 0.0 0.04 0.05 0.22 0.04 0.06 0.05 0.5 0.09 4 3 4 2 4 3 4 4 3 4 2 0.03 4 = 0.2 0.08 3 = 0.24 0.2 4 = 0.48 0.0 2 = 0.02 0.04 4 = 0.6 0.05 3 = 0.5 0.22 4 = 0.88 0.04 = 0.04 0.06 4 = 0.24 0.05 3 = 0.5 0.5 4 = 0.60 0.09 2 = 0.8 Mark Nick Orrie 0.02 0.03 0.0 4 3 4 0.02 4 = 0.08 0.03 3 = 0.09 0.0 4 = 0.04 Cena celkem: 3.47 Cena celkem = prům. poč. testů na jednu operaci Find. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 37/68

Optimální BVS Struktura optimálního BVS s danými pravděpodobnostmi 0.2 Cole Gene 0.22 Ken 0.5 0.08 Ben Fred 0.05 0.06 Irma Lea 0.09 Ann 0.04 Edna Hugo Jack Nick 0.03 0.03 0.04 0.05 Dana Mark Orrie 0.0 0.02 0.0 Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 38/68

klíč pravděp. p k hloubka d k p k d k 0.03 4 0.03 4 = 0.2 0.08 3 0.08 3 = 0.24 0.2 2 0.2 2 = 0.24 0.0 5 0.0 5 = 0.05 0.04 4 0.04 4 = 0.6 0.05 3 0.05 3 = 0.5 0.22 0.22 = 0.22 0.04 4 0.04 4 = 0.6 0.06 3 Ann Ben Cole Dana Edna Fred Gene Hugo Irma Jack Ken Lea Mark Nick Orrie Cena optimálního BVS 0.05 0.5 0.09 0.02 0.03 0.0 Zrychlení 3.47 : 2.56 = : 0.74 0.06 3 = 0.8 0.05 4 = 0.20 0.5 2 = 0.30 0.09 3 = 0.27 0.02 5 = 0.0 0.03 4 = 0.2 0.0 5 = 0.05 Cena celkem 2.56 Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 39/68 4 2 3 5 4 5

Výpočet ceny optimálního BVS Xyz p k C k C 2k cena levého podstromu uzlu k Cena pravého podstromu uzlu k C 2k C k L k- k k+ R Rekurzivní myšlenka k- Cena = C k + p i + C 2k + i=l R i=k+ p i p k + p k Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 40/68

Výpočet ceny optimálního BVS Malé optimální podstromy 2 L R N Nad prvky s indexy od L do R lze jistě vytvořit jeden optimální podstrom. Velikost stromu = poč. uzlů = R-L+ Máme N optimalních podstromů velikosti N- 2 N-2 3 podstrom N Celkem máme N * (N+) /2 různých optimálních podstromů. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 4/68

Idea rekurzivního řešení: Minimalizace ceny BVS. Předpoklad : Všechny menší optimální stromy jsou známy. 2. Zkus: k = L, L+, L+2,..., R k=l k=l+ k=l+2... k=r 3. Zaregistruj index k, který minimalizuje cenu, tj. zaregistruj hodnotu: k- C k + p i + C 2k + p i + p k i=l R i=k+ 4. Klíč s indexem k je kořenem optimálního stromu. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 42/68

Minimalizace ceny BVS C(L,R)... Cena optimálního podstromu obsahujícího klíče s indexy L, L+, L+2,..., R-, R k- C(L,R) = min { C(L, k-) + L k R i=l p i + C(k+,R) + R p i i=k+ + p k } = = min { C(L, k-) + L k R C(k+,R) + R i=l p i } = (*) = min { C(L, k-) + L k R C(k+,R) } + R i=l p i Hodnota k minimalizující (*) je indexem kořene optimálního podstromu. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 43/68

Datové struktury pro výpočet optimálního BVS Ceny optimálních podstromů pole C [L][R] (L R) Kořeny optimálních podstromů pole roots [L][R] (L R) L 2 3 R 2 3 4 N L R L 2 3 R L R N+ 0 N+ 0 diagonála... L = R diagonála... L = R Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 44/68

Výpočet optimálního BVS Cena konkrétního optimálního podstromu p p 2 L=3, R=9 p 3 a b c d e p 4 p 5 x y z C(L,R) = min { C(L, k-) + C(k+,R) } L k R R + p i i=l p 6 p7 t 0 (nuly na diagonále a pod ní ) p 8 w p9 C(L,R) = min{ 0+x, p 3 +y, a+z, b+t, c+w, d+p 9, e+0 } R + p i i=l p N Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 45/68

Výpočet optimálního BVS Strategie dynamického programování nejprve se zpracují nejmenší podstromy, pak větší, atd Stop Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 46/68

Výpočet optimálního BVS Výpočet polí cen a kořenů void optimaltree() { int L, R, k, size; double min; // size = for (int i=0; i<=n; i++) { C[i][i] = pravděpodobnost[i]; R[i][i] = i; } // size > for (size = 2; size <= N; size++) { L = ; R = size; while (R <= N) { C[L][R] = min(c[l][k-]+c[k+][r], k = L..R); roots[l][r] = k minimalizující předch. řádek ; C[L][R] += sum(c[i][i], i = L..R); L++; R++; } } } Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 47/68

Výpočet optimálního BVS Vybudování optimálního stromu pomocí pole kořenů void buildtree(int L, int R) { int key; if (R < L) return; key = roots[l][r]; insert(root, key); // standard BST insert buildtree( L, key-); buildtree( key+, R); } Volání funkce buildtree vybuduje optimální strom: buildtree(,n); Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 48/68

Výpočet optimálního BVS Kořeny optimálních podstromů 0 2 3 3 3 3 3 7 7 7 7 7 7 7 7 0 0 2 3 3 3 3 7 7 7 7 7 7 7 7 7 0 0 0 3 3 3 3 7 7 7 7 7 7 7 7 7 0 0 0 0 4 5 6 7 7 7 7 7 7 7 7 7 0 0 0 0 0 5 6 7 7 7 7 7 7 7 7 7 0 0 0 0 0 0 6 7 7 7 7 7 7 7 0 0 0 0 0 0 0 7 7 7 7 7 0 0 0 0 0 0 0 0 8 9 9 0 0 0 0 0 0 0 0 0 9 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 49/68

Výpočet optimálního BVS Korespondence stromů 0.08 Ben Ann 0.03 0.2 Cole 0.04 Edna Dana 0.0 0.05 Fred 0.22 Gene 0.06 Irma Hugo 0.04 Jack 0.05 0.5 Ken 0.09 Lea 0.03 Nick Mark 0.02 Orrie 0.0 0 2 3 3 3 3 3 7 7 7 7 7 7 7 7 0 0 2 3 3 3 3 7 7 7 7 7 7 7 7 7 0 0 0 3 3 3 3 7 7 7 7 7 7 7 7 7 0 0 0 0 4 5 6 7 7 7 7 7 7 7 7 7 0 0 0 0 0 5 6 7 7 7 7 7 7 7 7 7 0 0 0 0 0 0 6 7 7 7 7 7 7 7 0 0 0 0 0 0 0 7 7 7 7 7 0 0 0 0 0 0 0 0 8 9 9 0 0 0 0 0 0 0 0 0 9 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 50/68

Výpočet optimálního BVS Ceny optimálních podstromů -A 2-B 3-C 4-D 5-E 6-F 7-G 8-H 9-I 0-J -K 2-L 3-M 4-N 5-O -A 0.03 0.4 0.37 0.39 0.48 0.63.7.26.42.57 2.02 2.29 2.37 2.5 2.56 2-B 0 0.08 0.28 0.30 0.39 0.54.06.4.30.45.90 2.7 2.25 2.39 2.44 3-C 0 0 0.2 0.4 0.23 0.38 0.82 0.90.06.2.66.93 2.0 2.5 2.20 4-D 0 0 0 0.0 0.06 0.6 0.48 0.56 0.72 0.87.32.59.67.8.86 5-E 0 0 0 0 0.04 0.3 0.44 0.52 0.68 0.83.28.55.63.77.82 6-F 0 0 0 0 0 0.05 0.32 0.40 0.56 0.7.6.43.5.63.67 7-G 0 0 0 0 0 0 0.22 0.30 0.46 0.6.06.3.37.48.52 8-H 0 0 0 0 0 0 0 0.04 0.4 0.24 0.54 0.72 0.78 0.89 0.93 9-I 0 0 0 0 0 0 0 0 0.06 0.6 0.42 0.60 0.66 0.77 0.8 0-J 0 0 0 0 0 0 0 0 0 0.05 0.25 0.43 0.49 0.60 0.64 -K 0 0 0 0 0 0 0 0 0 0 0.5 0.33 0.39 0.50 0.54 2-L 0 0 0 0 0 0 0 0 0 0 0 0.09 0.3 0.2 0.24 3-M 0 0 0 0 0 0 0 0 0 0 0 0 0.02 0.07 0.09 4-N 0 0 0 0 0 0 0 0 0 0 0 0 0 0.03 0.05 5-O 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 5/68

DYNAMICKÉ PROGRAMOVÁNÍ: NEJDELŠÍ SPOLEČNÁ PODPOSLOUPNOST Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 52/68

Nejdelší společná podposloupnost Dvě posloupnosti A: B: C B E A D D E A D E C D B D A A = 8 B = 7 Společná podposloupnost A: C B E A D D E A B: D E C D B D A C: C D A C = 3 Nejdelší společná podposloupnost (NSP, angl: LCS) A: C B E A D D E A B: D E C D B D A C: E D D A C = 4 Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 53/68

Nejdelší společná podposloupnost A n : (a, a 2,..., a n ) B m : (b, b 2,..., b m ) C k : (c, c 2,..., c k ) C k = LCS(A n, B m ) A 8 : B 7 : C 4 : 2 3 4 5 6 7 8 C B E A D D E A D E C D B D A E D D A Rekurzivní pravidla: ( a n = b m ) ==> (c k = a n = b m ) & (C k- = LCS (A n-, B m- ) ) 2 3 4 5 6 7 8 2 3 4 5 6 7 8 A 8 : C B E A D D E A A 7 : C B E A D D E A B 7 : D E C D B D A B 6 : D E C D B D A C 4 : E D D A C 3 : E D D A Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 54/68

Nejdelší společná podposloupnost ( a n!= b m ) & (c k!= a n ) ==> (C k = LCS (A n-, B m ) ) 2 3 4 5 6 7 8 2 3 4 5 6 7 8 A 7 : C B E A D D E A 6 : C B E A D D E B 6 : D E C D B D B 6 : D E C D B D C 3 : E D D C 3 : E D D ( a n!= b m ) & (c k!= b m ) ==> (C k = LCS (A n, B m- ) ) 2 3 4 5 6 7 8 2 3 4 5 6 7 8 A 5 : C B E A D A 5 : C B E A D B 5 : D E C D B B 4 : D E C D B C 2 : E D C 2 : E D Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 55/68

Nejdelší společná podposloupnost Rekurzivní funkce délka NSP C(n,m) = 0 C(n-, m-) + max{ C(n-, m), C(n, m-) } n = 0 or m = 0 n > 0, m > 0, a n = b m n > 0, m > 0, a n b m Strategie dynamického programování C[n][m] m for (a=; a<=n; a++) for (b=; b<=m; b++) C[a][b] =... ; n Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 56/68

Nejdelší společná podposloupnost Konstrukce pole pro NSP void findlcs() { int a, b; for (a=; a<=n; a++) for (b=; b <= m; b++) if (A[a] == B[b]) { C[a][b] = C[a-][b-]+; arrows[a][b] = DIAG; } else if (C[a-][b] > C[a][b-]) { C[a][b] = C[a-][b]; arrows[a][b] = UP; } else { C[a][b] = C[a][b-]; arrows[a][b] = LEFT; } } Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 57/68

Karel Richta a kol. (FEL) B6B36DSA, 207, Lekce 2, 58/68 Dynamické programování Datové struktury a algoritmy 3 4 5 6 7 2 C B E A D D E A 0 0 0 0 0 0 2 2 2 0 0 0 0 2 2 2 2 2 3 0 0 2 2 2 2 3 3 3 3 0 0 2 2 2 2 2 2 2 2 3 3 3 4 0 0 0 0 0 0 0 0 2 3 4 5 6 7 8 0 C D B D A D E 0 C A: B: Pole NSP pro CBEADDEA a DECDBDA Nejdelší společná podposloupnost

Nejdelší společná podposloupnost Výpis NSP -- rekurzivně :) void outlcs(int a, int b) { if ((a == 0 ) (b == 0)) return; if (arrows[a][b] == DIAG) { outlcs(a-, b-); // recursion... print(a[a]); //... reverses the sequence! } else if (arrows[a][b] == UP) outlcs(a-,b); else outlcs(a,b-); } Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 59/68

DYNAMICKÉ PROGRAMOVÁNÍ: ŘEZÁNÍ TYČÍ Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 60/68

Problém řezání tyčí Firma Serling Enterprises se zabývá prodejem železných tyčí. Nakupuje tyče určité délky, řeže je na menší délky a prodává. Předpokládáme, že řez má zanedbatelnou cenu. Chceme navrhnout optimální sadu řezů. Jako vstup uvažujeme řadu cen p i, které si firma účtuje za tyč délky i (,2, ). Problém je nalézt pro tyč délky n optimální řezy tak, aby zisk byl co největší. Pozn.: pokud by cena p n byla dostatečně vysoká, bude optimální vůbec neřezat. Př.: Uvažme tabulku cen: délka 2 3 4 5 6 7 8 9 0 cena 5 8 9 0 ý 7 20 24 30 Pro tyč délky 4 je optimální jeden řez na dvě tyče délky 2. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 6/68

Problém řezání tyčí (pokr.) Pokud tyč délky n rozřízneme na k kusů, pak n=i +i 2 + +i k. Označme si r n zisk z takového řezu: r n =p i +p i2 + +p ik. I r i řešení = (bez řezu) 2 5 2 = 2 (bez řezu) 3 8 3 = 3 (bez řezu) 4 0 4 = 2 + 2 5 3 5 = 2 + 3 6 7 6 = 6 (bez řezu) 7 8 7 = + 6 nebo 7 = 2 + 2 + 3 8 22 8 = 2 + 6 9 25 9 = 3 + 6 0 30 (bez řezu) Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 62/68

Problém řezání tyčí (pokr.) Zisk lze spočítat z předchozích hodnot dle vztahu: r n = max(p n, r -r n-, r 2 -r n-2,, r n- -r ). Abychom mohli spočítat řešení problém rozsahu n, musíme spočítat řešení problémů velikosti n-, n-2, atd. Navíc, pokud rozřízneme tyč na dva kusy, můžeme uvažovat řešení obou částí jako nezávislá, ze kterých pak určíme optimální řešení celku. Výše uvedenou rovnost lze ještě zjednodušit (uvažujeme r 0 = 0): r n = max i n (pi, rn i ) Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 63/68

Rekurzivní řešení public static int cut_rod(int p[], int n) { int q; if (n == 0) return 0; q = MIN_VALUE; for (int i = ; i < n; i++){ q = Math.max(q, p[i]+cut_rod(p,n-i)); }; return q; }; Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 64/68

Řešení dynamickým programováním r n = max ( ݎ, ) r Krok Krok 2 3 4 p 0 2 3 9 0 0 - - 0 0 5 8 n f(0,8) 9 f(9,9 f(0,9) 0 f(0,0) f(9,0) f(0,0) y Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 65/68

Řešení pomocí dynamického programování public static int bottom_up_cut_rod(int p[], int n) { int q = 0; int r[] = new int[n]; r[0] = 0; for (int j = ; j < n; j++){ q = MIN_VALUE; for (int i = ; i < j; i++){ q = Math.max(q, p[i]+r[j-i]); }; r[j] = q; }; return q; }; Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 66/68

Příklady úloh vhodných pro řešení metodou DP Floydův algoritmus hledání nejkratších cest v grafech. Optimální plánování výpočetních úloh, zadaných časovými intervaly, ve kterých mohou běžet. Výpočet Levenshteinovy vzdálenosti mezi 2 textovými řetězci. Určení způsobu, jak nejlépe daný řetězec vygenerovat pomocí dané bezkontextové gramatiky. Hledání nejdelšího společného podřetězce dvou řetězců. Optimální triangularizace konvexního mnohoúhelníku. Problém obchodního cestujícícho:... Obecný případ v exponenciálním, ale o(n!) čase. Spec. případy v polynomiálním čase. Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 67/68

The End Karel Richta a kol. (FEL) Dynamické programování B6B36DSA, 207, Lekce 2, 68/68