Dynamisch Programmeren III. Algoritmiek

Vergelijkbare documenten
Heuristieken en benaderingsalgoritmen. Algoritmiek

Greedy algoritmes. Algoritmiek

Achtste college algoritmiek. 8 april Dynamisch Programmeren

Negende college algoritmiek. 15 april Dynamisch Programmeren

Algoritmiek 2016 / Algoritmiek 1

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

Greedy algorithms. Algoritmiek

Discrete Wiskunde, College 12. Han Hoogeveen, Utrecht University

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Netwerkstroming. Algoritmiek

Vierde college complexiteit. 26 februari Beslissingsbomen en selectie Toernooimethode Adversary argument

Tiende college algoritmiek. 13/21 april Gretige Algoritmen Algoritme van Dijkstra

Examen Datastructuren en Algoritmen II

Zevende college algoritmiek. 24 maart Verdeel en Heers

Greedy algorithms. Algoritmiek

Tiende college algoritmiek. 14 april Dynamisch Programmeren, Gretige Algoritmen, Kortste Pad met BFS

Doorzoeken van grafen. Algoritmiek

Tiende college algoritmiek. 26 april Gretige algoritmen

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 )

Examen Datastructuren en Algoritmen II

9. Strategieën en oplossingsmethoden

(On)Doenlijke problemen

Vijfde college complexiteit. 21 februari Selectie Toernooimethode Adversary argument

Discrete Structuren. Piter Dykstra Sietse Achterop Opleidingsinstituut Informatica en Cognitie

Tweede college algoritmiek. 12 februari Grafen en bomen

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

String Matching. Algoritmiek

String Matching. Algoritmiek

Tiende college algoritmiek. 2 mei Gretige algoritmen, Dijkstra

Vierde college algoritmiek. 2 maart Toestand-actie-ruimte Exhaustive Search

Vierde college complexiteit. 14 februari Beslissingsbomen

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

Kosten. Computationale Intelligentie. Een zoekprobleem met stapkosten. Een voorbeeld: het vinden van een route. Zoeken met kosten.

Onafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

Benaderingsalgoritmen

Datastructuren en Algoritmen

Combinatorische Algoritmen: Binary Decision Diagrams, Deel III

Tree traversal. Bomen zijn overal. Ferd van Odenhoven. 15 november 2011

Tweede Toets Datastructuren 29 juni 2016, , Educ-Γ.

Modeluitwerking Tentamen Computationele Intelligentie Universiteit Leiden Informatica Vrijdag 11 Januari 2013

Algoritmiek. 15 februari Grafen en bomen

Netwerkstroming. Algoritmiek

Examen Datastructuren en Algoritmen II

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Recapitulatie: Ongeïnformeerd zoeken. Zoekalgoritmen ( ) College 2: Ongeïnformeerd zoeken. Dynamische breadth-first search

Grafen. Indien de uitgraad van ieder punt 1 is, dan bevat de graaf een cykel. Indien de ingraad van ieder punt 1 is, dan bevat de graaf een cykel.

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

Zevende college complexiteit. 17 maart Ondergrens sorteren, Quicksort

Elfde college algoritmiek. 21 april Dijkstra en Branch & Bound

Divide & Conquer: Verdeel en Heers. Algoritmiek

Algoritmen en programmeren: deel 2 - basis

Getallensystemen, verzamelingen en relaties

Kortste Paden. Algoritmiek

Sommige praktische IP problemen kunnen worden geformuleerd als optimalisering op een netwerk.

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/

2 Recurrente betrekkingen

Datastructuren Uitwerking jan

Overzicht. Inleiding. Toepassingen. Verwante problemen. Modellering. Exacte oplosmethode: B&B. Insertie heuristieken. Local Search

TW2020 Optimalisering

Tree traversal. Ferd van Odenhoven. 15 november Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering. Doorlopen van bomen

Computationale Intelligentie Dirk Thierens

Inleiding Programmeren 2

NP-Volledigheid. Wil zo snel mogelijke algoritmes om problemen op te lossen. De looptijd is polynomiaal: O n k - dat is heel erg mooi

Een eenvoudig algoritme om permutaties te genereren

Eerste deeltoets Algoritmiek 4 maart 2015, , Educ-β.

Transcriptie:

Dynamisch Programmeren III

Vandaag Dynamisch programmeren met wat lastiger voorbeelden: Handelsreiziger Longest common subsequence Optimale zoekbomen Knapsack 2 - DP2

Handelsreiziger Een handelsreiziger moet een aantal steden bezoeken: Elke stad 1 keer Elk paar steden v, w heeft een afstand d(v,w) Beginstad = eindstad Wat is de kortste route? 3 - DP2

