03.07.2013 Views

Dynamisch programmeren

Dynamisch programmeren

Dynamisch programmeren

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Dynamisch</strong><br />

<strong>programmeren</strong><br />

wat is dynamisch <strong>programmeren</strong><br />

wisselgeldprobleem<br />

toepassingen in grafentheorie<br />

kortste-pad-algoritme van Floyd<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.1/16


<strong>Dynamisch</strong><br />

<strong>programmeren</strong><br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.2/16


<strong>Dynamisch</strong> <strong>programmeren</strong><br />

Basisprincipe<br />

recursief algoritme dat dezelfde<br />

tussenresultaten meermaals berekent<br />

herschrijven in niet-recursieve vorm<br />

systematisch bijhouden van tussenresultaten<br />

in tabel<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.3/16


<strong>Dynamisch</strong> <strong>programmeren</strong><br />

Basisprincipe<br />

recursief algoritme dat dezelfde<br />

tussenresultaten meermaals berekent<br />

herschrijven in niet-recursieve vorm<br />

systematisch bijhouden van tussenresultaten<br />

in tabel<br />

Toepassingen<br />

wisselgeldprobleem<br />

kortste-padalgoritme van Floyd<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.3/16


<strong>Dynamisch</strong> <strong>programmeren</strong><br />

Algemene werkwijze<br />

formuleer het antwoord als een recurrente<br />

betrekking of als een recursief algoritme<br />

toon aan dat het aantal verschillende<br />

waarden in de recurrente betrekking<br />

begrensd is door een polynoom met kleine<br />

macht<br />

geef een volgorde waarin de recurrentie moet<br />

geëvalueerd worden zodat een<br />

tussenresultaat beschikbaar is wanneer het<br />

nodig is<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.4/16


Wisselgeldprobleem<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.5/16


Wisselgeldprobleem<br />

Probleemstelling<br />

geg. soorten muntstukken c1,...,cn<br />

vorm bedrag k met minimaal # stukken<br />

ond. steeds stuk 1 aanwezig<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.6/16


Wisselgeldprobleem<br />

Probleemstelling<br />

geg. soorten muntstukken c1,...,cn<br />

vorm bedrag k met minimaal # stukken<br />

ond. steeds stuk 1 aanwezig<br />

Gretige benadering werkt niet altijd<br />

voorbeeld: bedrag 60 met stukken 1, 5, 30, 50<br />

60 = 1 × 50 + 2 × 5 = 2 × 30<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.6/16


Wisselgeldprobleem<br />

Probleemstelling<br />

geg. soorten muntstukken c1,...,cn<br />

vorm bedrag k met minimaal # stukken<br />

ond. steeds stuk 1 aanwezig<br />

Gretige benadering werkt niet altijd<br />

voorbeeld: bedrag 60 met stukken 1, 5, 30, 50<br />

60 = 1 × 50 + 2 × 5 = 2 × 30<br />

Exhaustief: brute-kracht-benadering<br />

systematisch alle mogelijkheden uitproberen<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.6/16


Recursief algoritme<br />

Schets algoritme: vorm bedrag k<br />

voor elk mogelijk muntstuk cj<br />

bepaal x = minimaal aantal muntstukken<br />

dat k − cj vormt<br />

dit vormt k met x + 1 muntstukken<br />

minimum van deze mogelijkheden vormt de<br />

oplossing<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.7/16


Recursief algoritme Wisselgeld<br />

Input: bedrag k, stukken (c1,...,cn)<br />

Output: m = min. # muntstukken dat k vormt<br />

1: if k ≤ 0 then return 0<br />

2: for j from 1 to n do<br />

3: if k = cj then return 1<br />

4: m ← k<br />

5: for j from 1 to n do<br />

6: if cj ≤ k then<br />

7: x ← wisselgeld(k − cj, (c1,...,cn))<br />

8: if x + 1 < m then<br />

9: m ← x + 1<br />

10: return m<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.8/16


Opmerkingen<br />

Uitvoeringstijd: T(n,k) = O(n k )<br />

algoritme werkt goed voor kleine bedragen,<br />

maar traag voor grote bedragen<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.9/16


Opmerkingen<br />

Uitvoeringstijd: T(n,k) = O(n k )<br />

algoritme werkt goed voor kleine bedragen,<br />

maar traag voor grote bedragen<br />

Probleem: veel redundant werk!<br />

er zijn maar Θ(k) = tussenresultaten<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.9/16


Opmerkingen<br />

Uitvoeringstijd: T(n,k) = O(n k )<br />

algoritme werkt goed voor kleine bedragen,<br />

maar traag voor grote bedragen<br />

Probleem: veel redundant werk!<br />

Maar<br />

er zijn maar Θ(k) = tussenresultaten<br />

om te zetten naar niet-recursief algoritme<br />

met dynamisch <strong>programmeren</strong><br />

bijhouden resultaten van deelproblemen<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.9/16


Met dynamisch <strong>programmeren</strong><br />

