Dynamické programování

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

R zné algoritmy mají r znou složitost

Návrh Designu: Radek Mařík

Dynamické programování

Algoritmy na ohodnoceném grafu

Vzdálenost uzlů v neorientovaném grafu

Dynamické programování

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

Dynamické programování

dag a dp v něm, bellman-ford, floyd-warshall

Grafové algoritmy. Programovací techniky

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

Graf. Uzly Lokality, servery Osoby fyzické i právní Informatické objekty... atd. Hrany Cesty, propojení Vztahy Informatické závislosti... atd.

TGH06 - Hledání nejkratší cesty

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

TGH06 - Hledání nejkratší cesty

ALGORITMY A DATOVÉ STRUKTURY

Algoritmizace prostorových úloh

Použití dalších heuristik

TGH05 - aplikace DFS, průchod do šířky

Algoritmy a datové struktury

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

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

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

Aproximativní algoritmy UIN009 Efektivní algoritmy 1

TGH05 - aplikace DFS, průchod do šířky

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

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

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

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

Hledáme efektivní řešení úloh na grafu

5. Dynamické programování

07 Základní pojmy teorie grafů

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

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

PROHLEDÁVÁNÍ GRAFŮ. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

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

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

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.

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

ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ

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

opakování reprezentace grafů, dijkstra, bellman-ford, johnson

Paralelní grafové algoritmy

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

Základní datové struktury

Stromy, haldy, prioritní fronty

Optimalizace & soft omezení: algoritmy

Úvod do teorie grafů

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

Dynamické programování UIN009 Efektivní algoritmy 1

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

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

= je prostý orientovaný graf., formálně c ( u, v) 0. dva speciální uzly: zdrojový uzel s a cílový uzel t. Dále budeme bez

Přijímací zkouška - matematika

4EK311 Operační výzkum. 5. Teorie grafů

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

Teorie grafů BR Solutions - Orličky Píta (Orličky 2010) Teorie grafů / 66

Algoritmy I, složitost

Dijkstrův algoritmus

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

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

Tato tematika je zpracována v Záznamy přednášek: str

Dynamické programování

Metody analýzy dat I (Data Analysis I) Rozsáhlé struktury a vlastnosti sítí (Large-scale Structures and Properties of Networks) - pokračování

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

Dynamické programování

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

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

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

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

opakování reprezentace grafů, dijkstra, bellman-ford, johnson

Ukážeme si lineární algoritmus, který pro pevné k rozhodne, zda vstupní. stromový rozklad. Poznamenejme, že je-li k součástí vstupu, pak rozhodnout

6. Tahy / Kostry / Nejkratší cesty

bfs, dfs, fronta, zásobník

Matice sousednosti NG

Metody síťové analýzy

Modely teorie grafů, min.kostra, max.tok, CPM, MPM, PERT

4EK212 Kvantitativní management. 7.Řízení projektů

TGH12 - Problém za milion dolarů

Dynamické datové struktury III.

Obsah přednášky. Analýza algoritmu Algoritmická složitost Návrhy algoritmů Urychlování algoritmů 1/41

COMPLEXITY

Operační výzkum. Síťová analýza. Metoda CPM.

Základy informatiky. 07 Teorie grafů. Kačmařík/Szturcová/Děrgel/Rapant

Jan Březina. Technical University of Liberec. 21. dubna 2015

Kapitola 11. Vzdálenost v grafech Matice sousednosti a počty sledů

12. Globální metody MI-PAA

4EK311 Operační výzkum. 6. Řízení projektů

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

PLANARITA A TOKY V SÍTÍCH

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))

Základní pojmy teorie grafů [Graph theory]

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

RECURSION

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

Dynamické datové struktury I.

Dynamické datové struktury II.

Zadání a řešení testu z matematiky a zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia od podzimu 2015

Transkript:

ALG 0 Dynamické programování zkratka: DP Zdroje, přehledy, ukázky viz https://cw.fel.cvut.cz/wiki/courses/a4balg/literatura_odkazy 0

Dynamické programování Charakteristika Neřeší jeden konkrétní typ úlohy, je to všeobecná strategie (podobně jako Rozděl a panuj) pro řešení převážně optimalizačních úloh z různých oblastí tvorby algoritmů. Významné vlastnosti. Hledané optimální řešení lze sestavit z vhodně volených optimalních řešení téže úlohy nad redukovanými daty. 2. V rekurzivně formulovaném postupu řešení se opakovaně objevují stejné menší podproblémy. DP umožňuje obejít opakovaný výpočet většinou jednoduchou tabelací výsledků menších podproblémů.

