Wegfindung zur Flucht


61

Wie Sie wissen, gibt es beim Finden des besten Pfades in einer zweidimensionalen Umgebung, die von Punkt A zu Punkt B führt, viele Lösungen.

Aber wie berechne ich einen Pfad, wenn sich ein Objekt an Punkt A befindet und so schnell und so weit wie möglich von Punkt B weg will?

Ein paar Hintergrundinformationen: Mein Spiel verwendet eine 2D-Umgebung, die nicht auf Kacheln basiert, sondern eine Gleitkommagenauigkeit aufweist. Die Bewegung ist vektorbasiert. Die Wegfindung erfolgt durch Unterteilen der Spielwelt in begehbare oder nicht begehbare Rechtecke und Erstellen eines Graphen aus ihren Ecken. Ich habe bereits eine Wegfindung zwischen Punkten, die mit dem Dijkstras-Algorithmus funktioniert. Der Anwendungsfall für den Fluchtalgorithmus ist, dass Akteure in meinem Spiel in bestimmten Situationen einen anderen Schauspieler als Gefahr wahrnehmen und davor fliehen sollten.

Die triviale Lösung wäre, den Akteur in einem Vektor in die der Bedrohung entgegengesetzte Richtung zu bewegen, bis eine "sichere" Distanz erreicht ist oder der Akteur eine Wand erreicht, an der er sich dann in Angst deckt.

Das Problem bei diesem Ansatz ist, dass die Akteure durch kleine Hindernisse blockiert werden, die sie leicht umgehen können. Solange sie sich nicht an der Wand entlangbewegen, um der Bedrohung näher zu kommen, könnten sie dies tun, aber es würde klüger aussehen, wenn sie Hindernissen zunächst ausweichen würden:

Bildbeschreibung hier eingeben

Ein weiteres Problem, das ich sehe, sind Sackgassen in der Kartengeometrie. In manchen Situationen muss ein Wesen zwischen einem Weg wählen, der es jetzt schneller wegbringt, aber in einer Sackgasse endet, in der es gefangen ist, oder einem anderen Weg, der bedeutet, dass es der Gefahr zunächst nicht so weit entkommen würde (oder noch ein bisschen näher), aber andererseits hätte es auf lange Sicht eine viel größere Belohnung, dass es sie irgendwann viel weiter entfernt. Die kurzfristige Belohnung, schnell wegzukommen, muss also in irgendeiner Weise gegen die langfristige Belohnung, weit wegzukommen, abgewertet werden .

Bildbeschreibung hier eingeben

Es gibt auch ein anderes Bewertungsproblem für Situationen, in denen ein Schauspieler akzeptieren sollte, sich einer geringfügigen Bedrohung zu nähern, um sich von einer viel größeren Bedrohung zu lösen. Das vollständige Ignorieren aller geringfügigen Bedrohungen wäre auch töricht (daher tut der Darsteller in dieser Grafik alles, um die geringfügige Bedrohung im oberen rechten Bereich zu vermeiden):

Bildbeschreibung hier eingeben

Gibt es Standardlösungen für dieses Problem?


8
+1 Tolle Frage mit toller Grafik. Das macht die Frage wirklich klar.
MichaelHouse

Antworten:


24

Dies ist vielleicht nicht die beste Lösung, aber es hat mir geholfen, eine flüchtige KI für dieses Spiel zu entwickeln .

Schritt 1. Konvertieren Sie den Dijkstra-Algorithmus in A * . Dies sollte einfach durch Hinzufügen einer Heuristik erfolgen, die den Mindestabstand zum Ziel misst. Diese Heuristik wird zu der bisher zurückgelegten Strecke addiert, wenn ein Knoten bewertet wird. Sie sollten diese Änderung trotzdem vornehmen, da dies Ihren Pfadfinder erheblich verbessern wird.

Schritt 2. Erstellen Sie eine Variation der Heuristik. Anstatt die Entfernung zum Ziel zu schätzen, misst sie die Entfernung zur Gefahr (en) und negiert diesen Wert. Dies wird niemals ein Ziel erreichen (da es keines gibt), daher müssen Sie die Suche an einem bestimmten Punkt abbrechen, möglicherweise nach einer bestimmten Anzahl von Iterationen, nachdem eine bestimmte Entfernung erreicht wurde oder wenn alle möglichen Routen abgehandelt wurden. Diese Lösung erstellt effektiv einen Wegfinder, der mit der gegebenen Einschränkung den optimalen Rettungsweg findet.


