Detaillierte Erklärung des A * -Algorithmus (großartig)

Überblick

Obwohl Leute, die den A * -Algorithmus beherrschen, denken, dass es einfach ist, ist der A * -Algorithmus für Anfänger immer noch sehr kompliziert.

Der Suchbereich

Nehmen wir an, jemand möchte von Punkt A nach Punkt B wechseln, aber die beiden Punkte sind durch eine Wand getrennt. Wie in Abbildung 1 gezeigt, ist das Grün A, das Rot B und das mittlere Blau die Wand.
Schreiben Sie hier eine Bildbeschreibung
Abbildung 1

Sie sollten bemerkt haben, dass wir den Suchbereich in quadratische Gitter unterteilt haben. Dies ist der erste Schritt bei der Pfadfindung, bei dem der Suchbereich vereinfacht wird, genau wie hier. Diese spezielle Methode reduziert unseren Suchbereich auf ein zweidimensionales Array. Jedes Element im Array stellt ein Raster dar, und sein Status ist begehbar und nicht begehbar. Durch Berechnen, welche Quadrate von A nach B gelaufen werden müssen, wird der Pfad gefunden. Sobald der Pfad gefunden ist, bewegt sich der Charakter von der Mitte eines Quadrats zur Mitte eines anderen Quadrats, bis er das Ziel erreicht.

Der Mittelpunkt des Quadrats wird "Knoten" genannt. Wenn Sie andere Artikel über A * -Pfadfindungsalgorithmen lesen, werden Sie feststellen, dass häufig über Knoten diskutiert wird. Warum nicht einfach als Quadrat beschreiben? Da es uns beispielsweise möglich ist, den Suchbereich in andere Mehrfachverformungen anstelle von Quadraten zu unterteilen, kann es sich um hexagonale, rechteckige oder sogar beliebige Mehrfachverformungen handeln. Die Knoten können in einem beliebigen Polygon platziert werden, sie können in der Mitte mehrerer Verformungen oder an den Seiten des Polygons platziert werden. Wir verwenden dieses System, weil es das einfachste ist.

Sobald wir den Suchbereich wie oben beschrieben auf eine Reihe quantifizierbarer Knoten reduziert haben, müssen wir als Nächstes den kürzesten Weg finden. In A * beginnen wir am Startpunkt, überprüfen die angrenzenden Quadrate und erweitern uns dann, bis wir das Ziel finden.

Wir beginnen unsere Wegfindung wie folgt:

  1. Beginnen Sie am Startpunkt A und fügen Sie ihn einer offenen Liste aus Quadraten hinzu. Diese offene Liste ist ein bisschen wie eine Einkaufsliste. Natürlich gibt es nur ein Element in der offenen Liste, das der Ausgangspunkt A ist, und weitere Elemente werden später hinzugefügt. Das Raster in der Liste "Offen" zeigt an, dass der Pfad möglicherweise auf dem Weg verläuft oder nicht. Grundsätzlich ist die offene Liste eine karierte Liste.

  2. Überprüfen Sie die Quadrate neben dem Startpunkt A (ignorieren Sie die von den Mauern besetzten Quadrate, die vom Fluss besetzten Quadrate und die von anderem illegalen Gelände besetzten Quadrate) und wählen Sie die begehbaren oder erreichbaren aus Das Quadrat wird auch zur offenen Liste hinzugefügt. Setzen Sie den Startpunkt A auf das übergeordnete Element (übergeordneter Knoten oder übergeordnetes Quadrat) dieser Quadrate. Wenn wir den Pfad verfolgen, ist der Inhalt dieser übergeordneten Knoten sehr wichtig. Ich werde es später erklären.

  3. Entfernen Sie A aus der geöffneten Liste und fügen Sie es der geschlossenen Liste (geschlossene Liste) hinzu. Jedes Quadrat in der geschlossenen Liste wird nicht mehr benötigt.

Wie in der folgenden Abbildung gezeigt, ist das dunkelgrüne Quadrat der Ausgangspunkt, und sein äußerer Rahmen ist hellblau, was darauf hinweist, dass das Quadrat zur Abschlussliste hinzugefügt wurde. Die daneben liegenden schwarzen Quadrate müssen überprüft werden, und ihr Rahmen ist hellgrün. Jedes schwarze Quadrat hat einen grauen Zeiger, der auf den übergeordneten Knoten zeigt. Hier ist der Startpunkt A.
Schreiben Sie hier eine Bildbeschreibung
Figur 2 .

