Föreläsning 13. Dynamisk programmering

Relevanta dokument
Föreläsning 13. Dynamisk programmering

Föreläsning 11. Giriga algoritmer

Föreläsning 5. Rekursion

Föreläsning 12. Söndra och härska

Föreläsning 12. Söndra och härska

Föreläsning 5: Dynamisk programmering

Dynamisk Programmering

Föreläsning 5. Rekursion

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Exempel: Förel Rekursion III Nr 14. Uno Holmer, Chalmers,

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

Föreläsning 8 Innehåll

Föreläsning Datastrukturer (DAT036)

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Problemlösning och funktioner Grundkurs i programmering med Python

Lösningar Datastrukturer TDA

Föreläsning 11. Giriga algoritmer

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 10. Grafer, Dijkstra och Prim

Tentamen TEN1 HI

Föreläsningsanteckningar F6

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Dekomposition och dynamisk programmering

Tentamen TEN1 HI

Pseudokod Analys av algoritmer Rekursiva algoritmer

Tillämpad Programmering (ID1218) :00-13:00

Rekursion och induktion för algoritmkonstruktion

Rekursion och induktion för algoritmkonstruktion

Föreläsning 10. Grafer, Dijkstra och Prim

Tommy Färnqvist, IDA, Linköpings universitet

Datastrukturer och algoritmer

Föreläsning 9: NP-fullständighet

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Föreläsning 11: Rekursion

Föreläsning 1, vecka 7: Rekursion

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Algoritmer, datastrukturer och komplexitet

Föreläsning 5: Grafer Del 1

Dynamisk programmering. Dynamisk programmering. Dynamisk programmering. Dynamisk programmering

Medan ni väntar. 2. Skriv metoden. 3. Skriv metoden. Naturligtvis rekursivt och utan användning av Javas standardmetoder.

Föreläsning 4: Kombinatorisk sökning

Föreläsning 6. Rekursion och backtracking

Algoritmer, datastrukturer och komplexitet

Föreläsning Datastrukturer (DAT037)

Datastrukturer. föreläsning 8. Lecture 6 1

Sökning och sortering

Föreläsning Datastrukturer (DAT036)

Föreläsning 7. Träd och binära sökträd

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Dynamisk programmering

Föreläsning 8: Intro till Komplexitetsteori

Föreläsning 6. Rekursion och backtracking

Föreläsning 7+8: NP-problem. Begreppet effektiv algoritm är alltså synonymt med går i polynomisk tid i den här kursen. Är detta en rimlig uppdelning?

Föreläsning Datastrukturer (DAT036)

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 11 Datastrukturer (DAT037)

Föreläsning 7 Datastrukturer (DAT037)

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15-13:15

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Föreläsning 13. Rekursion

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

Tentamen: Programutveckling ht 2015

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Giriga algoritmer och dynamisk programmering

Tommy Färnqvist, IDA, Linköpings universitet

N = {i}: noder (hörn) Graf: G = (N, B) Definitioner. Väg: Sekvens av angränsande bågar. Cykel: Väg som startar och slutar i samma nod.

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Grafer MST Top. sortering Starkt samm. komponenter Kortaste avstånd. Grafalgoritmer 1. Douglas Wikström KTH Stockholm

Tentamen Datastrukturer för D2 DAT 035

Problemlösning och algoritmer

Föreläsning 8+9: NP-problem. Begreppet effektiv algoritm är alltså synonymt med går i polynomisk tid i den här kursen. Är detta en rimlig uppdelning?

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Datastrukturer D. Föreläsning 2

TDDC77 Objektorienterad Programmering

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Föreläsning 4: Giriga algoritmer. Giriga algoritmer

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Funktioner och programstruktur. Föreläsning 5

Övningsuppgifter. Uppgifter föreslagna från vår kursbok markeras med avsnitt och sedan: SC Self Check, P Programing, PP Programing Projects.

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Tentamen, Algoritmer och datastrukturer

TNSL05 Optimering, Modellering och Planering. Föreläsning 10

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Transkript:

Föreläsning 13 Dynamisk programmering

Föreläsning 13 Dynamisk programmering Fibonacci Myntväxling Floyd-Warshall Kappsäck Handelsresandeproblemet

Dynamisk programmering Dynamisk programmering används typiskt när man vid uppdelning av ett problem i subproblem får subproblem som överlappar. En naiv metod blir då ineffektiv eftersom den löser samma problem flera gånger. Grundtanken med dynamisk programmering är då att se till att vi löser varje subproblem endast en gång. Top-down: Rekursiv uppdelning där vi memorerar (memoize) subproblem när de är lösta (tabellerar) och alltid kontrollerar om vi redan löst ett problem innan vi löser det. Bottom-up: Här börjar vi med de minsta subproblemen och bygger i steg upp lösningar på större och större problem. Ibland behöver man även här tabulera resultat och ibland blir det helt enkelt en iterativ lösning. En del programspråk har automatiskt stöd för memoreringen via funktionsanrop som sparar resultat av tidigare anrop.

