web-dev-qa-db-de.com

Ist A * der beste Pfadfindungsalgorithmus?

Es wird allgemein gesagt, dass A * der beste Algorithmus ist, um Pfadfindungsprobleme zu lösen.

Gibt es eine Situation, in der A * nicht der beste Algorithmus ist, um eine Lösung zu finden?

Wie gut ist A * im Vergleich zu BFS, DFS, UCS, etc?

25
Zombie

Die kurze Antwort lautet ja, es gibt Situationen, in denen A * nicht der beste Algorithmus ist, um ein Problem zu lösen. Es gibt jedoch eine Reihe von Möglichkeiten, zu beurteilen, was den besten Algorithmus für das Finden einer Lösung ausmacht. 

Wenn Sie best in Bezug auf Leistung mehrerer Suchvorgänge von einer einzigen Quelle zu vielen Zielen in Betracht ziehen, sollten Sie einen geeigneteren Ansatz in Betracht ziehen ( Dijkstra-Algorithmus ).

Wenn Sie am besten in Bezug auf performance in Betracht ziehen, werden DFS und BFS in einigen speziellen Fällen A * deutlich übertreffen. Erfahrungsgemäß ist dies für sehr kleine, fast triviale Diagramme der Fall, erfordert aber sorgfältige Tests und Profilerstellung, um eine stärkere Aussage treffen zu können.

Wenn Sie best in Bezug auf path-length betrachten, dh wie lang der durch den Algorithmus erzeugte endgültige Pfad ist, dann ist A * einem anderen optimalen Suchalgorithmus gleichwertig.

Wenn Sie best in Bezug auf Vollständigkeit betrachten, wird der Algorithmus also immer einen Pfad zum Ziel finden, wenn ein solcher Pfad vorhanden ist. Wenn ja, dann ist A * einem beliebigen anderen vollständigen Algorithmus gleichwertig (z. B. Breitensuche).

Wenn Sie best in Betracht ziehen, wenn einige der Gewichte in der Grafik negativ sind , müssen Sie einen speziellen Algorithmus verwenden, um diese Probleme zu lösen (z. B. bellman- ford )

Wenn Sie am besten in Betracht ziehen, in denen die keine Heuristik verfügbar ist , müssen Sie auf h(x,y)=0 forall states x and y zurückgreifen. In diesem Fall entspricht A * der besten ersten Suche.

Wenn Sie best in Fällen in Verbindung mit der Bewegungsplanung in fortlaufende Konfigurationsräume erwägen, funktioniert A * möglicherweise in niedrigen Dimensionen, aber die Speicherung des Suchgraphen wird im oberen Bereich unpraktisch Dimensionen, und die Notwendigkeit, probabilistisch vollständige Algorithmen zu verwenden, nimmt zu (zum Beispiel RRT , Bi-RRT, RDT)

Wenn Sie best in Betracht ziehen, in dem der Graph partiell beobachtbar ist, kennen Sie zu jeder Zeit nur eine Teilmenge aller möglichen Scheitelpunkte und Kanten innerhalb des Graphen, und Sie müssen dies ändern Um mehr von dem Graphen zu beobachten, benötigen Sie einen alternativen Algorithmus, der dafür entwickelt wurde (zum Beispiel macht Keonigs lebenslange Planung A *, LPA * genau dies).

Wenn Sie best in Fällen in Betracht ziehen, in denen sich der Graph im Laufe der Zeit ändert, was in der Robotik häufig auftritt, wenn Sie bewegliche Hindernisse einbauen, benötigen Sie einen Algorithmus, der dafür ausgelegt ist (z. B.) Stentz's D * oder Koenig & Likhachevs D * -Lite).

71
Andrew Walker

Ein * ist etwas Besonderes, da es in andere Wegfindungsalgorithmen umgewandelt werden kann, indem es mit der Auswertung der Knoten und der verwendeten Heuristiken spielt. Sie können dies tun, um Djikstras Suche nach der besten zuerst, breiten Suche und tiefen Suche zu simulieren. 

