Gretige algoritmen - caagt
Gretige algoritmen - caagt
Gretige algoritmen - caagt
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Gretige</strong> <strong>algoritmen</strong><br />
wat zijn gretige <strong>algoritmen</strong><br />
toepassingen in grafentheorie<br />
minimale-kost opspannende bomen<br />
(Kruskal, Prim)<br />
kortste gewogen pad (Dijkstra)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.1/16
<strong>Gretige</strong> <strong>algoritmen</strong><br />
Wat zijn gretige <strong>algoritmen</strong>?<br />
in elke stap “lokaal” optimale keuze maken<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.2/16
<strong>Gretige</strong> <strong>algoritmen</strong><br />
Wat zijn gretige <strong>algoritmen</strong>?<br />
in elke stap “lokaal” optimale keuze maken<br />
Voorbeeld<br />
wisselgeld teruggeven<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.2/16
Minimale-kost<br />
opspannende bomen<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.3/16
Wegennetwerk aanleggen<br />
Probleemstelling<br />
gegeven: n steden<br />
voor elk paar steden Si en Sj: kost om<br />
rechtstreekse weg tussen Si en Sj aan te<br />
leggen<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.4/16
Wegennetwerk aanleggen<br />
Probleemstelling<br />
gegeven: n steden<br />
voor elk paar steden Si en Sj: kost om<br />
rechtstreekse weg tussen Si en Sj aan te<br />
leggen<br />
definitie: A bereikbaar uit B als<br />
ofwel A en B rechtstreeks verbonden,<br />
ofwel bestaan er tussenliggende steden<br />
X1,...Xk, zodat A–X1, X1–X2, . . . , Xk–B<br />
rechtstreekse verbindingen zijn<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.4/16
Wegennetwerk aanleggen<br />
Probleemstelling (vervolg)<br />
gevraagd: aanleggen wegennetwerk, zo dat:<br />
elke stad bereikbaar uit elke andere stad<br />
zo goedkoop mogelijk<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.5/16
Wegennetwerk aanleggen<br />
Probleemstelling (vervolg)<br />
gevraagd: aanleggen wegennetwerk, zo dat:<br />
elke stad bereikbaar uit elke andere stad<br />
zo goedkoop mogelijk<br />
Grafentheoretisch probleem<br />
minimale-kost opspannende boom (MST)<br />
Gekende <strong>algoritmen</strong>: Kruskal / Prim<br />
gretige <strong>algoritmen</strong> die optimale oplossing<br />
geven<br />
correctheid te bewijzen<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.5/16
Minimale-kost opspannende boom<br />
Algoritme van Kruskal<br />
telkens kleinste boog toevoegen, op<br />
voorwaarde dat nog steeds acyclisch<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.6/16
Minimale-kost opspannende boom<br />
Algoritme van Kruskal<br />
telkens kleinste boog toevoegen, op<br />
voorwaarde dat nog steeds acyclisch<br />
Algoritme van Prim<br />
voorlopige boom telkens uitbreiden met<br />
kleinste boog die top uit boom verbindt met<br />
top buiten boom<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.6/16
Algoritme van Kruskal<br />
Input: gewogen graaf G = (V,E) met n toppen<br />
en m bogen<br />
Output: bogenverzameling ET van MST T<br />
van G<br />
1: sorteer E zo dat w(ei1 ) ≤ · · · ≤ w(eim )<br />
2: ET ← ∅<br />
3: k ← 0<br />
4: while |ET | < n − 1 do<br />
5: k ← k + 1<br />
6: if 〈ET ∪ {eik }〉 is acyclisch then<br />
7: ET ← ET ∪ {eik }<br />
8: return ET<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.7/16
Algoritme van Kruskal<br />
Stelling: correctheid van gretige strategie<br />
algoritme van Kruskal levert minimale-kost<br />
opspannende boom voor samenhangende<br />
gewogen graaf<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.8/16
Algoritme van Kruskal<br />
Stelling: correctheid van gretige strategie<br />
algoritme van Kruskal levert minimale-kost<br />
opspannende boom voor samenhangende<br />
gewogen graaf<br />
Efficiënte implementatie<br />
hoe controleren dat toevoegen van boog een<br />
cykel zou vormen?<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.8/16
Algoritme van Kruskal<br />
Stelling: correctheid van gretige strategie<br />
algoritme van Kruskal levert minimale-kost<br />
opspannende boom voor samenhangende<br />
gewogen graaf<br />
Efficiënte implementatie<br />
hoe controleren dat toevoegen van boog een<br />
cykel zou vormen?<br />
Complexiteit<br />
totale kost Θ(m log n + n 2 )<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.8/16
Algoritme van Prim<br />
Input: gewogen graaf G = (V,E) met n toppen<br />
en m bogen<br />
Output: bogenverzameling ET van MST T<br />
van G<br />
1: zij x0 willekeurige top van G<br />
2: VT ← {x0}; ET ← ∅<br />
3: while |ET | < n − 1 do<br />
4: zij e ′ = x ′ y ′ een boog zo dat w(e ′ ) =<br />
min{w(e) | e = xy,x ∈ VT,y ∈ V \ VT }<br />
5: VT ← VT ∪ {y ′ }<br />
6: ET ← ET ∪ {e ′ }<br />
7: return ET<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.9/16
Algoritme van Prim<br />
Stelling: correctheid van gretige strategie<br />
algoritme van Prim levert minimale-kost<br />
opspannende boom voor samenhangende<br />
gewogen graaf<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.10/16
Algoritme van Prim<br />
Stelling: correctheid van gretige strategie<br />
algoritme van Prim levert minimale-kost<br />
opspannende boom voor samenhangende<br />
gewogen graaf<br />
Complexiteit van eenvoudige implementatie<br />
kost Θ(nm)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.10/16
Algoritme van Prim<br />
Stelling: correctheid van gretige strategie<br />
algoritme van Prim levert minimale-kost<br />
opspannende boom voor samenhangende<br />
gewogen graaf<br />
Complexiteit van eenvoudige implementatie<br />
kost Θ(nm)<br />
Efficiënte implementatie<br />
gebruikt prioriteitswachtlijn<br />
kost reduceren tot Θ(m log n)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.10/16
Algoritme van Dijkstra<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.11/16
Kortste gewogen pad<br />
Probleemstelling<br />
gegeven: graaf G = (V,E), starttop v ∈ V<br />
G is gewogen graaf<br />
enkel niet-negatieve booggewichten<br />
voor elke top w ∈ V , kortste pad van v naar w<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.12/16
Algoritme van Dijkstra<br />
Werking<br />
werkt via labeling strategie<br />
toppen krijgen voorlopig label, d.i.<br />
bovengrens voor afstand<br />
in elke stap: top met kleinste voorlopig label<br />
definitief gelabeld + labels buren evt.<br />
aangepast<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.13/16
Algoritme van Dijkstra<br />
Werking<br />
werkt via labeling strategie<br />
toppen krijgen voorlopig label, d.i.<br />
bovengrens voor afstand<br />
in elke stap: top met kleinste voorlopig label<br />
definitief gelabeld + labels buren evt.<br />
aangepast<br />
Opmerkingen<br />
gretig algoritme<br />
geeft correct antwoord (te bewijzen)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.13/16
Pseudocode Dijkstra<br />
Input: gewogen G met n toppen, u0 ∈ V (G)<br />
(booggewichten zijn niet-negatief !)<br />
Output: ∀v ∈ V (G), gewogen d(u0,v), en<br />
voorganger p(v) op evt. kortste u0-v-pad<br />
1: S ← {u0}; S ← V (G) − {u0}<br />
2: l(u0) ← 0; l(v) ← ∞, ∀v ∈ V (G) − {u0}<br />
3: for all i from 0 to n − 1 do<br />
4: {(A) Aanpassen labels}<br />
5: for all v ∈ S waarvoor uiv ∈ E(G) do<br />
6: if l(v) > l(ui) + w(uiv) then<br />
7: l(v) ← l(ui) + w(uiv)<br />
8: p(v) ← ui<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.14/16
Pseudocode Dijkstra (2)<br />
1: for all i from 0 to n − 1 (vervolg) do<br />
2: {(B) Bepalen volgende top}<br />
3: bepaal lmin ← min{l(v)|v ∈ S}<br />
4: zij vj ∈ S een top met l(vj) = lmin<br />
5: d(u0,vj) ← l(vj)<br />
6: ui+1 ← vj<br />
7: {(C) Aanpassen S en S}<br />
8: S ← S ∪ {ui+1}; S ← S \ {ui+1}<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.15/16
Correctheid van algoritme van Dijkstra<br />
bewijs door inductie<br />
bewijs dat l(ui+1) = d(u0,ui+1)<br />
l(ui+1)<br />
= min{l(v)|v ∈ Si}<br />
= min{l(u) + w(uv)|u ∈ Si,v ∈ Si,uv ∈ E(G)}<br />
= min{d(u0,u) + w(uv)|u ∈ Si,v ∈ Si,uv ∈ E(G)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.16/16
Complexiteit<br />
Complexiteit eenvoudige implementatie<br />
kost Θ(n 2 )<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.17/16
Complexiteit<br />
Complexiteit eenvoudige implementatie<br />
kost Θ(n 2 )<br />
Voor efficiënte implementatie<br />
gebruik prioriteitswachtlijn om voorlopig<br />
gelabelde toppen bij te houden<br />
immers: in elke stap hieruit kleinste label te<br />
selecteren<br />
kost herleiden tot Θ(m log n)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.17/16