Dynamisch programmeren
Dynamisch programmeren
Dynamisch programmeren
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