Als nächstes müssen wir ein Quadrat neben dem Startpunkt A aus der offenen Liste auswählen und die vorherigen Schritte mehr oder weniger wie unten beschrieben wiederholen. Aber welches Quadrat soll man wählen? Der mit dem kleinsten F-Wert.

Pfadsortierung

Der Schlüssel zur Berechnung der Quadrate, aus denen der Pfad besteht, ist die folgende Gleichung:

F = G + H.

Hier,

G = Die Kosten für die Bewegung vom Startpunkt A zum angegebenen Quadrat entlang des Pfades, der zum Erreichen des Quadrats generiert wurde.

H = Die geschätzten Kosten für den Übergang vom angegebenen Quadrat zum Endpunkt B. Dies wird oft als Heuristik bezeichnet, was etwas verwirrend ist. Warum heißt es so, weil es eine Vermutung ist. Wir werden die wahre Entfernung erst kennen, wenn wir den Weg gefunden haben, da sich auf dem Weg verschiedene Dinge (wie Mauern, Wasser usw.) befinden. In diesem Tutorial lernen Sie eine Methode zur Berechnung von H kennen. Weitere Methoden finden Sie auch im Internet.

Unser Pfad wird folgendermaßen generiert: wiederholt die offene Liste durchlaufen und das Quadrat mit dem kleinsten F-Wert auswählen. Dieser Vorgang wird später ausführlich beschrieben. Schauen wir uns zunächst an, wie die obige Gleichung berechnet wird.

Wie oben erwähnt, sind G die Kosten für den Übergang vom Startpunkt A zum angegebenen Quadrat. In diesem Beispiel betragen die horizontalen und vertikalen Bewegungskosten 10 und die diagonalen Bewegungskosten 14. Diese Daten werden verwendet, weil die tatsächliche diagonale Bewegungsentfernung die Quadratwurzel von 2 oder ungefähr das 1,414-fache der horizontalen oder vertikalen Bewegungskosten ist. 10 und 14 werden der Einfachheit halber verwendet. Das Verhältnis stimmt, wir vermeiden offene und dezimale Berechnungen. Es ist nicht so, dass wir diese Fähigkeit nicht haben oder Mathematik nicht mögen. Die Verwendung dieser Nummern kann den Computer auch schneller machen. Sie werden später feststellen, dass der Pfadfindungsalgorithmus sehr langsam ist, wenn Sie diese Techniken nicht verwenden.

Da wir den G-Wert entlang des Pfades zum angegebenen Quadrat berechnen, müssen Sie den G-Wert des Quadrats berechnen, indem Sie den G-Wert seines Vaters ermitteln und dann 10 addieren oder je nachdem, ob sich der Vater in einer geraden Linie oder in einer diagonalen Richtung befindet 14. Wenn wir den Startpunkt verlassen und mehr Quadrate erhalten, wird diese Methode klarer.

Es gibt viele Möglichkeiten, den Wert von H zu schätzen. Hier verwenden wir Manhattans Methode, um die Anzahl der Quadrate vom aktuellen Quadrat horizontal oder vertikal zum Ziel zu berechnen, die diagonale Bewegung zu ignorieren und dann die Summe mit 10 zu multiplizieren. Es wird als Manhattan-Methode bezeichnet, da es der Anzahl der Blöcke ähnelt, die Sie von einem Ort zum anderen überqueren, und Sie die Blöcke nicht diagonal überqueren können. Es ist wichtig, H zu berechnen, um Hindernisse auf dem Weg zu ignorieren. Dies ist eine Schätzung der verbleibenden Entfernung, nicht des tatsächlichen Werts, daher wird sie als Heuristik bezeichnet.

Addiere G und H, um F zu erhalten. Das Ergebnis unseres ersten Schritts ist in der folgenden Abbildung dargestellt. Jedes Quadrat ist mit dem Wert F, G, H markiert, genau wie das Quadrat rechts vom Startpunkt, die obere linke Ecke ist F, die untere linke Ecke ist G und die untere rechte Ecke ist H.
Schreiben Sie hier eine Bildbeschreibung
Bild 3

