Flocking und A * in Einklang bringen (Theorie)

7

Für mein RTS-Spiel funktioniert A * Pathfinding, und das ist in Ordnung. Es gibt auch eine grundlegende Kollisionserkennung. Wenn sich eine Einheit bewegt, prüft sie, ob die Position, die sie beim nächsten Zug einnimmt, ein Knoten ist, der von einer anderen Einheit besetzt wird, und wenn ja, findet sie einen anderen Weg zum Ziel. Ich denke auch, dass ich die Grundlagen der Beflockung verstehe; Während der Bewegung muss nur sichergestellt werden, dass die Boids die Entfernung zu ihren Herdenfreunden überprüfen und dies dann korrigieren.

Aber ich bin ein bisschen verwirrt. Im Moment arbeitet mein Pfadfindungssystem auf einem quadratischen Knotengitter, aber wenn ich ein Beflockungssystem erstellen möchte, das unter Berücksichtigung des kreisförmigen Fußabdrucks eines Boids funktioniert, erschwert dies die Sache, weil in einer dicht gepackten Herde oder in der Tat einer Herde mit Bei einer Anzahl von Elementen mit unterschiedlichen Footprint-Größen stimmt ihre Platzierung nicht immer mit dem für A * vorgesehenen quadratischen Knotenraster überein.

Wie packen sich dann theoretisch ein paar Boids zu einer Kugel zusammen oder fließen geordnet durch Geländeengpässe (einige Knoten sind als nicht begehbar gekennzeichnet usw.)? Entsteht diese Art von Verhalten aus einem funktionierenden Beflockungssystem?

Aber ich bin sicher, ich verstehe dieses System falsch und möchte, dass jemand, der versteht, wie man es implementiert, die Theorie erklärt, damit ich dies selbst implementieren kann. Ich gehe davon aus, dass die Beflockung nicht wirklich mit A * übereinstimmt: Dies wird nur verwendet, um einen Pfad zu finden, und während der Bewegung ist die Beflockung die einzige Möglichkeit, die Kollisionserkennung und -vermeidung für Einheiten zu verwalten. Aber was ist dann mit Hindernissen, die zu Engpässen führen können? Wie versöhnen sich A * und Herde? Das Vermeiden von Boids und Geländehindernissen sind unterschiedliche Systeme.

unangemessenCode
quelle

Antworten:

9

Der Widerspruch

In der Tat sind die beiden Systeme ziemlich exklusiv zueinander. Wie du erwähnt hast:

A *: Dies wird nur verwendet, um einen Pfad zu finden, und während der Bewegung ist die Beflockung die einzige Möglichkeit, die Kollisionserkennung und -vermeidung für Einheiten zu verwalten

Hier sind die wichtigsten Unterschiede, Vor- und Nachteile, die Sie berücksichtigen sollten:

+---------------------+-------------------------------------+
| A* Algorithm        | Flocking                            |
+---------------------+-------------------------------------+
| Abstract overlay    | Real-world representation           |
+---------------------+-------------------------------------+
| Graph-Based (Nodes) | Free-Form (float coordinates)       |
+---------------------+-------------------------------------+
| Optimal trajectory  | Physical Trajectory (speed, inertia)|
+---------------------+-------------------------------------+
| Individual          | Group dynamics                      |
+---------------------+-------------------------------------+
| Global knowledge    | Local knowledge                     |
+---------------------+-------------------------------------+

Wenn Sie die beiden mischen möchten, muss ich davon ausgehen, dass Sie eine Möglichkeit haben, beide zum Laufen zu bringen (aber Sie möchten Ratschläge, wie sie zusammenarbeiten können ). Das heißt, Sie haben bereits:

  • Eine physische Welt , in der sich Ihre Boids bewegen, miteinander interagieren und an Weltgrenzen stoßen können.
    Dies kann ein 2D-Satz von Segmenten, Polygonen, Kreisen sein, die Wände und Hindernisse bilden, sowie freundliche und feindliche Einheiten und Gebäude, Hänge, Geländetyp, Materialien, politisches Eigentum usw. Das heißt, alles, was Ihre Charaktere physisch oder moralisch beeinflussen kann.
    Jetzt können sich Ihre Boids innerhalb dieser Darstellung bewegen, Trägheit haben, auf Kräfte reagieren (reale Kräfte wie Kollisionen oder Verhaltenskräfte wie Suchen, Fliehen). Dies ist wahrscheinlich nicht nur diskrete Zellen, da Boids normalerweise nicht auf Zellen beschränkt sind, sondern es könnte sein.
    Letztendlich ist dies unsere Welt der Spielsimulation / Mechanik. Machen Sie es also so, wie Sie es möchten.
  • Eine grafische Darstellung Ihrer Welt , mit der A-Star arbeiten kann.
    Dies ist eine übergeordnete abstrakte Darstellung (Grafik mit Knoten und gewichteten Kanten). Dies erfordert keine Informationen über den Geländetyp oder irgendetwas davon: nur Knoten und gewichtete Kanten. Eine KI kann mit dieser abstrakten Darstellung ganz einfach umgehen, um sie auf ein Ziel zu lenken, und nicht auf die physische Welt in ihrer ganzen Komplexität.
  • Damit die beiden Darstellungen interagieren können, benötigen Sie außerdem:
    • Eine Möglichkeit, eine beliebige Weltposition einem Knoten im Diagramm zuzuordnen
    • Umgekehrt eine Möglichkeit, von jedem Knoten im Diagramm aus einen passenden Ort in der physischen Welt zu bestimmen .
      (Beachten Sie, dass dies keine Eins-zu-Eins-Zuordnung ist. Sie können also die physische Position dieses Punkts in der Zelle nach dem Zufallsprinzip sortieren, um organische Pfade zu erhalten.)

