Acht-koninginnen- probleem
Acht-koninginnen- probleem
Acht-koninginnen- probleem
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Brute kracht en recursie<br />
/ Benaderingsalgoritmen<br />
acht-<strong>koninginnen</strong>-<strong>probleem</strong><br />
genereren van permutaties<br />
toepassingen in grafentheorie<br />
hamiltoniaanse cykel<br />
handelsreizigers<strong>probleem</strong> (TSP)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.1/17
<strong>Acht</strong>-<strong>koninginnen</strong>-<br />
<strong>probleem</strong><br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.2/17
<strong>Acht</strong>-<strong>koninginnen</strong>-<strong>probleem</strong><br />
Probleem<br />
plaatsen van 8 <strong>koninginnen</strong> op schaakbord,<br />
zodanig dat geen enkele koningin een andere<br />
bedreigt<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.3/17
<strong>Acht</strong>-<strong>koninginnen</strong>-<strong>probleem</strong><br />
Probleem<br />
plaatsen van 8 <strong>koninginnen</strong> op schaakbord,<br />
zodanig dat geen enkele koningin een andere<br />
bedreigt<br />
Regels van schaakspel<br />
koningin bedreigt stukken op dezelfde rij,<br />
dezelfde kolom, dezelfde diagonaal<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.3/17
<strong>Acht</strong>-<strong>koninginnen</strong>-<strong>probleem</strong><br />
Probleem<br />
plaatsen van 8 <strong>koninginnen</strong> op schaakbord,<br />
zodanig dat geen enkele koningin een andere<br />
bedreigt<br />
Regels van schaakspel<br />
koningin bedreigt stukken op dezelfde rij,<br />
dezelfde kolom, dezelfde diagonaal<br />
Algoritme voor plaatsen van <strong>koninginnen</strong>?<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.3/17
Plaatsen van acht <strong>koninginnen</strong><br />
Merk op<br />
slechts 1 koningin per kolom (en per rij)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.4/17
Plaatsen van acht <strong>koninginnen</strong><br />
Merk op<br />
slechts 1 koningin per kolom (en per rij)<br />
<strong>Acht</strong>erliggend idee<br />
kolom per kolom koningin proberen plaatsen<br />
wanneer geen mogelijke plaats meer:<br />
terugkeren op stappen en andere<br />
mogelijkheden proberen (‘backtracking’)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.4/17
Plaatsen van acht <strong>koninginnen</strong><br />
Merk op<br />
slechts 1 koningin per kolom (en per rij)<br />
<strong>Acht</strong>erliggend idee<br />
kolom per kolom koningin proberen plaatsen<br />
wanneer geen mogelijke plaats meer:<br />
terugkeren op stappen en andere<br />
mogelijkheden proberen (‘backtracking’)<br />
Te programmeren via recursie<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.4/17
Algoritme 8-<strong>koninginnen</strong><br />
Recursief: probeer koningin k te plaatsen<br />
if k > 8 then<br />
alle <strong>koninginnen</strong> geplaatst, oplossing<br />
else<br />
while niet gelukt and wel nog posities do<br />
if volgende positie (r,k) veilig then<br />
plaats koningin k op positie (r,k)<br />
probeer koningin k + 1 te plaatsen<br />
if niet gelukt then<br />
verwijder koningin k van positie (r,k)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.5/17
Voorstelling schaakbord<br />
Eerste idee<br />
8 × 8 array, component voor elk veld<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.6/17
Voorstelling schaakbord<br />
Eerste idee<br />
8 × 8 array, component voor elk veld<br />
Nodige bewerkingen<br />
bijhouden: plaats van koningin in elke kolom<br />
controleren of veld bedreigd is<br />
staat al koningin op de rij van dit veld?<br />
idem hoofddiagonaal, nevendiagonaal<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.6/17
Voorstelling schaakbord<br />
Eerste idee<br />
8 × 8 array, component voor elk veld<br />
Nodige bewerkingen<br />
bijhouden: plaats van koningin in elke kolom<br />
controleren of veld bedreigd is<br />
staat al koningin op de rij van dit veld?<br />
idem hoofddiagonaal, nevendiagonaal<br />
Niet zo eenvoudig in tweedimensionale array<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.6/17
Voorstelling schaakbord (2)<br />
Om bewerkingen eenvoudig te maken<br />
voor elke kolom: plaats van koningin<br />
bijhouden of reeds koningin geplaatst<br />
voor elke rij, hoofd- en nevendiagonaal<br />
in drie 1-dim. arrays van booleans<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.7/17
Voorstelling schaakbord (2)<br />
Om bewerkingen eenvoudig te maken<br />
voor elke kolom: plaats van koningin<br />
bijhouden of reeds koningin geplaatst<br />
voor elke rij, hoofd- en nevendiagonaal<br />
in drie 1-dim. arrays van booleans<br />
Indices in arrays<br />
rijen en kolommen: genummerd van 1 tot 8<br />
hoofddiagonalen: r − k, van −7 tot 7<br />
nevendiagonalen: r + k, van 2 tot 16<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.7/17
Genereren van alle oplossingen<br />
Recursief: probeer koningin k te plaatsen<br />
if k > 8 then<br />
een nieuwe oplossing<br />
else<br />
for alle rijen r do<br />
if volgende positie (r,k) veilig then<br />
plaats koningin k op positie (r,k)<br />
probeer koningin k + 1 te plaatsen<br />
verwijder koningin k van positie (r,k)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.8/17
Genereren van<br />
permutaties<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.9/17
Permutaties<br />
Permutaties van een rij<br />
alle mogelijke configuraties van elementen<br />
van rij<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.10/17
Permutaties<br />
Permutaties van een rij<br />
alle mogelijke configuraties van elementen<br />
van rij<br />
Voorbeeld: permutaties van (0, 1, 2, 3)<br />
(0, 1, 2, 3) (1, 0, 2, 3) (2, 0, 1, 3) (3, 0, 1, 2)<br />
(0, 1, 3, 2) (1, 0, 3, 2) (2, 0, 3, 1) (3, 0, 2, 1)<br />
(0, 2, 1, 3) (1, 2, 0, 3) (2, 1, 0, 3) (3, 1, 0, 2)<br />
(0, 2, 3, 1) (1, 2, 3, 0) (2, 1, 3, 0) (3, 1, 2, 0)<br />
(0, 3, 1, 2) (1, 3, 0, 2) (2, 3, 0, 1) (3, 2, 0, 1)<br />
(0, 3, 2, 1) (1, 3, 2, 0) (2, 3, 1, 0) (3, 2, 1, 0)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.10/17
Genereren van permutaties<br />
Basisidee<br />
elk element eens achteraan plaatsen<br />
elk overblijvend element op voorlaatste plaats<br />
enz.<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.11/17
Genereren van permutaties<br />
Basisidee<br />
elk element eens achteraan plaatsen<br />
elk overblijvend element op voorlaatste plaats<br />
enz.<br />
Implementeren<br />
via genestelde for-lussen<br />
plaats- en herstelbewerkingen<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.11/17
Voorbeeld<br />
Algoritme voor rij van lengte 3<br />
for elk element op positie 0,1,2 in rij do<br />
plaats element op positie 2<br />
for elk element op positie 0,1 in rij do<br />
plaats element op positie 1<br />
schrijf volledige rij uit<br />
herstel oude element op positie 1<br />
herstel oude element op positie 2<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.12/17
Voorbeeld<br />
Algoritme voor rij van lengte 3<br />
for elk element op positie 0,1,2 in rij do<br />
plaats element op positie 2<br />
for elk element op positie 0,1 in rij do<br />
plaats element op positie 1<br />
schrijf volledige rij uit<br />
herstel oude element op positie 1<br />
herstel oude element op positie 2<br />
Algemeen algoritme?<br />
willekeurig diep genestelde for-lussen<br />
via recursie Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.12/17
Algemeen algoritme<br />
Permutaties van lengte n > 1<br />
for elk element op positie 0 t.e.m. n − 1 do<br />
plaats element op positie n − 1<br />
genereer permutaties van lengte n − 1<br />
herstel oude element op positie n − 1<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.13/17
Algemeen algoritme<br />
Permutaties van lengte n > 1<br />
for elk element op positie 0 t.e.m. n − 1 do<br />
plaats element op positie n − 1<br />
genereer permutaties van lengte n − 1<br />
herstel oude element op positie n − 1<br />
Eindgeval: n = 1<br />
er is een nieuwe permutatie gegenereerd<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.13/17
Handelsreizigers<strong>probleem</strong><br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.14/17
Reisbureau<strong>probleem</strong><br />
Probleemstelling<br />
gegeven: n steden<br />
voor elk paar steden: kost van<br />
rechtstreekse vlucht<br />
gevraagd: bepaal rondreis die<br />
elke stad precies eenmaal aandoet<br />
zo goedkoop mogelijk<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.15/17
Reisbureau<strong>probleem</strong><br />
Probleemstelling<br />
gegeven: n steden<br />
voor elk paar steden: kost van<br />
rechtstreekse vlucht<br />
gevraagd: bepaal rondreis die<br />
elke stad precies eenmaal aandoet<br />
zo goedkoop mogelijk<br />
In grafentheorie<br />
handelsreizigers<strong>probleem</strong> (TSP)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.15/17
Handelsreizigers<strong>probleem</strong><br />
Onderstel<br />
graaf is compleet<br />
Eenvoudig exact algoritme voor TSP<br />
(par.9.4.2)<br />
exhaustief algoritme<br />
alle permutaties van n toppen bepalen<br />
rondreis met kleinste kost bijhouden<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.16/17
Handelsreizigers<strong>probleem</strong><br />
Onderstel<br />
graaf is compleet<br />
Eenvoudig exact algoritme voor TSP<br />
(par.9.4.2)<br />
exhaustief algoritme<br />
alle permutaties van n toppen bepalen<br />
rondreis met kleinste kost bijhouden<br />
Merk op<br />
TSP is een “onhandelbaar <strong>probleem</strong>”<br />
(par.2.7)<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.16/17
Handelsreizigers<strong>probleem</strong><br />
Gretige algoritmen<br />
geven benaderende oplossing<br />
evt. met performantiegarantie<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.17/17
Handelsreizigers<strong>probleem</strong><br />
Gretige algoritmen<br />
geven benaderende oplossing<br />
evt. met performantiegarantie<br />
Euclidische TSP<br />
kosten voldoen aan driehoeksongelijkheid<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.17/17
Handelsreizigers<strong>probleem</strong><br />
Gretige algoritmen<br />
geven benaderende oplossing<br />
evt. met performantiegarantie<br />
Euclidische TSP<br />
kosten voldoen aan driehoeksongelijkheid<br />
Benaderend algoritme met MST/DFS<br />
(par.10.5.2)<br />
geeft performantiegarantie 2<br />
Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.17/17