Okay, jetzt schauen wir uns einige der Quadrate an. In dem mit Buchstaben gekennzeichneten Feld ist G = 10. Dies liegt daran, dass vom Startpunkt in horizontaler Richtung nur ein Quadrat vorhanden ist. Die oberen, unteren und linken Quadrate direkt neben dem Startpunkt haben G-Werte von 10 und die diagonalen Quadrate haben G-Werte von 14.

Der H-Wert wird erhalten, indem der Manhattan-Abstand vom Startpunkt zum Endpunkt (rotes Quadrat) geschätzt wird, sich nur horizontal und vertikal bewegt und die Wände auf dem Weg ignoriert werden. Auf diese Weise gibt es einen Abstand von 3 Quadraten vom Quadrat rechts vom Startpunkt zum Endpunkt, also H = 30. Es gibt 4 Quadrate vom Quadrat über diesem Quadrat bis zum Endpunkt (beachten Sie, dass nur die horizontalen und vertikalen Abstände berechnet werden), also H = 40. Für andere Quadrate können Sie dieselbe Methode verwenden, um zu wissen, wie der H-Wert abgeleitet wird.

Der F-Wert jedes Quadrats, sagen wir noch einmal, addieren Sie einfach den G-Wert und den H-Wert direkt.

Um die Suche fortzusetzen, wählen wir den (quadratischen) Knoten mit dem kleinsten F-Wert aus der geöffneten Liste aus und führen dann die folgenden Operationen für das ausgewählte Quadrat aus:

  1. Nehmen Sie es aus der offenen Liste und setzen Sie es in die geschlossene Liste.

  2. Überprüfen Sie alle angrenzenden Felder, ignorieren Sie die Felder in der Abschlussliste oder gehen Sie nicht (wie Wände, Wasser oder anderes illegales Gelände). Wenn sich die Felder nicht im offenen Bereich befinden, setzen Sie sie Treten Sie der offenen Liste bei.

Legen Sie unser ausgewähltes Quadrat als Vater dieser neu hinzugefügten Quadrate fest.

  1. Wenn ein benachbartes Quadrat bereits in der offenen Liste enthalten ist, prüfen Sie, ob dieser Pfad besser ist, dh ob das Erreichen dieses Quadrats über das aktuelle Quadrat (das von uns ausgewählte Quadrat) einen kleineren G-Wert hat. Wenn nicht, nichts tun.

Wenn im Gegensatz dazu der G-Wert kleiner ist, setzen Sie das übergeordnete Element dieses Quadrats auf das aktuelle Quadrat (das von uns ausgewählte Quadrat) und berechnen Sie dann die F- und G-Werte dieses Quadrats neu. Wenn Sie immer noch verwirrt sind, sehen Sie sich bitte das Bild unten an.
Schreiben Sie hier eine Bildbeschreibung
Figur 4

Ok, mal sehen, wie es funktioniert. Von unseren ersten 9 Feldern befinden sich 8 in der offenen Liste, und der Startpunkt befindet sich in der geschlossenen Liste. Unter diesen Quadraten hat das Quadrat rechts vom Startpunkt den kleinsten F-Wert von 40, daher wählen wir dieses Quadrat als nächstes zu verarbeitendes Quadrat. Sein Rahmen ist mit blauen Linien hervorgehoben.

Zuerst verschieben wir es von der offenen Liste in die geschlossene Liste (deshalb wird es mit einer blauen Linie hervorgehoben). Dann überprüfen wir das Quadrat daneben. Das Quadrat rechts davon ist die Wand, die wir ignorieren. Das Quadrat links davon ist der Startpunkt, der in der Abschlussliste ebenfalls ignoriert wird. Die anderen 4 benachbarten Quadrate befinden sich in der offenen Liste. Wir müssen prüfen, ob der Weg dorthin durch dieses Quadrat besser ist, und den G-Wert verwenden, um zu bestimmen. Schauen wir uns das Quadrat oben an. Es hat jetzt einen G-Wert von 14. Wenn wir über das aktuelle Quadrat dorthin gelangen, beträgt der G-Wert 20 (wobei 10 der G-Wert ist, um das aktuelle Quadrat zu erreichen, plus der G-Wert 10, der sich vom aktuellen Quadrat zum oberen Quadrat bewegt). Offensichtlich ist 20 größer als 14, daher ist dies nicht der optimale Weg. Wenn Sie sich das Bild ansehen, werden Sie verstehen. Es ist besser, sich diagonal vom Startpunkt zu diesem Quadrat zu bewegen, als es horizontal und dann vertikal zu bewegen.

