• No results found

Föreläsning 13. Dynamisk programmering

N/A
N/A
Protected

Academic year: 2022

Share "Föreläsning 13. Dynamisk programmering"

Copied!
16
0
0

Loading.... (view fulltext now)

Full text

(1)

Föreläsning 13

Dynamisk programmering

(2)

Föreläsning 13

• Dynamisk programmering

• Fibonacci

• Myntväxling

• Floyd-Warshall

• Kappsäck

• Handelsresandeproblemet

(3)

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.

(4)

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;

}

(5)

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?

(6)

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]

(7)

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.

(8)

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:

(9)

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

(10)

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

up där vi bestämmer maximala värdet för en kappsäck med plats för 1,

2, …, W.

(11)

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

(12)

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)=mini S-{j} [a(S-{j},i)+w(i,j)]

return minjV[a(V,j)+w(j,1)]

blir O(n

2

2

n

)

(13)

Exempel

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 ∞

2 3

3

4 6

4

5 6 5

6 1

2

3

4

5

(14)

För alla j

a({j},j) = w(1,j)

a({j},j) j=2 j=3 j=4 j=5

3 6 5 6

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 ∞

(15)

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({j},j) 3 6 5 6

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 ∞

j=2 j=3 j=4 j=5

a({2,3},j) min[a({3},3)+

w(3,2)] = 10

min[a({2},2)+

w(2,3)]=7

- -

a({2,4},j) min[a({4},4)+

w(4,2)]=10

- min[a({2},2)+

w(2,4)]=8

-

a({2,5},j) min[a({5},5)+

w(5,2)]=12

- - min[a({2},2)+

w(2,5)]=9

a({3,4},j) - min[a({4},4)+

w(4,3)]=8

min[a({3},3)+

w(3,4)]=9

(16)

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

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

References

Related documents

Det redogörs även i Stadsdelsvisionen (2016) för att Karlstad ska vara “En stad för alla” där social hållbarhet ska prägla staden och där alla människor ska känna sig

2 AS – Förkortning för Aspergers syndrom (Både AS och Aspergers syndrom kommer att användas för att få flyt i språket).. klass för elever med denna diagnos. Under

Särskilt vid tillfällen då läraren själv inte är närvarande, till exempel på raster, är det viktigt att de andra lärarna har en medvetenhet om elevens diagnos och

Materialet tillhör Idenfors &amp; Idenfors AB och får användas av dig som kursdeltagare eller prenumerant av vårt nyhetsbrev, men inte kopieras, säljas eller användas i

”Även om de flesta utbildningar för lärare erbjuder kunskap om olika barn i behov av särskilt stöd bör detta givetvis även kompletteras med en kunskap kring olika verktyg för

Energiföretagen Sverige är positivt inställda till att kurser som leder till grundläggande högskolebehörighet ska ingå som ett grundpålägg på alla yrkesprogram, men

Jag heter Kalle och jag funderar på att börja importera kött från Brasilien och undrar vad det är jag ska tänka på.. Är det några skillnader beroende på vilket sorts kött

En annan idé är att göra dekomposition i 3 × 3-blockmatriser istället. Viggo försökte för ett par år sedan hitta det minimala antalet multiplikationer som krävs för