Fibonacci static long fib(int n){//fib(40) ger 204668309 anrop if(n==1 n==2) return 1; return fib(n-1)+fib(n-2); } Dynamiskt top-down: static long[] tab = new long[100000]; for(int i=0;i<tab.length;i++) tab[i]=0; tab[1]=tab[2]=1; static long fibdyn(int n){ if(tab[n]!=0) return tab[n]; return tab[n]=fibdyn(n-1)+fibdyn(n-2); } fibdyn(40) ger 77 anrop! Dynamiskt bottom-up: static long fibiterativ(int nfinal) { long fn=0,fnminus1=1,fnminus2=1; for(int n=3;n<=nfinal;n++){ fn=fnminus1+fnminus2; fnminus2=fnminus1; fnminus1=fn; } return fn; }

Myntväxling Input: belopp kr i växel mynt[n] array med de n olika valörerna växel(belopp) För i = 0 till n-1 Om mynt[i]=belopp return 1 v=belopp För i = 1 till belopp/2 v=min(v,växel(i)+växel(belopp-i)) return v Hur gör vi dynamiskt?

Myntväxling - dynamiskt För i=0 till n 1 tab[mynt[i]]=1; (övriga positioner ska vara 0) växel(belopp) Om tab[belopp] 0 return tab[belopp] v=belopp För i = 1 till belopp/2 v=min(v,växel(i)+växel(belopp-i)) Sätt tab[belopp] = v return tab[belopp]

Floyd-Warshall Löser kortaste vägen i en viktad graf. Hittar kortaste vägen mellan varje par av noder i O( V 3 ) vilket är ganska snabbt med tanke på att det kan finnas O( V 2 ) bågar. Hittar endast avståndet och inte vilken väg man ska ta. Kan hantera negativa vikter till skillnad från Dijkstra s. Använder dynamisk programmering, bottom up, för att åstadkomma detta.

Princip Input: V mängden av noder numrerade 1,, N w(i,j) vikt för båge från nod i till nod j kortastevägen(i,j,k) kortaste vägen från nod i till nod j endast användande noderna 1,, k som mellannoder. kortastevägen(i,j,k+1) = min(kortastevägen(i,j,k), kortastevägen(i,k+1,k)+ kortastevägen(k+1,j,k)) där kortastevägen(i,j,0) = w(i,j) Här kunde man nu ha löst detta top-down och tabellerat svar. Bottom-up blir dock mycket effektivare:

Algoritm Input: V mängden av noder numrerade 1,, N w(i,j) vikt för båge från nod i till nod j Output: a(i,j) 2D-array för avståndet från i till j (kortaste) Sätt a(i,j) = för alla i,j Sätt a(i,i) = 0 för alla i För alla bågar sätt a(i,j) = w(i,j) För k = 1 till N För i = 1 till N För j = 1 till N a(i,j)=min(a(i,j),a(i,k)+a(k,j))

Kappsäck Det finns n olika sorters varor vars värde är v i och vikt är w i. Av varje sorts vara finns det obegränsat antal. Hur ska vi packa en kappsäck som maximalt tar vikten W så att vi får med oss det maximala värdet? Låt m(w) vara det maximala värdet vi kan få i i en kappsäck av storlek w. Då gäller: m(w) = max(v 1 +m(w-w 1 ), v 2 +m(w-w 2 ),, v n +m(w-w n )) där endast de fall då w-w i 0 är med. Vi har också att: m(0) = 0. Precis som i förra exemplet bygger vi enklast upp detta genom bottomup där vi bestämmer maximala värdet för en kappsäck med plats för 1, 2,, W.

Handelsresandeproblemet Givet n städer (1, n) och avståndet mellan varje par av städer, w(i,j). Vilken väg ska en handelsresande välja för att minimera resvägen och besöka alla städer exakt en gång och börja och sluta i samma stad? Kan vi inte bara prova alla kombinationer? O(n!)

Algoritm dynamisk, bottom-up n är antalet städer Låt oss bestämma oss för att börja och sluta i stad 1. V - mängden av alla städer utom stad 1. S V och S Låt j S. Då är a(s,j) kortaste vägen som börjar i 1 passerar alla städer i S exakt en gång och slutar i j För alla j a({j},j) = w(1,j) För s = 2 till n-1 //s är storleken på (ordningen av) S För alla subset S av storlek s För alla j S a(s,j)=min i S-{j} [a(s-{j},i)+w(i,j)] return min j V [a(v,j)+w(j,1)] blir O(n 2 2 n )

Exempel 1 2 3 4 6 5 5 6 3 4 6 2 3 4 5 w(i,j) 1 2 3 4 5 1 3 6 5 6 2 3 4 5 6 3 6 4 3 4 4 5 5 3 2 5 6 6 4 2

w(i,j) 1 2 3 4 5 1 3 6 5 6 2 3 4 5 6 3 6 4 3 4 4 5 5 3 2 För alla j a({j},j) = w(1,j) 5 6 6 4 2 a({j},j) j=2 j=3 j=4 j=5 3 6 5 6

j=2 j=3 j=4 j=5 a({j},j) 3 6 5 6 a({2,3},j) a({2,4},j) a({2,5},j) w(i,j) 1 2 3 4 5 1 3 6 5 6 2 3 4 5 6 3 6 4 3 4 4 5 5 3 2 5 6 6 4 2 För s = 2 till n-1 //s är storleken på S För alla subset S av storlek s För alla j S a(s,j)=min i S-{j} [a(s-{j},i)+w(i,j)] j=2 j=3 j=4 j=5 min[a({3},3)+ w(3,2)] = 10 min[a({4},4)+ w(4,2)]=10 min[a({5},5)+ w(5,2)]=12 min[a({2},2)+ w(2,3)]=7 a({3,4},j) - min[a({4},4)+ w(4,3)]=8 - - - min[a({2},2)+ w(2,4)]=8 - - min[a({2},2)+ w(2,5)]=9 min[a({3},3)+ w(3,4)]=9 -

För s = 2 till n-1 //s är storleken på S För alla subset S av storlek s För alla j S a(s,j)=min i S-{j} [a(s-{j},i)+w(i,j)] j=2 j=3 j=4 j=5 a({2,3,4},j) min[a({3,4},3)+w(3,2),a({3,4},4)+w(4,2)] - a({2,3,5},j) min[a({3,5},3)+w(3,2),a({3,5},5)+w(5,2)] -