Darüber hinaus ist es oft einfach, es zu beschleunigen. Wenn Sie beispielsweise eine zulässige Heuristik mit einer Konstanten c multiplizieren, können Sie garantieren, dass die Kosten für die resultierende Folge von Knoten das c-fache des optimalen Ergebnisses nicht überschreiten.

Nehmen Sie zum Beispiel diese awesome paper von Ian Davis (geschrieben für Star Trek Armada). Ein * wird mit einem hierarchischen Satz von Wegpunkten verwendet, was zu einem groben Pfad führt. DANN, um den Pfad zu glätten, führen sie A * erneut in einem neuen, generierten Graphen aus, der die Knoten auf dem Pfad und die benachbarten Knoten enthält, um einen sinnvolleren Pfad zu erhalten. Zum Schluss werden Gummibänder ausgeführt, um redundante Knoten zu entfernen.

A * ist also nicht die Lösung für alles, aber es ist ein sehr vielseitiges Werkzeug.

6
sjdlgjsljg

Eine extrem einfache Alternative (kein Streit mit Heuristiken) ist Collaborative Diffusion . Es funktioniert hervorragend, wenn Sieein Zieloderbeliebiges Mitglied einer Gruppe wahllosanvisieren müssen und in diesem Fall schneller sein können als A *. Es ahmt das Spiel "Du wirst wärmer/kälter" nach.

Durch kollaborative Diffusion wird eine Heatmap für jede "Gruppe" erstellt, die Sie als Ziel festlegen möchten. Wenn Sie ein bestimmtes Ziel verfolgen möchten, behandeln Sie es als eigene Gruppe, indem Sie eine Heatmap nur für dieses Ziel erstellen. Die Domäne von Collaborative Diffusion besteht aus Spielen wie Fußball (bei denen beide Agententeams den Ball und die Torpfosten gezielt verfolgen, was zu nur 3 Einflusskarten führt) oder Pacman (ähnliche, mehrere Agenten, die Pac verfolgen) oder Armeespiele, bei denen es eine kombinierte Heatmap gibt, die den Körper repräsentiert ( Aggregat) jeder Armee, wie von jedem Agenten in dieser Armee bestimmt, so dass eine Armee sich "der anderen Armee" und nicht "bestimmten Einheiten innerhalb der anderen Armee" nähern kann. Diese Allgemeinheit kann eine erhöhte Leistung bieten.

Das Wandern besteht aus Bergsteigen (von der aktuellen Zelle zu einer wärmeren Nachbarzelle), bis wir das Ziel erreichen (heißester Punkt). Der Ansatz behandelt implizit bewegliche Hindernisse, d. H. Andere Agenten.

Es ist am besten geeignet, wenn Karten mit vielen sich bewegenden Einheiten ziemlich dicht besetzt sind. Dies rechtfertigt die umfassende Verbreitung, die bei jeder Aktualisierung im gesamten Suchraum auftreten muss. Es ist klar, wie ein gut abgestimmter A * -Ansatz in einer großen, spärlichen Karte, in der nur eine Einheit nur eine andere Einheit anvisiert, um eine Größenordnung billiger sein kann, da mit A * in diesem Fall nur an einem Bruch gearbeitet wird von Kartenkacheln zwischen dem Sucher und dem Ziel; Mit Collaborative Diffusion dagegen verbreiten Sie die gesamte Karte, um dasselbe zu tun, was sie viel teurer macht.

4
Engineer

Ich sehe, die Frage ist alt, aber wahrscheinlich wird diese praktische Lösung für jemanden nützlich sein. Kürzlich fand ich sehr netten Open-Source-Code in Python geschrieben

code enthält die nächsten Pfadfindungsalgorithmen:

  • EIN*
  • Dijkstra
  • Best-First
  • Bidirektionales A *
  • Breite erste Suche (BFS)
  • Iteratives Deeping A * (IDA *)

wenn Sie die Matrixgröße und -werte ändern, können Sie einen Unterschied zwischen den verschiedenen Algorithmen zur Pfadfindung feststellen. Wie in Wikipedia erwähnt: "A * ist vollständig und wird immer eine Lösung finden, wenn eine existiert"

0
zviad