Dynamické programování Příklady aplikací: Hledání optimálních cest v grafech Nejdelší podposloupnosti s předepsanými vlastnostmi Optimální plnění ruksaku (kontejneru, nádob...) Optimální rozvrhování navazujících procesů Přibližné vyhledávání v textu daných vzorků (bioinformatika) Nejdelší společná podposloupnost Optimální pořadí násobení matic Optimální vyhledávací strom Optimální vrcholové pokrytí hran stromu Množství dalších... 2

Dynamické programování A4BALG 205/0 Seznam DP algoritmů na en.wikipedia.org/wiki/dynamic_programming Ilustrační otisk obrazovky

Tabelace v DP - příklad 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 4

Tabelace v DP - příklad Jednoduchá analýza int count = 0; 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 = 69 5 5

Tabelace v DP - příklad 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) f(x,y)... Opakující se výpočty, velké množství! 8,8 9,7 zobrazeny jen parametry pro nedostatek místa 6

Tabelace v DP - příklad 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 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 7

Tabelace v DP - příklad f(x,y) = (x = 0) (y = 0) 2 f(x, y-) + f(x-,y) (x > 0) && (y > 0) 0 2 Tabulka všeobecně 0 2 9 0 f(0,0) f(,0) f(2,0) f(0,0) f(0,) f(,) f(0,2) f(x,y-) 2 f(x-,y) f(x,y) x f(0,8) 9 f(9,9) f(0,9) 0 f(0,0) f(8, 0) f(9,0) f(0,0) y 8

Tabelace v DP - příklad f(x,y) = (x = 0) (y = 0) 2 f(x, y-) + f(x-,y) (x > 0) && (y > 0) Tabulka numericky 0 2 4 9 0 x 0 5 7 9 2 7 7 5 49 4 f(x,y-) 2 f(x-,y) f(x,y) 8085505 9 680795 2978945 0 28000257 66627 2757407 y 9

Tabelace v DP - příklad Všechny hodnoty se předpočítají int dynarr [N+][N+]; void filldynarr() { for (int xy = 0; xy <= N; xy++) dynarr[0][xy] = dynarr[xy][0] = ; } for (int y = ; y <=N; y++) for (int 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]; } 0

Hledání optimálních cest v grafu Značení Graf G = (V, E), množina uzlů resp. hran: V(g) resp. E(G), N = V(G), M = E(G), případně n = V, m = M apod. Cesta v grafu = posloupnost na sebe navazujících hran, která prochází každým uzlem nejvýše jednou. Délka cesty v neváženém grafu = počet hran na cestě. Př. Délka (B D E F C) = 4. A B C D E F G Délka cesty ve váženém grafu = součet vah hran na cestě. Př. Délka (A E F C G) = 4. A 7 B C D 4 2 9 0 6 E F G

Hledání optimálních cest v grafu Nejkratší cesty Úloha nalezení nejkratší cesty mezi dvěma danými uzly, případně mezi některými dvojicemi uzlů nebo mezi všemi dvojicemi uzlů. (Například minimalizace nákladů na přesun z X do Y.) Postupy Je vyřešena úspěšně pro všechny praktické případy. V neváženém obecném grafu známe BFS, pro jiné případy, zejména vážených grafů, existují specializované algoritmy -- Dijkstra, Floyd-Warshall, Johnson, Bellman-Ford, atd. Složitost Asymptotická složitost je vždy polynomiální v počtu uzlů a hran, typicky nalezení jedné cesty má složitost nanejvýš O(N 2 ), kde N je počet uzlů grafu. 2

Hledání optimálních cest v grafu Nejdelší cesty Úloha nalezení nejdelší cesty v grafu mezi dvěma danými uzly, nebo v celém grafu vůbec. (Například maximalizace zisků při provádění navzájem závislých činností.) Exponenciální složitost NP - těžký problém Není dosud uspokojivě vyřešena v plné obecnosti. Možné strategie. Brute force -- exponenciální složitost, pro N > cca 20 bezcenná. 2. Algoritmy přibližného řešení s polynomiální složitostí -- buď najdou optimum jen s určitou pravděpodobností -- nebo zaručí jen nalezení suboptimálního řešení -- typicky jsou netriviální a náročné na správnou implementaci.

