170 likes | 342 Views
Oplossen van een doolhof. A.J.F. Kok. Oplossingsmethoden. Minst-bezochte-vakje algoritme Rechterhand-aan-de-muur algoritme Kortste-pad algoritme. Minst-bezochte vakje. Vanuit huidige punt Inspecteer alle buren Ga naar buurpunt dat minst bezocht is Als nieuwe punt = eindpunt
E N D
Oplossen van een doolhof A.J.F. Kok
Oplossingsmethoden • Minst-bezochte-vakje algoritme • Rechterhand-aan-de-muur algoritme • Kortste-pad algoritme • ..
Minst-bezochte vakje • Vanuit huidige punt • Inspecteer alle buren • Ga naar buurpunt dat minst bezocht is • Als nieuwe punt = eindpunt oplossing gevonden
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Minst-bezochte vakje • Initialisatie • Start vanuit startpunt • Zet voor ieder veld waarde “aantal bezocht” op 0 • Voor startpunt zet waarde op 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Minst-bezochte vakje • Tot eindpunt gevonden • Zoek minst bezochte buur • Ga naar buur en verhoog waarde “aantal bezocht” • Voorkeursrichting in voorbeeld: rechts, onder, links, boven 2 1 3 2 2 1 1 1 1 2 2 1 1 1 2 1 2 1 1 1 1 1
Minst-bezochte vakje • Zeer eenvoudig algoritme • Vindt gegarandeerd een pad • Inefficiënt
Rechterhand-aan-de-muur • Huid je rechterhand steeds aan de muur • Kijk steeds vanuit huidige positie of je rechtsaf kunt • Is dat mogelijk ga rechtsaf • Is het niet mogelijk ga dan voorwaarts • Is dat niet mogelijk ga dan linksaf • Is dat niet mogelijk ga dan terug
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Rechterhand-aan-de-muur • Initialisatie • Start vanuit startpositie • Zet huidige richting zodanig dat een muur aan rechterhand zit • Zet voor ieder veld waarde “bezocht” op 0 • Voor startpunt zet waarde op 1 • Opmerking: • Waarde “bezocht” alleen gebruikt voor tekenen
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Rechterhand-aan-de-muur • Totdat eindpunt gevonden • Als naar rechts bewogen kan worden, doe dat • Anders draai op huidige positie kwartslag naar links totdat wel naar rechts bewogen kan worden, en ga dan naar rechts 1 1 1 1 1 1 1 1 1 1 1 1
2 3 1 0 Rechterhand-aan-de-muur • Implementatie tip • Definieer richtingen • dx = {0, 1, 0, -1}, dy = {1, 0, -1, 0} • Bepaling nieuwe richting • (huidige richting + 3) mod 4 • Zolang niet vrij tel steeds 1 op bij richting (mod 4)
Rechterhand-aan-de-muur • Vrij eenvoudig algoritme • Oplossing alleen gegarandeerd als doolhof aan bepaalde voorwaarden voldoet: • Begin en eindpunt aan rand van doolhof • Inefficiënt
Kortste-pad • Zoek kortste pad met breadth-first search algoritme • Zolang eindpunt niet gevonden • Zoek alle nog niet eerder bezochte buurpunten en stop deze achter in lijst • Huidige punt is eerste punt op lijst • Als eindpunt is gevonden • Reconstrueer kortste pad
a b e c g a b c d h l e f i n g h i j k j m l m n o p q k o f p d q Kortste-pad a-b-e-c-g-h-l-i-n-j-m-k-o-f-p-d-q
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Kortste-pad • Initialisatie • Zet volgnummer (afstand) van alle velden op 0 • Zet volgnummer van eerste veld op 1 • Zet startpunt in lijst
1a 0b 0c 0d 2b 0e 0f 2e 6j 4h 0g 0h 0i 0j 0k 4l 0l 6m 0m 0n 0o 0p 0q Kortste-pad • Zolang eindpunt niet gevonden • Haal punt van begin lijst • Als punt is eindpunt • dan stop • Anders • Bepaal alle nog niet bezochte buren • Geef deze buren volgnummer + 1 • Stop buren achter in lijst • Reconstrueer kortste pad 3c 9d 8f 3g 5i 7k 5n 7o 8p 9q [f,p] [p,d] [h,l] [a] [o,f] [b,e] [k,o] [l,i] [m,k] [g] [j,m] [i,n] [e,c] [c,g] [n,j,m]
1 2 3 9 2 8 3 4 5 6 7 4 6 5 7 8 9 Kortste-pad • Reconstructie • Markeer kortste pad • Start bij eindpunt en zoek pad waarbij volgnummer steeds 1 afneemt
Kortste pad • Lastigste om te implementeren • Vindt gegarandeerd oplossing via kortste pad