1
Beachten Sie, dass die Verwendung eines geraden Abstands von der Gefahr als Heuristik in Schritt 2 im Allgemeinen keine zulässige Heuristik ergibt. Das bedeutet natürlich nicht, dass Sie es trotzdem nicht ausprobieren können, aber möglicherweise werden keine optimalen Fluchtwege generiert. Um eine tatsächlich zulässige Heuristik für dieses "umgekehrte A *" zu erhalten, müssten Sie meines Erachtens das normale A * / Dijkstra verwenden, um die tatsächliche Entfernung jedes Quadrats von der Gefahr zu berechnen.
Ilmari Karonen,

+1 Ich denke, das ist das Beste für Ihr Geld, wenn es um Ergebnisse geht.
MichaelHouse

33

Wenn Sie wirklich möchten, dass Ihre Schauspieler schlau in Bezug auf die Flucht sind, reicht eine einfache Dijkstra / A * -Pfadfindung nicht aus. Der Grund dafür ist, dass der Schauspieler auch überlegen muss, wie sich der Feind bei der Verfolgung bewegen wird, um den optimalen Fluchtweg von einem Feind zu finden.

Das folgende MS Paint-Diagramm soll eine bestimmte Situation veranschaulichen, in der die Verwendung der statischen Wegfindung zur Maximierung der Entfernung zum Feind zu einem suboptimalen Ergebnis führt:

Diagramm eines Schauspielers auf der Flucht vor einem Feind in einem P-förmigen Labyrinth

Hier flieht der grüne Punkt vor dem roten Punkt und hat zwei Möglichkeiten, einen Weg einzuschlagen. Wenn Sie den Pfad auf der rechten Seite entlang gehen, kann er sich deutlich von der aktuellen Position des roten Punkts entfernen, den grünen Punkt jedoch in einer Sackgasse einklemmen. Die optimale Strategie besteht stattdessen darin, dass der grüne Punkt weiterhin um den Kreis herumläuft und versucht, auf der dem roten Punkt gegenüberliegenden Seite zu bleiben.

Um solche Fluchtstrategien korrekt zu finden, benötigen Sie einen gegnerischen Suchalgorithmus wie die Minimax-Suche oder dessen Verfeinerungen wie Alpha-Beta-Bereinigung . Ein solcher Algorithmus, der auf das obige Szenario mit einer ausreichenden Suchtiefe angewendet wird, leitet korrekterweise ab, dass das Aufnehmen des Sackgassenpfads nach rechts zwangsläufig zur Erfassung führt, wohingegen ein Verbleiben auf dem Kreis nicht führt (solange der grüne Punkt den Sackgassenpfad überholen kann) rote).

Wenn es mehrere Akteure beider Art gibt, müssen diese natürlich alle ihre eigenen Strategien planen - entweder getrennt oder, wenn die Akteure zusammenarbeiten, zusammen. Solche Verfolgungs- / Fluchtstrategien mit mehreren Akteuren können überraschend komplex werden. Eine mögliche Strategie für einen flüchtenden Schauspieler besteht beispielsweise darin, den Feind abzulenken, indem er ihn zu einem verlockenderen Ziel führt. Dies wirkt sich natürlich auf die optimale Strategie des anderen Ziels aus, und so weiter ...

In der Praxis werden Sie wahrscheinlich nicht in der Lage sein, sehr gründliche Suchen in Echtzeit mit vielen Agenten durchzuführen, sodass Sie sich häufig auf Heuristiken verlassen müssen. Die Wahl dieser Heuristiken bestimmt dann die "Psychologie" Ihrer Akteure - wie intelligent sie handeln, wie viel Aufmerksamkeit sie unterschiedlichen Strategien widmen, wie kooperativ oder unabhängig sie sind usw.


7

Sie haben eine Wegfindung, sodass Sie das Problem auf die Auswahl eines guten Ziels reduzieren können.