Hledání nejdelších cest v grafu Možné strategie. Specifické typy grafů dovolují použít efektivní specifický algoritmus. Nejjednodušší případ A. Graf je strom (vážený ano i ne, orientovaný ano i ne). Nejdelší cestu lze najít, např. s pomocí průchodu postorder, vždy v čase (N). Příležitost pro DP B. Graf je orientovaný, acyklický, vážený ano i ne. Standardní označení: DAG (Directed Acyclic Graph) 4

Topologické uspořádání DAG Topologické uspořádání uzlů DAG je takové pořadí jeho uzlů, ve kterém každá hrana vede z uzlu s nižším pořadím do uzlu s vyšším pořadím. Každý DAG lze topologicky uspořádat, většinou více způsoby. Orientovaný graf s alespoň jedním cyklem nelze topologicky uspořádat. Mnoho úloh DP obsahuje DAG na vstupu již topologicky uspořádaný. Topologické uspořádání DAG (alespoň jedno) lze sestavit v čase (M), tj. v čase úměrném počtu hran DAG. 5

DAG a jeho topologické uspořádání Příklad 7 6 4 2 9 5 8 2 4 5 6 7 8 9 6

DAG a jeho různá topologická uspořádání Příklad 2a 2 4 5 6 7 8 9 0 2 2 4 5 6 7 8 9 0 2 V uzlu je zapsáno jeho pořadí v topologickém uspořádání 7

DAG a jeho různá topologická uspořádání Příklad 2b 4 7 0 2 5 8 6 9 2 2 4 5 6 7 8 9 0 2 8

DAG a jeho různá topologická uspořádání Příklad 2c 6 9 2 5 8 4 7 0 2 2 4 5 6 7 8 9 0 2 9

Topologické uspořádání DAG Algoritmus Složitost 0. new queue Q of Node counter = 0. for each x in V(G) if (x.indegree == 0) // x is a root Q.insert(x) x.toporder = counter++ 2. while (!Q.empty()) { Node v = Q.pop() for each edge (v, w) E(G) { G.removeEdge((v, w)) if (w.indegree == 0) // w is a root Q.insert(w) w.toporder = counter++ } } Předpokládáme, že operace G.removeEdge((v, w)) má konstantní složitost. 0. Složitost O(N). Složitost (N) 2. Složitost (M), každá hrana je navštívena právě jednou a v konstantním čase zpracována. Složitost: (N+M) Pořadí, ve kterém se uzly vkládají do fronty, určuje topogické uspořádání DAG. 20

Topologické uspořádání DAG - příklad 2 2 4 Queue:, 2,. Queue: 2,, 4. 4 4 2 Queue:, 4. 2 Queue: 4. 2

Topologické uspořádání DAG - příklad 7 6 4 6 4 2 5 2 5 8 Queue: 5, 6. Queue: 6, 7, 8. 7 7 6 4 6 4 2 5 8 2 9 5 8 Queue: 7, 8. Queue: 8, 9. 22

Topologické uspořádání DAG - příklad 7 7 6 4 6 4 2 9 5 8 2 9 5 8 Queue: 9. Queue: Empty. Topologické uspořádání 2 4 5 6 7 8 9 2

Nejdelší cesta v DAG Předpokládáme topologické uspořádání a v jeho směru procházíme DAG. Označme d[x] délku té cesty v DAG, která končí v x a je nejdelší možná. Charakteristický pohled "odzadu dopředu": -- d[x] určujeme až v okamžiku, kdy jsou známy hodnoty d pro všechny předchozí (= již zpracované) uzly v topologickém uspořádání. -- d[x] určíme jako maximum z hodnot { d[y] + w, d[y2] + w2,..., d[yk] + wk }, kde (y, x), (y2, x),..., (yk, x) jsou všechny hrany končící v x a w, w2,..., wk jsou jejich odpovídající váhy. Příklad Zpracovaná část DAG w Směr postupu y y2 y w x w2 Topologické uspořádání 24

Nejdelší cesta v DAG -- d[x] určíme jako maximum z hodnot { d[y] + w, d[y2] + w2,..., d[yk] + wk }, kde (y, x), (y2, x),..., (yk, x) jsou všechny hrany končící v x a w, w2,..., wk jsou jejich odpovídající váhy. -- Uzel yj, pro který je hodnota d[yj] + wj maximální a nezáporná, ustavíme předchůdcem x na hledané nejdelší cestě. -- Pokud jsou všechny hodnoty {d[y] + w, d[y2] + w2,..., d[yk] + wk} záporné, nepřispívají do nejdelší cesty a položíme d[x] = 0, předchůdce x = null. Příklad 0 A4BALG 205/0 y y2 y 0 x 40 d[y]=0 d[y2]=20 d[y]=5 d[x]=60 p[x]=y2 25