Schets algoritme<br />

voor alle kleinere bedragen, beste opsplitsing<br />

bepalen en bijhouden in tabel<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.10/16


Met dynamisch <strong>programmeren</strong><br />

Schets algoritme<br />

voor alle kleinere bedragen, beste opsplitsing<br />

bepalen en bijhouden in tabel<br />

bepalen beste opsplitsing van k ′<br />

voor elk muntstuk cj<br />

zoek opsplitsing van k ′ − cj (in tabel!)<br />

minimum hiervan geeft oplossing<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.10/16


Met dynamisch <strong>programmeren</strong><br />

Schets algoritme<br />

voor alle kleinere bedragen, beste opsplitsing<br />

bepalen en bijhouden in tabel<br />

bepalen beste opsplitsing van k ′<br />

voor elk muntstuk cj<br />

zoek opsplitsing van k ′ − cj (in tabel!)<br />

minimum hiervan geeft oplossing<br />

in tabel bijhouden<br />

aantal gebruikte stukken voor bedrag<br />

(laatstgebruikte stuk in opbouw bedrag)<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.10/16


Algoritme Wisselgeld<br />

Input: bedrag kmax , stukken (c1,...,cn)<br />

Output: (mi,i = 0..k), mi #stukken voor bedrag i<br />

1: m0 ← 0<br />

2: for k from 1 to kmax do<br />

3: m ← k<br />

4: for j from 1 to n do<br />

5: if cj ≤ k then<br />

6: x ← mk−cj<br />

7: if x + 1 < m then m ← x + 1<br />

8: mk ← m<br />

9: return (mi,i = 0..k)<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.11/16


Complexiteit<br />

Geheugencomplexiteit<br />

G(n,k) = Θ(k)<br />

(enkel extra geheugen meegeteld)<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.12/16


Complexiteit<br />

Geheugencomplexiteit<br />

G(n,k) = Θ(k)<br />

(enkel extra geheugen meegeteld)<br />

Tijdscomplexiteit<br />

T(n) = Θ(nk)<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.12/16


Algoritme van Floyd<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.13/16


Alle kortste paden<br />

Probleemstelling<br />

gegeven: graaf G = (V,E), starttop v ∈ V<br />

G is gewogen graaf<br />

enkel niet-negatieve booggewichten<br />

voor elk paar toppen (v,w), kortste pad van v<br />

naar w<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.14/16


Alle kortste paden<br />

Probleemstelling<br />

gegeven: graaf G = (V,E), starttop v ∈ V<br />

G is gewogen graaf<br />

enkel niet-negatieve booggewichten<br />

voor elk paar toppen (v,w), kortste pad van v<br />

naar w<br />

Merk op: eenvoudige oplossing<br />

n keer Dijkstra, eenmaal voor elke top<br />

complexiteit Θ(n 3 )<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.14/16


Algoritme van Floyd<br />

Definitie<br />

matrix D (k) =<br />

met d (k)<br />

i,j<br />

<br />

d (k)<br />

i,j<br />

<br />

lengte kortste pad van i naar j,<br />

waarbij enkel toppen uit {1, 2,... ,k} als<br />

tussenliggende toppen gebruikt<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.15/16


Algoritme van Floyd<br />

Definitie<br />

matrix D (k) =<br />

met d (k)<br />

i,j<br />

<br />

d (k)<br />

i,j<br />

<br />

lengte kortste pad van i naar j,<br />

waarbij enkel toppen uit {1, 2,... ,k} als<br />

tussenliggende toppen gebruikt<br />

Er geldt, voor alle i en j<br />

d (0)<br />

i,j<br />

= w(i,j)<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.15/16


Algoritme van Floyd<br />

Definitie<br />

matrix D (k) =<br />

met d (k)<br />

i,j<br />

<br />

d (k)<br />

i,j<br />

<br />

lengte kortste pad van i naar j,<br />

waarbij enkel toppen uit {1, 2,... ,k} als<br />

tussenliggende toppen gebruikt<br />

Er geldt, voor alle i en j<br />

d (0)<br />

i,j<br />

d (k)<br />

i,j<br />

= w(i,j)<br />

<br />

= min d (k−1)<br />

i,j ,d (k−1)<br />

i,k<br />

+ d(k−1)<br />

k,j<br />

<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.15/16


Pseudocode Floyd<br />

Input: gewogen G met n toppen, en<br />

niet-negatieve booggewichten<br />

Output: ∀i,j ∈ V (G), gewogen d(i,j)<br />

1: for i from 1 to n do<br />

2: for j from 1 to n do<br />

3: d (0) [i,j] ← w(i,j)<br />

4: for k from 1 to n do<br />

5: for i from 1 to n do<br />

6: for j from 1 to n do<br />

7: d (k) [i,j] ←<br />

min(d (k−1) [i,j],d (k−1) [i,k] + d (k−1) [k,j])<br />

8: return D (n)<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.16/16

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!