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
Minst-bezochte vakje 1 Initialisatie Start vanuit startpunt Zet voor ieder veld waarde “aantal bezocht” op 0 Voor startpunt zet waarde op 1 1
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 1 2 2 1 3 1 2 1 1 2 1 1 1 1 2 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
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
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 1
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) 1 2 3
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-h-l-i-n-j-m-k-o-f-p-d-q Kortste-pad a b c e l g n h j i k f m q d p o a b c d e f g h i j k l m n o p q a-b-e-c-g-h-l-i-n-j-m-k-o-f-p-d-q
Kortste-pad 1 Initialisatie Zet volgnummer (afstand) van alle velden op 0 Zet volgnummer van eerste veld op 1 Zet startpunt in lijst 1
Kortste-pad 1a 0b 0c 0d 0e 0f 0g 0h 0i 0j 0k 0l 0m 0n 0o 0p 0q 2b 2e 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 1a 0b 0c 0d 0e 0f 0g 0h 0i 0j 0k 0l 0m 0n 0o 0p 0q 2b 2e 3c 9d 8f 4l 4h 3g 6j 6m 5i 7k 5n 7o 8p 9q [f,p] [p,d] [m,k] [o,f] [k,o] [h,l] [e,c] [b,e] [a] [c,g] [g] [i,n] [j,m] [l,i] [n,j,m]
Kortste-pad 1 2 3 9 8 4 5 6 7 Reconstructie Markeer kortste pad Start bij eindpunt en zoek pad waarbij volgnummer steeds 1 afneemt 1 2 3 9 8 4 5 6 7
Kortste pad Lastigste om te implementeren Vindt gegarandeerd oplossing via kortste pad