Ich habe mir angesehen, was die Jungs vom Mario AI-Wettbewerb gemacht haben, und einige von ihnen haben einige hübsche Mario-Bots mit dem A * (A-Star) Pathing-Algorithmus gebaut.
( Video von Mario A * Bot in Aktion )
Meine Frage ist, wie vergleicht sich A-Star mit Dijkstra? Wenn man sie betrachtet, scheinen sie ähnlich zu sein.
Warum sollte jemand einen über den anderen verwenden? Besonders im Zusammenhang mit dem Pathing in Spielen?
Antworten:
Dijkstra ist ein Sonderfall für A * (wenn die Heuristik Null ist).
quelle
Dijkstra:
Es hat eine Kostenfunktion, die den tatsächlichen Kostenwert von der Quelle zu jedem Knoten darstellt :
f(x)=g(x)
.Es findet den kürzesten Weg von der Quelle zu jedem anderen Knoten, indem nur die tatsächlichen Kosten berücksichtigt werden.
Eine Suche:
Es hat zwei Kostenfunktionen.
g(x)
: wie Dijkstra. Die tatsächlichen Kosten, um einen Knoten zu erreichenx
.h(x)
: ungefähre Kosten von Knotenx
zu Zielknoten. Es ist eine heuristische Funktion. Diese heuristische Funktion sollte die Kosten niemals überschätzen. Das heißt, die tatsächlichen Kosten für das Erreichen des Zielknotens von Knotenx
sollten größer oder gleich seinh(x)
. Es heißt zulässige Heuristik.Die Gesamtkosten jedes Knotens werden von berechnet
f(x)=g(x)+h(x)
Eine * Suche erweitert einen Knoten nur, wenn er vielversprechend erscheint. Es konzentriert sich nur darauf, den Zielknoten vom aktuellen Knoten aus zu erreichen, nicht alle anderen Knoten. Es ist optimal, wenn die heuristische Funktion zulässig ist.
Wenn Ihre heuristische Funktion also gut ist, um die zukünftigen Kosten zu schätzen, müssen Sie viel weniger Knoten als Dijkstra untersuchen.
quelle
Was das vorherige Poster gesagt hat, und weil Dijkstra keine Heuristik hat und bei jedem Schritt Kanten mit den geringsten Kosten auswählt, neigt es dazu, mehr von Ihrem Diagramm "abzudecken". Aus diesem Grund könnte Dijkstra nützlicher sein als A *. Ein gutes Beispiel ist, wenn Sie mehrere Kandidatenzielknoten haben, aber nicht wissen, welcher am nächsten liegt (in A * müssten Sie ihn mehrmals ausführen: einmal für jeden Kandidatenknoten).
quelle
Der Dijkstra-Algorithmus würde niemals zur Pfadfindung verwendet werden. Die Verwendung von A * ist ein Kinderspiel, wenn Sie eine anständige Heuristik erstellen können (normalerweise einfach für Spiele, insbesondere in 2D-Welten). Abhängig vom Suchraum ist die iterative Vertiefung A * manchmal vorzuziehen, da weniger Speicher benötigt wird.
quelle
Dijkstra ist ein Sonderfall für A *.
Dijkstra findet die Mindestkosten vom Startknoten zu allen anderen. A * ermittelt die Mindestkosten vom Startknoten zum Zielknoten.
Der Dijkstra-Algorithmus würde niemals zur Pfadfindung verwendet werden. Mit A * kann man eine anständige Heuristik erstellen. Abhängig vom Suchraum ist iteratives A * vorzuziehen, da es weniger Speicher benötigt.
Der Code für den Dijkstra-Algorithmus lautet:
Der Code für den A * -Algorithmus lautet:
quelle
Dijkstra findet die Mindestkosten vom Startknoten zu allen anderen. A * ermittelt die Mindestkosten vom Startknoten zum Zielknoten.
Daher scheint Dijkstra weniger effizient zu sein, wenn Sie nur den Mindestabstand von einem Knoten zum anderen benötigen.
quelle
Sie können A * als geführte Version von Dijkstra betrachten. Das heißt, anstatt alle Knoten zu erkunden, verwenden Sie eine Heuristik, um eine Richtung auszuwählen.
Genauer gesagt, wenn Sie die Algorithmen mit einer Prioritätswarteschlange implementieren, hängt die Priorität des Knotens, den Sie besuchen, von den Kosten (Kosten der vorherigen Knoten + Kosten, um hierher zu gelangen) und der heuristischen Schätzung von hier aus ab zum Ziel. In Dijkstra wird die Priorität nur durch die tatsächlichen Kosten für die Knoten beeinflusst. In beiden Fällen erreicht das Stoppkriterium das Ziel.
quelle
Dijkstras Algorithmus findet definitiv den kürzesten Weg. Andererseits hängt A * von der Heuristik ab. Aus diesem Grund ist A * schneller als der Dijkstra-Algorithmus und liefert gute Ergebnisse, wenn Sie eine gute Heuristik haben.
quelle
Wenn Sie sich den Pseudocode für Astar ansehen :
Wenn Sie sich für Dijkstra dasselbe ansehen :
Der Punkt ist also, dass Astar einen Knoten nicht mehr als einmal bewertet,
da es aufgrund
seiner Heuristik der Ansicht ist, dass ein einmaliger Blick auf einen Knoten ausreichend ist .
OTOH, Dijkstras Algorithmus scheut sich nicht, sich selbst zu korrigieren, falls
ein Knoten erneut auftaucht.
Dadurch sollte Astar schneller und besser für die Wegfindung geeignet sein.
quelle
In A * überprüfen Sie für jeden Knoten die ausgehenden Verbindungen auf ihre.
Für jeden neuen Knoten berechnen Sie die bisher niedrigsten Kosten (csf) in Abhängigkeit von der Gewichtung der Verbindungen zu diesem Knoten und den Kosten, die Sie zum Erreichen des vorherigen Knotens hatten.
Zusätzlich schätzen Sie die Kosten vom neuen Knoten zum Zielknoten und fügen diese der CSF hinzu. Sie haben jetzt die geschätzten Gesamtkosten (usw.). (etc = csf + geschätzte Entfernung zum Ziel) Als nächstes wählen Sie aus den neuen Knoten den mit dem niedrigsten usw. aus.
Machen Sie dasselbe wie zuvor, bis einer der neuen Knoten das Ziel ist.
Dijkstra funktioniert fast genauso. Abgesehen davon, dass die geschätzte Entfernung zum Ziel immer 0 ist und der Algorithmus zuerst stoppt, wenn das Ziel nicht nur einer der neuen Knoten ist , sondern auch der mit dem niedrigsten csf.
A * ist normalerweise schneller als dijstra, obwohl dies nicht immer der Fall ist. In Videospielen bevorzugen Sie häufig den Ansatz "nah genug für ein Spiel". Daher reicht normalerweise der optimale Pfad "nah genug" von A * aus.
quelle
Der Dijkstra-Algorithmus ist definitiv vollständig und optimal, sodass Sie immer den kürzesten Weg finden. Es dauert jedoch tendenziell länger, da es hauptsächlich zum Erkennen mehrerer Zielknoten verwendet wird.
A* search
Auf der anderen Seite geht es um heuristische Werte, die Sie definieren können, um Ihr Ziel näher zu erreichen, z. B. die Entfernung von Manhattan zum Ziel. Es kann entweder optimal oder vollständig sein, was von heuristischen Faktoren abhängt. Es ist definitiv schneller, wenn Sie einen einzelnen Zielknoten haben.quelle