a 2 c 5 3 4 4 b 4 d Optimaal: totale lengte 13 a 2 c 5 3 4 4 b 4 d Niet optimaal: Totale lengte 16 4 - DP2

Toepassingen Logistiek (belangrijk!!) Robot (printplaten, productie, ) Data van een disk halen Verfmachine Sommige toepassingen zijn asymmetrisch: d(v,w) hoeft niet hetzelfde te zijn als d(w,v) 5 - DP2

Held-Karp Held-Karp algoritme voor Handelsreiziger: Lost het probleem in O(2 n n 2 ) tijd op Werkt ook voor sommige generalisaties Ook als probleem asymetrisch is Langzaam (exponentieel) dus alleen handig als n klein is, maar wel sneller dan naief O(n!) Vandaag: algoritme voor: foto s in de dierentuin 6 - DP2

n! en 2 n n 2 n n! 2 n n 2 5 120 800 10 3628800 102400 15 1.31 10^12 7372800 20 2,43 10^18 4,19 10^8 7 - DP2

Foto s in de dierentuin n dieren Afstandentabel: tussen elk paar dieren de tijd in minuten om van het ene dier naar het andere te lopen omdat de dierentuin heuvelachtig is, hoeft deze niet symmetrisch te zijn Ik wil van elk dier een foto maken: hoe doe ik dat zo snel mogelijk? 8 - DP2

Oplossen met dynamisch Wat is de rij keuzes? programmeren Welk dier bezoeken we eerst? Welk dier als 2e? Welk dier als 3e Etc. Top choice: laatste bezochte dier Deelstuk van keuzes: een rijtje van de eerste i bezochte dieren? 9 - DP2

Wat is een deelprobleem - I Dit lukt niet: Hoeveel tijd kost het om i dieren te bezoeken? Ik mis belangrijke informatie over de deeloplossing Snelste route voor drie dieren hoeft geen deel te zijn van een snelste route voor vier dieren 10 - DP2

Wat is een deelprobleem - II Dit lukt ook niet: Welke verzameling van i dieren bezoek ik? 1 11 - DP2

Aanpak Deelprobleem: Gegeven een verzameling dieren S en een dier k, wat is de minimum tijd om alle dieren in S te bezoeken (begin bij dier 1) en te eindigen bij dier k? Handige notatie: S is alle dieren tussen 1 en k, dus we bezoeken S U {1,k } A(S,k) = minimum tijd als we beginnen in 1, dan alle dieren in S bezoeken (met de beste volgorde) en dan naar k gaan 12 - DP2

Recurrente betrekking A(,g) = d(1,g) Als S >0, dan ( beste geval over alle mogelijkheden voor top-choice) A(S,k) = min { A(S {g}, g) + d(g,k) g in S} 13 - DP2

Uiteindelijk antwoord min { A(V-{1,k},k) k V-{1} } Als we niet naar het begin terug moeten Beste over alle mogelijkheden voor laatst bezochte dier Variant waar we een rondje lopen (terug naar het begin): min { A(V-{1,k},k) + d(k,1) k V-{1} } 14 - DP2

Algoritme 1: memorisatie Maak een hashtabel Q, initieel leeg Best = maxint For all g {2,, n} do Best = min (Best, Compute(V {1,g},g)) Output Best Met Compute een recursief algoritme met memorisatie (next) 15 - DP2

Compute Compute (S, g) {volgt recurrente betrekking} If (S,g) in Q, then return Q(S,g) Else: If S= then return d(1,g) Else antw = maxint; For k S do antw = min {antw, Compute(S {g}, g) + d(g,k)) Zet Q(S,g) op antw Return antw 16 - DP2

Andere aanpak Reken alle A(S,g) uit: Eerst alleen S = Dan alle S met een dier Dan alle S met twee dieren Dan alle S met drie dieren Etc Of representeer S als integer Ook practisch: reken bij elke verzameling de opvolgende oplossingen uit (met heuristieken om stukken die nooit optimaal kunnen zijn weg te laten) 17 - DP2

Over dit algoritme Tijd: we kijken naar alle deelverzamelingen: 2 n Per verzameling n keuzes voor laatste dier Per combinatie n tijd, want kijken naar elk een-nalaatste dier: O(2 n n 2 ) Generalisatie: bijvoorbeeld: hoeveel dieren kan je binnen k tijd bezoeken? (Tussen openingstijd en sluitingstijd?) 18 - DP2

