Angenommen, ich habe bereits einen A * -Algorithmus.
Wie kann ich mit den Fällen umgehen, in denen das Ziel nicht erreicht werden kann, und trotzdem versuchen, dorthin zu gelangen?
Zum Beispiel im folgenden Beispiel:
Beachten Sie die erstaunlichen GIMP-Fähigkeiten!
Die gelbe Einheit muss den grünen Punkt erreichen, befindet sich jedoch auf der Insel und kann ihn nicht erreichen.
Bei einem typischen RTS versucht das Gerät jedoch, so nah wie möglich zu kommen.
Mein Problem ist, dass ich A * nicht sagen kann, dass das dem Ziel am nächsten liegende Plättchen das Quadrat in der Nähe des Meeres ist.
Wie kann ich diese teilweise Wegfindung haben? Ist A * immer noch eine gute Wahl?
path-finding
Pierre Arlaud
quelle
quelle
Antworten:
Theoretisch müssen Sie nichts ändern. Denken Sie nur an den nächsten Punkt, an dem Sie jemals waren. Das A * versucht, den Pfad zu finden, und schlägt beispielsweise für Sie fehl. Dies bedeutet jedoch nicht, dass nicht zuerst der von Ihnen gezeichnete Pfad festgelegt wird. Sie müssen sich nur an den Pfad zum nächstgelegenen Punkt erinnern, an dem das A * jemals gewesen ist.
quelle
Die Verwendung von A * allein (und das Gehen zum nächsten gesuchten Punkt) ist für kleine Karten in Ordnung, funktioniert jedoch schlecht, wenn die Karte größer ist. Wenn das Ziel nicht erreichbar ist, durchsucht A * den gesamten erreichbaren Bereich, bevor festgestellt wird, dass das Ziel nicht erreichbar ist. Dies kann viele Suchpunkte beinhalten und sehr langsam sein. In dieser Situation hat A * keinen Vorteil gegenüber Algorithmen wie Dijkstra.
Für eine effizientere Lösung benötigen Sie drei Teile:
Der erste Schritt kann vorberechnet werden, damit Sie kostengünstig feststellen können, ob Ihr Ziel erreichbar ist. Flood-Fill (auch bekannt als BFS) wird ausreichen.
Der zweite ist normalerweise Dijkstra oder ein ähnlich aussehender Algorithmus. Sie können es sogar vorberechnen (suchen Sie für jede nicht erreichbare Position nach der nächstgelegenen erreichbaren Position und speichern Sie sie, bevor das Spiel beginnt).
Sie können dann A * für den dritten Schritt verwenden.
quelle