Nachdem Sie alle vier benachbarten Quadrate in der offenen Liste überprüft haben, wird kein besserer Pfad durch das aktuelle Quadrat gefunden, sodass wir keine Änderungen vornehmen. Nachdem wir alle benachbarten Quadrate des aktuellen Quadrats überprüft und verarbeitet haben, ist es Zeit, das nächste zu verarbeitende Quadrat auszuwählen.

Also durchlaufen wir unsere offene Liste erneut und jetzt hat sie nur noch 7 Quadrate. Wir müssen das mit dem kleinsten F-Wert auswählen. Interessant ist, dass es diesmal zwei Quadrate mit F-Werten von 54 gibt. Welches sollten Sie wählen? Es spielt keine Rolle. In Bezug auf die Geschwindigkeit ist es schneller, das Quadrat auszuwählen, das zuletzt zur offenen Liste hinzugefügt wird. Dies führt zu der Präferenz, zuerst neu gefundene Quadrate zu verwenden, wenn Sie sich während des Pfadfindungsprozesses dem Ziel nähern. Das ist aber nicht wichtig. (Unterschiedliche Behandlung derselben Daten führt dazu, dass die beiden Versionen von A * unterschiedliche Pfade gleicher Länge finden.)

Wir wählen das Quadrat unten rechts am Startpunkt aus, wie in der folgenden Abbildung gezeigt.
Schreiben Sie hier eine Bildbeschreibung
Abbildung 5

Wenn wir diesmal die angrenzenden Quadrate überprüfen, stellen wir fest, dass das Quadrat rechts eine Wand ist. Ignorieren Sie es also. Gleiches gilt für das oben Gesagte.

Wir ignorieren auch ein Quadrat unter der Wand. Warum? Denn wenn Sie die Ecke nicht überqueren, können Sie nicht direkt vom aktuellen Quadrat zu diesem Quadrat wechseln. Sie müssen zuerst nach unten gehen und dann zu diesem Feld gehen, um um die Ecke zu kommen. (Hinweis: Die Regel zum Überqueren der Ecke ist optional und hängt davon ab, wie Ihre Knoten platziert sind.)

Dies lässt 5 benachbarte Quadrate übrig. Die beiden Quadrate unter dem aktuellen Quadrat wurden nicht zur offenen Liste hinzugefügt. Fügen Sie sie daher hinzu und legen Sie das aktuelle Quadrat als ihren Vater fest. Von den verbleibenden 3 Quadraten befinden sich 2 bereits in der Abschlussliste (eines ist der Startpunkt, das andere ist das Quadrat über dem aktuellen Quadrat, der äußere Rahmen ist hervorgehoben), wir ignorieren sie. Das letzte Quadrat, das das Quadrat links vom aktuellen Quadrat ist, prüfen wir, ob es einen kleineren G-Wert gibt, der durch das aktuelle Quadrat erreicht werden kann. Nein. Wir sind also bereit, das nächste zu verarbeitende Quadrat aus der offenen Liste auszuwählen.

Wiederholen Sie diesen Vorgang, bis der Endpunkt ebenfalls zur geöffneten Liste hinzugefügt wird (siehe Abbildung unten).
Schreiben Sie hier eine Bildbeschreibung
Bild 6

Beachten Sie, dass sich der Vater des Quadrats 2 Quadrate unterhalb des Startpunkts vom vorherigen unterscheidet. Zuvor war sein G-Wert 28 und er zeigte auf das Quadrat oben rechts. Jetzt ist sein G-Wert 20 und er zeigt auf das Quadrat direkt darüber. Dies geschieht irgendwo im Pfadfindungsprozess, wenn der neue Pfad verwendet wird, der G-Wert überprüft wird und niedriger wird, sodass der übergeordnete Knoten zurückgesetzt wird und die G- und F-Werte neu berechnet werden. Obwohl diese Änderung in diesem Beispiel nicht wichtig ist, kann diese Änderung in vielen Fällen zu großen Änderungen der Pfadfindungsergebnisse führen.