Nejdelší cesta v DAG Příklad -2 7 5-6 2 2-2 4 5 4 6 2 7 - - 8 Určete nejdelší cestu a její délku. 26

Nejdelší cesta v DAG -2 7 5-6 2 2-2 4 5 4 6 2 7 - - 8 d=0 p=nil d = max {0+6} = 6 p= 27

Nejdelší cesta v DAG -2 7 5-6 2 2-2 4 5 4 6 2 7 - - 8 d=0 d=6 p=nil p= d = max {0+-2, 6+2} = 8 p = 2 28

Nejdelší cesta v DAG -2 7 5-6 2 2-2 4 5 4 6 2 7 - - 8 d=0 d=6 d=8 p=nil p= p=2 d = max {0+8, 6+, 8+-2} = 9 p = 2 29

Nejdelší cesta v DAG -2 7 5-6 2 2-2 4 5 4 6 2 7 - - 8 d=0 d=6 d=8 d=9 p=nil p= p=2 p=2 d = max {6+-, 8+-} = 7 p = 0

Nejdelší cesta v DAG -2 7 5-6 2 2-2 4 5 4 6 2 7 - - 8 d=0 d=6 d=8 d=9 d=7 p=nil p= p=2 p=2 p= d = max {0+5, 8+, 9+, 7+4} = 2 p = 4

Nejdelší cesta v DAG -2 7 5-6 2 2-2 4 5 4 6 2 7 - - 8 d=0 d=6 d=8 d=9 d=7 d=2 p=nil p= p=2 p=2 p= p=4 d = max {6+7, 7+-, 2+2} = 4 p = 6 2

Nejdelší cesta v DAG -2 7 5-6 2 2-2 4 5 4 6 2 7 - - 8 d=0 d=6 d=8 d=9 d=7 d=2 d=4 p=nil p= p=2 p=2 p= p=4 p=6 Délka nejdelší cesty: 4 Nejdelší cesta: -- 2 -- 4 -- 6 -- 7

Nejdelší cesta v DAG 0. allocate memory for distance and predecessor of each node. for each x in V(G) { x.dist = neginfinity x.pred = null } 0. Složitost (N). Složitost (N) // supposing nodes are processed // in ascending topological order 2. for each node x in V(G) for each edge e = (y, x) in E(G) if (x. dist < y.dist + e.weight) { x. dist = y.dist + e.weight x.pred = y; } if (x. dist < 0) x.dist = 0; // avoid negative path lengths } 2. Složitost (M), každá hrana je navštívena právě jednou a v konstantním čase zpracována. Složitost: (N+M) 4

Nejdelší cesta v DAG Varianta I 2. for each node x in V(G) { for each edge e = (y, x) in E(G) if (x. dist < y.dist + e.weight) { x. dist = y.dist + e.weight x.pred = y; } if (x. dist < 0) x.dist = 0; } Varianta II 2. for each node x in V(G) { if (x. dist < 0) x.dist = 0; for each edge e = (x, y) in E(G) if (y. dist < x.dist + e.weight) { y. dist = x.dist + e.weight y.pred = x; } } y y y x x y y y order of processing = topological order order of processing = topological order 5

Nejdelší cesty v DAG Varování Algoritmy uváděné v literatuře a na webu většinou úlohu maximální cesty v DAG řeší jen pro nezáporná ohodnocení hran a toto své omezení explicitně nezmiňují. Pro DAG obsahující také záporné váhy hran je nelze použít. Chybný výsledek varianty předpokládající nezáporné váhy hran d= 0 - - d= - d= - d= 2 5 2 7 2 2 4 6 d= - d= d= 2 - -4 8 d= -2 maximální d! Faktická maximální cesta je -- 5 -- 7 s váhou 4, Algoritmus počítající jen s nezápornými hodnotami hran najde jen suboptimální cestu -- 2 -- 4 -- 6 s váhou 2. 6

Nejdelší cesty v DAG Problém rekonstrukce všech optimálních cest -- může jich být příliš mnoho. 0 2 N Ukázka 0 2 N a a a a b b b b a a a a b b b b a a a a b b b b b b b b a a a a Každá cesta z kořene do listu je optimální, má cenu N (a+b). Počet všech těchto cest je Comb(2N, N), přičemž 2 N < Comb(2N, N) < 4 N. Počet optimálních řešení tedy roste exponenciálně vůči hodnotě N. Např. N 0 20 0 40 Počet optimálních řešení 2 84756 7846528820 82645856486424 07507208767646620 7