Longest common subsequence Toepassing: DNA vergelijking Sequence: rij elementen <x(1),, x(m)> Deelsequence: voor 1 i 1 < i 2 < i 3 < < i k m de rij elementen <x(i 1 ), x(i 2 ), x(i 3 ), x(i k ) > Deelsequences van <7, 2, 4, 3, 7> zijn bijv: <7,2> of <7,4,7> of <3> of <> of <7,2,4,3,7> of <2,3> Probleem: gegeven twee sequences, vind een sequence die een deelsequence van beide sequences is en zo lang mogelijk is. Bijv.: <3,6,7,1,8,2,8> en <3,4,8,6,7,3,8> geeft <3,6,7,8> als antwoord 19

Wat notatie Subsequence Gemeenschappelijke (common) subsequence Prefix (beginstuk) X i =<x(1),, x(i)> is een prefix van X=<x(1),, x(m)> (0 i m) Z 3 =<7,2,4> is prefix van Z=<7,2,4,5,6,7,8> LCS van X en Y: longest common subsequence 20

Optimaliteitsprincipe Als Z=<z(1),, z(k)> is een LCS van X=<x(1),, x(m)> en Y=<y(1),, y(n)>, dan: Als x(m)=y(n) dan: z(k)=x(m)=y(n) en Z k 1 is een LCS van X m-1 en Y n-1 Als x(m) y(n) dan: Als z(k) x(m) dan Z is een LCS van X m-1 en Y Als z(k) y(n) dan Z is een LCS van X en Y n-1 21

Deelproblemen Voor elke prefix van X en elke prefix van Y, kijk naar de lengte van de LCS c[i,j] = lengte van LCS van X i en Y j. Voor elke i, 0 i m en elke j, 0 j n. Topkeuze: laatste letter van LCS 22

Recurrente betrekking Als i = 0 of j = 0, dan c[i,j] = 0. Als i>0 en j>0 en x(i) = y(j) dan c[i,j] = c[i-1,j-1] +1. Als i>0 en j>0 en x(i) y(j) dan c[i,j] = max( c[i,j-1], c[i-1,j] ). 23

Berekeningsvolgorde c[i,j] heeft nodig evt c[i-1,j], c[i,j-1], c[i-1,j-1]. Dus, bijv. For i = 0 to m Do for j = 0 to n Bereken c[i,j] 24

Code om lengte LCS te berekenen m = lengte (X) n = lengte Y Maak array c[0 m, 0 n] For i = 1 to m do c[i,0] = 0 For j = 0 to n do c[0,j] = 0 For i = 1 to m do For j = 1 to n do If x(i) == y(j) then c[i,j] = c[i-1,j-1] +1 Else c[i,j] = max( c[i,j-1], c[i-1,j] ) Return c[m,n] 25

Tijd O(mn) m = lengte (X) n = lengte Y Maak array c[0 m, 0 n] For i = 1 to m do c[i,0] = 0 For j = 0 to n do c[0,j] = 0 For i = 1 to m do For j = 1 to n do If x(i) == y(j) then c[i,j] = c[i-1,j-1] +1 Else c[i,j] = max( c[i,j-1], c[i-1,j] ) Return c[m,n] 26

27 Constructieve versie: Houd bij waar je vandaankwam m = lengte (X); n = lengte Y Maak array c[0 m, 0 n] For i = 1 to m do c[i,0] = 0 For j = 0 to n do c[0,j] = 0 For i = 1 to m do For j = 1 to n do If x(i) == y(j) then c[i,j] = c[i-1,j-1] +1; b[i,j]= LO Else if c[i-1,j] c[i,j-1] Then c[i,j] = c[i,j-1] ; b[i,j] = O Else c[i,j] = c[i-1,j]; b[i,j] = L Print-LCS(b,X,m,n) Print-LCS(b,X,i,j) If i==0 or j==0 then return If b[i,j] = LO then Print- LCS(b,X,i-1,j-1); print x(i) Elseif b[i,j] = O then Print- LCS(b,X,i,j-1) Else {b[i,j] = L} Print-LCS(b,X,i-1,j)

Opmerkingen Tabel b is handig voor constructie, maar constructie kan ook zonder tabel b. Als we alleen de lengte willen weten, kunnen we met twee rijen van de tabel volstaan 28

Zoekbomen Zoekboom voor het vinden van keys Keys zijn (bijv. lexicographisch) geordend. Keys hebben verschillende frequenties Welke zoekboom kost kleinste gemiddelde aantal stappen? Diepte: aantal kanten tot wortel. (Je bekijkt dus diepte+1 knopen in boom.) 29

Twee zoekbomen appel een is appel gezond is gezond wel een wel 30