Wenn die Karte absolut sichere Ziele enthält (z. B. Ausgänge, durch die die Bedrohung Ihrem Schauspieler nicht folgen kann), wählen Sie eines oder mehrere Ziele in der Nähe aus und ermitteln Sie, welches die niedrigsten Pfadkosten aufweist.

Wenn Ihr flüchtender Schauspieler gut bewaffnete Freunde hat oder wenn die Karte Gefahren enthält, gegen die der Schauspieler immun ist, die Bedrohung jedoch nicht, wählen Sie einen freien Ort in der Nähe eines solchen Freundes oder einer solchen Gefahr und finden Sie den Weg dorthin.

Wenn Ihr flüchtender Schauspieler schneller ist als irgendein anderer Schauspieler, an dem die Bedrohung auch interessiert sein könnte, wählen Sie einen Punkt in Richtung des anderen Schauspielers, aber darüber hinaus, und suchen Sie den Weg zu diesem Punkt: "Ich muss dem Bären nicht entkommen "Ich muss dich nur überholen."

Ohne die Möglichkeit zu entkommen oder die Bedrohung zu töten oder abzulenken, ist Ihr Schauspieler zum Scheitern verurteilt, oder? Suchen Sie sich also einen beliebigen Punkt aus, zu dem Sie laufen möchten, und wenn Sie dort ankommen und die Bedrohung immer noch auf Sie wartet, was zur Hölle: Wenden Sie sich und kämpfen Sie.


7

Da die Festlegung einer geeigneten Zielposition in vielen Situationen schwierig sein kann, ist der folgende Ansatz auf der Grundlage von 2D-Belegungsgitterkarten möglicherweise erwägenswert. Es wird allgemein als "Wertiteration" bezeichnet und ergibt in Kombination mit Gradientenabstieg / -aufstieg einen einfachen und ziemlich effizienten (je nach Implementierung) Pfadplanungsalgorithmus. Aufgrund seiner Einfachheit ist es in der mobilen Robotik insbesondere für "einfache Roboter", die in Innenräumen navigieren, bekannt. Wie oben angedeutet, bietet dieser Ansatz ein Mittel, um einen Weg von einer Startposition zu finden, ohne eine Zielposition explizit wie folgt anzugeben. Beachten Sie, dass optional eine Zielposition angegeben werden kann, falls verfügbar. Außerdem stellt der Ansatz / Algorithmus eine Breitensuche dar,

Im binären Fall ist die 2D-Belegungsgitterkarte eins für belegte Gitterzellen und null an anderer Stelle. Beachten Sie, dass dieser Belegungswert im Bereich [0,1] auch stetig sein kann, ich komme darauf zurück. Der Wert einer gegebenen Gitterzelle g i ist V (g i ) .

Die Basisversion

  1. Angenommen, die Gitterzelle g 0 enthält die Startposition. Setze V (g 0 ) = 0 und setze g 0 in eine FIFO-Warteschlange.
  2. Nehmen Sie die nächste Gitterzelle g i aus der Warteschlange.
  3. Für alle Nachbarn g j von g i :
    • Wenn g j nicht belegt ist und noch nicht besucht wurde:
      • V (g j ) = V (g i ) +1
      • Markiere g j als besucht.
      • Fügen Sie der FIFO-Warteschlange g j hinzu .
  4. Wenn eine bestimmte Distanzschwelle noch nicht erreicht ist, fahren Sie mit (2.) fort, andernfalls fahren Sie mit (5.) fort.
  5. Der Weg ergibt sich aus dem steilsten Gefälle ab g 0 .

Hinweise zu Schritt 4.

  • Wie oben angegeben, muss in Schritt (4.) die maximale zurückgelegte Strecke verfolgt werden, die in der obigen Beschreibung aus Gründen der Klarheit / Kürze weggelassen wurde.
  • Wird eine Zielposition angegeben, wird die Iteration abgebrochen, sobald die Zielposition erreicht ist, dh im Rahmen von Schritt (3.) bearbeitet / besucht.
  • Natürlich ist es auch möglich, einfach die gesamte Grid-Map zu verarbeiten, dh fortzufahren, bis alle (freien) Grid-Zellen verarbeitet / besucht wurden. Der begrenzende Faktor ist offensichtlich die Größe der Gitterkarte in Verbindung mit ihrer Auflösung.