(Im Rest dieser Antwort werde ich Flocking algo kursiv schreiben und A-Star algo ermutigen, wie ich es oben getan habe).

Wie können wir diese beiden Systeme zusammenarbeiten lassen, um das Beste aus beiden herauszuholen?


Auf dem Weg zur Zusammenarbeit

Teilen Sie die Verantwortlichkeiten zwischen Ihren Algen auf.

  1. Lassen Sie A-Star einen vernünftigen globalen Weg (Think Guidance System) im abstrakten Bereich finden. Es ist im Grafikraum optimal und im realen Raum gut genug.
  2. Lassen Sie Flocking Ihre Boids lokal entlang des Pfades fahren.

Der A-Star wird einen Weg zu seinem Ziel finden , indem er dem Flocking-Algo clevere temporäre Suchziele zuführt .


Detaillierte Implementierung:

  • Bereiten Sie vorher einige Boids vor, von denen jedes zu jeder Zeit Folgendes hat:
    • Ein Makroziel und ein globaler Weg zu diesem Ziel
    • Ein lokales Tracking-Ziel für das Lenkverhalten , das wir auf dem gewünschten globalen Weg bewegen
  • Führen Sie bei jedem Zeitschritt für jedes Boid Folgendes aus:
    • Bewegen Sie das Boid entsprechend seinem Verhalten (Punktsuche plus Kollision plus Beflockung usw.) in der physischen Welt
    • Ordnen Sie den aktuellen Standort des Boids seinem repräsentativen Diagrammknoten zu
    • Wenn das Boid seinen vorherigen Knoten verlassen hat, muss es seinen Pfad neu berechnen! Wir geben ihm jetzt ein neues Ziel:
      • Führen Sie eine A-Star-Suche vom Boid-Knoten zum diskretisierten Makro-Zielknoten durch. Dies gibt einen globalen Pfad zurück .
      • Isolieren Sie einen Knoten weiter im globalen Pfad (Der nächste Knoten oder der nachfolgende, um ein fließenderes Suchverhalten zu erzielen?)
      • Entdiskretisieren Sie es (machen Sie es zurück an einen physischen Ort ).
      • Weisen Sie dem Boid ein Suchverhalten gegenüber diesem lokalen Ziel zu

Anmerkung 1: Trennung von Bedenken

Sie haben A-Star geändert, indem jede Einheit die Zellenbelegung durch andere Einheiten überprüft. Dies hat viele Vorteile von A-Star beeinträchtigt:

  • Der Pfad ist nicht mehr optimal
  • Es ist nicht mehr garantiert, dass der Pfad aufgrund von Interaktionen das Ziel erreicht
  • Einheiten gehen immer dann hin und her, wenn ein Pfad blockiert / freigegeben wird

Dies liegt daran, dass Sie gemischte Bedenken haben, indem Sie die Algo sowohl einen optimalen Pfad finden als auch die Interaktion der Einheiten verwalten lassen. Das Schöne am Mischen zweier Algorithmen ist, dass Sie dies lösen können, indem Sie A-Star einfach einen Pfad finden lassen (unabhängig von anderen Einheiten, es ist das einzige, wofür es gut ist) und Flocking Konflikte lösen lassen (eine Aufgabe, bei der es ist gut für).

Hinweis 2: Stau der Einheit

Wenn Sie sich Sorgen machen, dass Gruppen von Einheiten sich gegenseitig (wie diese (AAAA)--> <--(BB)) im Beflockungsmodus blockieren , gibt es Möglichkeiten, dies zu mildern.

  • Versuchen Sie, Einheitengruppen anhand ihrer Absicht zu erkennen (Zielknoten) und verteilen Sie eine Abstoßungskraft auf jede Einheit der kleineren Gruppen, um "Platz zu machen" (größere Gruppe = größere Priorität).
  • Wenn Sie großen Gruppen Massenordnung geben, berücksichtigen Sie dies bei Ihrem Disretisierungsprozess: Machen Sie den diskreten Graphen gröber, wenn Sie mit großen Gruppen arbeiten. Grober A-Stern findet nur einen Weg durch ausreichend große "Löcher".

Hinweis 3 - Unbegehbares Gelände

