03.07.2013 Views

Acht-koninginnen- probleem

Acht-koninginnen- probleem

Acht-koninginnen- probleem

SHOW MORE
SHOW LESS

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

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

Saved successfully!

Ooh no, something went wrong!