Erweiterungen und weitere Kommentare

Das Update-Gleichung V (g j ) = V (g i ) +1 viel Raum lässt alle Arten von zusätzlichen Heuristiken entweder durch Herunterskalierung anzuwenden V (g j )oder die additive Komponente, um den Wert für bestimmte Pfadoptionen zu reduzieren. Die meisten, wenn nicht alle, dieser Modifikationen können einfach und allgemein unter Verwendung einer Grid-Map mit stetigen Werten von [0,1] aufgenommen werden, die effektiv einen Vorverarbeitungsschritt der anfänglichen binären Grid-Map darstellt. Das Hinzufügen eines Übergangs von 1 nach 0 entlang von Hindernisgrenzen bewirkt beispielsweise, dass der "Akteur" vorzugsweise frei von Hindernissen bleibt. Eine solche Gitterkarte kann beispielsweise aus der binären Version durch Unschärfe, gewichtete Dilatation oder ähnliches erzeugt werden. Wenn Sie die Bedrohungen und Feinde als Hindernisse mit großem Unschärferadius hinzufügen, werden Pfade, die diesen nahe kommen, bestraft. Auf der gesamten Grid-Map kann man auch einen Diffusionsprozess wie diesen anwenden:

V (g j ) = (1 / (N + 1)) × [V (g j ) + Summe (V (g i ))]

Dabei bezieht sich " Summe " auf die Summe aller benachbarten Gitterzellen. Anstatt beispielsweise eine binäre Karte zu erstellen, können die Anfangswerte (Ganzzahlen) proportional zur Größe der Bedrohungen sein, und Hindernisse stellen "kleine" Bedrohungen dar. Nach Anwendung des Diffusionsprozesses sollten / müssen die Gitterwerte auf [0,1] skaliert werden, und Zellen, die von Hindernissen, Bedrohungen und Feinden besetzt sind, sollten auf 1 gesetzt / gezwungen werden. Andernfalls kann die Skalierung in der Aktualisierungsgleichung erfolgen nicht wie gewünscht arbeiten.

Es gibt viele Variationen dieses allgemeinen Schemas / Ansatzes. Hindernisse usw. können kleine Werte haben, während freie Gitterzellen große Werte haben, die je nach Zielsetzung im letzten Schritt einen Gefälleabstieg erfordern können. Auf jeden Fall ist der Ansatz meiner Meinung nach überraschend vielseitig, ziemlich einfach zu implementieren und möglicherweise ziemlich schnell (abhängig von der Größe / Auflösung der Gitterkarte). Schließlich besteht, wie bei vielen Pfadplanungsalgorithmen, die keine bestimmte Zielposition einnehmen, das offensichtliche Risiko, in Sackgassen zu geraten. In gewissem Umfang ist es möglich, vor dem letzten Schritt dedizierte Nachbearbeitungsschritte anzuwenden, um dieses Risiko zu verringern.

Hier ist eine weitere kurze Beschreibung mit einer Illustration in Java-Script (?), Obwohl die Illustration mit meinem Browser nicht funktioniert hat :(

http://www.cs.ubc.ca/~poole/demos/mdp/vi.html

Weitere Informationen zur Planung finden Sie im folgenden Buch. Die Wertiteration wird speziell in Kapitel 2, Abschnitt 2.3.1 Optimale Pläne mit fester Länge erörtert.

http://planning.cs.uiuc.edu/

Hoffe das hilft, liebe Grüße, Derik.


3

Wie wäre es, wenn Sie sich auf Raubtiere konzentrieren? Lassen Sie uns einfach 360 Grad auf Predators Position mit entsprechender Dichte strahlen. Und wir können Zufluchtproben haben. Und wähle die beste Zuflucht.

Fall 1

Fall 2


0

Ein Ansatz, den sie in Star Trek Online für Tierherden verfolgen, besteht darin, einfach eine offene Richtung zu wählen und die Tiere nach einer bestimmten Entfernung schnell zu entfernen. Aber das ist meistens eine verherrlichte De-Spawn-Animation für Herden, die Sie nicht angreifen sollten, und nicht für echte Kampfmobs geeignet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.