Input van probleem Gegeven: Keys k(1),, k(n), (geordend) Frequenties p(1),, p(n), p(i) geeft de frequentie waarmee key k(i) gezocht wordt Frequenties q(0), q(1),, q(n) q(i) geeft de frequentie aan waarmee we een key zoeken die ligt tussen k(i-1) en k(i). q(0) voor keys kleiner dan k(1), q(n) voor keys groter dan k(n) Som van alle p(i) s en q(i) s is precies 1. 31

Voorbeeld van zoekboom k(3) k(1) k(4) d(0) k(2) d(1) d(2) d(3) d(4) k(5) d(5) 32

Zoekboom en gemiddelde tijd Geordende binare boom met keys als interne knopen, en knopen d(i) als bladeren (geven aan als gezochte key niet in boom zit) Verwachtte tijd van een zoekactie bij boom T: n ( depth ( k( i)) 1)* p( i) T i 1 i 0 1 n depth ( k( i))* = p( i) n T i 1 i 0 n ( depth depth T T ( d( i)) 1)* q( i) ( d( i))* q( i) 33

Probleem Gegeven keys, en frequenties p(i) en q(i), vind een zoekboom voor de keys met minimum verwachtte tijd van een zoekactie Nagaan van alle mogelijke zoekbomen is veel te duur (er zijn W(4 n /n 3/2 ) mogelijke bomen als we n keys hebben). DP algoritme kan dit probleem in O(n 3 ) tijd oplossen 34

Subproblemen: structuur k(b) k(l) k(r) k(?) Bevat dummy keys d(b+1) d(r-1) : gebruik een optimale boom voor de keys k(b+1) k(r-1) 35

Deelproblemen e(i,j): minimum gemiddelde zoektijd voor een zoekboom met keys k(i) k(j) en dummy keys d(i-1) d(j) (en bijbehorende frequenties p(i) p(j) en q(i-1) q(j).) 1 j l i depth T ( k( l))* p( l) l i 1 Speciaal geval: e(i,i-1): zoekboom bevat alleen dummy key d(i-1) j depth T ( d( l))* q( l) 36

Recurrente betrekking e(i,i-1) = q(i-1) Als i j, dan: neem minimum over alle keuzes van key als wortel: j j e( i, j) min e( i, r 1) e( r 1, j) p( l) q( l) i r j l i l i 1 Werk in linkerboom Werk in rechterboom Tijd voor bekijken van de wortel 37

Rekenvolgorde Weer rij-gewijs, maar van elke rij alleen maar een stukje: Eerst alle e(i,i-1) uitrekenen For l = 1 to n do For i = 1 to n l + 1 do j = i + l 1; Bereken e(i,j) 38

Preprocessing Steeds direct berekenen van termen: w( i, j) kan lang duren. Dus tabelleren we die. Neem matrix w[1 n,0 n]. For i=1 to n+1 do w[i,i-1] = q(i-1) For i=1 to n+1 do For j = 0 to n do w[i,j] = w[i,j-1] + p(j)+q(j) j l i p( l) O(n 2 ) j l i 1 q( l) 39

DP algoritme voor optimale zoekbomen probleem Tabelleer w. For i = 1 to n+1 do e[i,i+1] = q(i-1) For l = 1 to n do For i = 1 to n l + 1 do j = i + l 1; e[i,j] = maxint; For r = i to j do t = e[i,r-1]+ e[r+1,j] + w[i,j] If t < e[i,j] Then e[i,j] = t; root[i,j] = r De tabel root staat ons in staat de gezochte boom te construeren Uitrekenen van minimum uit recurrente betrekking 40

Slotopmerkingen Maken van boom zelf kan met behulp van terugredeneren met tabel root Tijd van algoritme is O(n 3 ) Er bestaat een versie van het algoritme dat O(n 2 ) tijd gebruikt (Knuth, 1971). 41

Knapsack probleem Voorwerpen met Waardes v 1, v n Gewichten w 1,, w n Maximum gewicht W Zoek verzameling voorwerpen met totaalgewicht hooguit W en maximum waarde 42 - DP2

Deelproblemen en recurrente betrekking K[i,b] = maximum waarde van deelverzameling van de eerste i voorwerpen met totaalgewicht hooguit b. K[0,b] = 0 (voor elke niet negatieve b) K[i, b] = max (K[i-1,b], K[i-1,b-W[i]] + V[i]) 43 - DP2

En dan Berekeningsvolgorde: matrix bijv. rij-gewijs vullen. Dubbele loop Constructie-versie 44 - DP2

Conclusies Soms meer inzicht nodig voor ontwerp van DP algoritme. Steeds het stappenplan volgen; bij de eerste stap kijken naar deelbeslissingen en wat voor soort deelproblemen je dan overhoudt. 45