A*-algoritme
A*, uitgesproken als A-star of A-ster, is een algoritme om in een graaf de kortste weg te vinden tussen twee knopen in die graaf. Het algoritme zoekt een pad van een beginknoop naar een eindknoop door middel van een heuristische schatting, die elke knoop rangschikt volgens een schatting van de beste route door die knoop. Het algoritme gaat de knopen in de zo bepaalde volgorde na. Het werd in 1968 voor het eerst beschreven door Peter Hart, Nils Nilsson en Bertram Raphael.
Intuïtief
bewerkenStel bij wijze van voorbeeld dat je op een kruispunt A staat en je naar kruispunt B wil gaan. In dit geval zijn de kruispunten de knopen en de wegen de zijden van de graaf. Wanneer men een breadth-first search uitvoert, zoals het kortstepad-algoritme doet, zou men eerst alle punten afzoeken binnen een vaste straal van het begin, en zo stap voor stap de cirkel uitbreiden naar verder gelegen punten. Dit kan een efficiënte strategie zijn wanneer je niet weet waar de bestemming zich bevindt.
Met deze methode gaat tijd verloren in het geval er meer informatie voorhanden is, bijvoorbeeld wanneer bekend is dat het doel naar het noorden ligt. Een betere strategie bestaat er dan in eerst het kruispunt direct ten noorden van de huidige locatie te bezoeken, omdat dit kruispunt immers dichter bij punt B zal liggen. Wanneer de wegen goed liggen kan je zo verder kruispunten afzoeken die steeds dichter bij de bestemming B liggen. Af en toe kan men even op zijn stappen moeten terugkomen, maar op typische kaarten is dit een snelle strategie. Bovendien kan bewezen worden dat deze strategie de best mogelijke route zal vinden, net als een breadth-first search. Dit principe vormt de essentie van het A*-algoritme.
Er is echter geen enkele garantie dat het A*-algoritme beter presteert dan een eenvoudiger zoekalgoritme. In een omgeving die op een doolhof lijkt, kan bijvoorbeeld de enige weg naar de bestemming zo liggen dat men eerst een stuk zuidwaarts moet gaan eer men een bocht naar het noorden maakt. In dit geval zal het verkennen van de knopen in het noorden, die op de kaart dichter bij de bestemming liggen, aanvankelijk wat tijd kosten.
Beschrijving
bewerkenHet A*-algoritme begint in een geselecteerde knoop. A* schat dan de afstand vanaf de huidige knoop tot de bestemming. Dat kan goed wanneer het om twee plaatsen op een kaart gaat. Deze schatting ligt aan de basis van de heuristiek van het algoritme. A* kiest daarna een knoop die aangrenzend aan de beginknoop, die vermoedelijk ongeveer in de richting van de eindknoop ligt en schat de afstand van deze nieuwe knoop naar de eindknoop. De nieuwe knoop wordt vervolgens toegevoegd in een prioriteitswachtlijn.
Het algoritme haalt vervolgens een knoop uit de prioriteitswachtlijn. Door de werking van deze wachtlijn zal dit de knoop met de laagste heuristiek zijn. Wanneer de wachtlijn leeg is, is er geen pad van de beginknoop naar de eindknoop en stopt het algoritme. Is de knoop die uit de prioriteitswachtlijn gehaald wordt de eindknoop, dan reconstrueert A* het succesvolle pad, geeft het weer en stopt. Deze reconstructie van het pad uit de opgeslagen gesloten knopen betekent dat het niet nodig is om het voorlopig pad op te slaan in elke knoop.
Wanneer de knoop die uit de wachtlijn gehaald wordt niet de eindknoop is, worden nieuwe knopen gecreëerd voor alle aanvaardbare aangrenzende knopen. De manier waarop dit precies gebeurt hangt af van het specifieke probleem. Voor elk van die knopen berekent A* de afstand naar de knoop en slaat deze in de knoop op.
Het algoritme houdt een lijst bij met knopen die zijn gecontroleerd. Wanneer een nieuwe knoop al in de lijst staat, die dichter bij de beginknoop ligt, wordt het laatste pad vergeten. Wanneer de nieuwe knoop al in deze lijst staat, maar nu dichterbij is komen te liggen, wordt dat gecorrigeerd en vanaf die knoop verder gerekend. Er wordt weer een schatting van de afstand van de knoop naar de eindknoop gemaakt en deze wordt bij de gevonden afstand opgeteld. opgeteld. De knoop komt ook hoger in de prioriteitswachtlijn toegevoegd.
Wanneer deze stappen voor alle aan een gegeven knoop grenzende knopen zijn herhaald, kan die knoop uit de prioriteitswachtrij worden geschrapt en aan de lijst met knopen en hun afstand tot de beginknoop worden toegevoegd. Vervolgens haalt men de volgende knoop uit de prioriteitswachtlijn en wordt deze methode herhaald. Het gaat op deze manier door totdat de knoop die uit de prioriteitswachtlijn wordt gehaald de eindknoop is.
Literatuur
bewerken- (en) PE Hart, NJ Nilsson en B Raphael. A Formal Basis for the Heuristic Determination of Minimum Cost Paths, 1968. voor IEEE Transactions on Systems Science and Cybernetics SSC4, 2, blz 100-107
- (en) PE Hart, NJ Nilsson en B Raphael. Correction to "A Formal Basis for the Heuristic Determination of Minimum Cost Paths, SIGART Newsletter, 37, pp. 28-29, 1972.
- (en) NJ Nilsson. Principles of Artificial Intelligence, 1980.
Websites
bewerken- (en) A* Pathfinding for Beginners, 18 juli 2005.