Informationen zum Gerät, das in nicht begehbares Gelände geht: Keiner der Algorithmen erlaubt dies.
Auf hoher Ebene befiehlt A-Star einer Einheit niemals, durch nicht begehbare Kanten zu gehen, da diese Kanten überhaupt nicht in der Grafik vorhanden sein sollten.
Auf einer niedrigeren Ebene sollte das Lenkverhalten Kollisionsreaktionen umfassen, die Boids von den Wänden fernhalten.

Gearbeitetes Beispiel

Der gesamte weiße Raum in der physischen Welt ist navigierbar, die Grafikwelt ist ein entsprechendes Navigationsnetz . Beachten Sie, dass ich der Geometrie im Diagramm absichtlich nicht gefolgt bin, da es sich um eine Abstraktion handelt. Es spielt also keine Rolle, solange die Kanten ein korrektes Gewicht haben (nicht gezeigt).
Das Boid ist in Aund adas Ziel ist in Eund ees gibt eine Tür in Dund d.

Physical world             Graph world
+--------+------+          a---b          
|A      B|F    G|          |\ /|
|        |      |          | X |
|        |      |          |/ \| 
|        |      |          c---(d)---f
|        |      |               |\ / |
|        +      |               | X  |
|C       D     E|               |/ \ |
+---------------+               e----g

Das Boid ist also drin a, sein A-Star-Pfad ist a->b->d->e. A-Star entscheidet also, dass die nächste Bewegung auf hoher Ebene stattfinden soll d(zwei Eckpunkte entfernt, um glatte Flugbahnen zu erstellen). Da dbeschließt, Dnimmt der Boid ein suchendes Verhalten gegenüber an D. Aber der Boid hat auch große Angst vor einem Feind. BHier ist also, was passiert (die Punkte zeigen die Flugbahn):

Physical world             Graph world
+--------+------+          a---b          
|A      B|F    G|          |\ /|
|.       |      |          | X |
|.       |      |          |/ \| 
|.       |      |          c---(d)---f
| .      |      |               |\ / |
|  .     +      |               | X  |
|C       D     E|               |/ \ |
+---------------+               e----g

Das Boid steuerte weg von B(Kombination aus Suchen + Fliehen), wechselte dabei den Knoten und ist jetzt auf dem Knoten c! Wir berechnen den Pfad neu und bekommen jetzt c->d->e. Das Boid wird Eals Suchziel zugewiesen . Usw. usw.

Auf diese Weise erhalten wir einen natürlichen und emotional kohärenten Weg, der eine Mischung aus A-Star- und Lenkverhalten darstellt.

MrBrushy
quelle
Vielen Dank, ich möchte nur um eine Klarstellung bitten: in Bezug auf die physische Karte und ob ihre Knoten begehbar sind oder nicht. "Lassen Sie das Boid seinem Verhalten folgen (Punktsuche plus Kollisionsvermeidung plus Beflockung), bis es den Knoten wechselt." Ich gehe davon aus, dass dieses System vor der Bewegung prüft, ob Bewegung in einen neuen Knoten eintritt. In diesem Fall wird es immer verhindert, dass es nicht begehbar ist Knoten - weil, wie Sie bereits erwähnt haben, immer nach dem optimalen Pfad zum Ziel gesucht wird (über A *) und standardmäßig nur auf die Bewegung gewartet wird, es sei denn, die Herdenkameraden vor Ihnen bewegen sich aus dem Weg?
unangemessenCode
"Ich gehe davon aus, dass dieses System [...] prüft, ob Bewegung in einen neuen Knoten eintritt". Nun, nein, für jeden sein eigenes. Ich gehe davon aus, dass Ihre Boids physische Objekte sind, die sich frei bewegen (double x, double y). Sie kümmern sich nicht um Knoten. Das ist eine abstrakte Darstellung Ihrer Welt. Tatsächlich sagten Sie "in Bezug auf die physische Karte und ob ihre Knoten begehbar sind oder nicht", aber ich rate Ihnen davon ab, Boids in einer diskreten Welt zu verwenden, damit sie nicht "in einem Knoten" sind. Sie sind nur irgendwo in (x, y).
MrBrushy
Um dies zusammenzufassen, werde ich auf Ihre letzte Sorge eingehen: Dieser Boid könnte in ein „nicht begehbares“ Gebiet wandern. Nun, Ihr Boid sollte mit den geometrischen Grenzen der physischen Welt (Polygone, Kreise ...) kollidieren. Sie können also physisch nicht in nicht begehbare Zonen gelangen.
MrBrushy
Oh! Ich verstehe, physische Kollisionen. Interessant. Ich werde das weiter untersuchen müssen, aber danke, es ist genug, um loszulegen!
unangemessenCode
Nach näherer Betrachtung der Theorie verstehe ich immer noch nicht, wie man quadratisches, nicht begehbares Gelände mit kreisförmigem Boid-Raum in Einklang bringt. Könnten Sie erklären, wie Sie sicherstellen können, dass Boids nicht in ein großes quadratisches Hindernis gelangen. Ist dies der Punkt, an dem Ihre physische Kartenreferenz wichtig wird? Aber welche Art von Algorithmus wird benötigt, um die Lösung zu realisieren?
unangemessenCode