Wie bestimmen wir den tatsächlichen Pfad? Es ist sehr einfach: Beginnen Sie am Ende und drücken Sie den Pfeil, um zum übergeordneten Knoten zu gelangen, sodass Sie zum Startpunkt zurückkehren. Dies ist Ihr Pfad. Wie nachfolgend dargestellt. Wenn Sie sich vom Startpunkt A zum Endpunkt B bewegen, bewegen Sie sich einfach von der Mitte eines Quadrats auf dem Weg zur Mitte eines anderen Quadrats zum Ziel. So einfach ist das!
Schreiben Sie hier eine Bildbeschreibung
Abbildung 7

A * Algorithmus Zusammenfassung (Zusammenfassung der A * Methode)

Ok, jetzt haben Sie die gesamte Einführung gelesen, jetzt haben wir alle Schritte zusammengestellt:

  1. Fügen Sie den Startpunkt zur offenen Liste hinzu.

  2. Wiederholen Sie den folgenden Vorgang:

a. Durchlaufen Sie die geöffnete Liste, suchen Sie den Knoten mit dem kleinsten F-Wert und verwenden Sie ihn als aktuellen Knoten, der verarbeitet werden soll.

b. Verschieben Sie diesen Knoten in die Abschlussliste.

c. Für jedes der 8 benachbarten Quadrate des aktuellen Quadrats?

◆ Wenn es nicht erreichbar ist oder in der Abschlussliste enthalten ist, ignorieren Sie es. Andernfalls gehen Sie wie folgt vor.

◆ Wenn es nicht in der geöffneten Liste enthalten ist, fügen Sie es der geöffneten Liste hinzu, legen Sie das aktuelle Quadrat als übergeordnetes Element fest und zeichnen Sie die F-, G- und H-Werte des Quadrats auf.

◆ Wenn es bereits in der offenen Liste enthalten ist, prüfen Sie, ob dieser Pfad (dh um ihn über das aktuelle Raster zu erreichen) besser ist, und verwenden Sie den G-Wert als Referenz. Ein kleinerer G-Wert zeigt an, dass dies ein besserer Pfad ist. Wenn ja, setzen Sie den Vater auf das aktuelle Quadrat und berechnen Sie die G- und F-Werte neu. Wenn Ihre geöffnete Liste nach dem F-Wert sortiert ist, müssen Sie sie möglicherweise nach der Änderung neu sortieren.

d. Hör auf, wenn du

◆ Fügen Sie den Endpunkt zur geöffneten Liste hinzu, zu diesem Zeitpunkt wurde der Pfad gefunden, oder

◆ Das Finden des Endpunkts ist fehlgeschlagen und die geöffnete Liste ist leer. Derzeit ist kein Pfad vorhanden.

3. Speichern Sie den Pfad. Vom Endpunkt bewegt sich jedes Quadrat entlang des übergeordneten Knotens zum Startpunkt. Dies ist Ihr Pfad.

Exkurs (Small Rant)

Bitte verzeihen Sie meinen Exkurs. Wenn Sie im Internet oder im Forum verschiedene Diskussionen über den A * -Algorithmus sehen, werden Sie gelegentlich einige A * -Codes finden, die es jedoch nicht sind. Um A * verwenden zu können, müssen Sie alle oben beschriebenen Elemente einschließen, insbesondere die Kosten für offene Liste, geschlossene Liste und Pfad G, H und F. Es gibt auch viele andere Pfadfindungsalgorithmen, diese Algorithmen sind keine A * -Algorithmen, A * wird als die beste angesehen. In einigen der am Ende dieses Artikels zitierten Artikel erörtert Bryan Stout einige davon, einschließlich ihrer Vor- und Nachteile. Irgendwann können Sie eine der beiden auswählen, aber Sie müssen verstehen, was Sie tun.

Ich denke du magst

Origin blog.csdn.net/qq_41371349/article/details/107501179
Empfohlen
Rangfolge