Ist A * auch bei sich bewegenden Hindernissen effizient?

30

Ich habe gerade erst angefangen, mich mit dem Finden von Pfaden zu befassen und habe mich mit dem A * -Algorithmus befasst. Mein Hauptanliegen ist, dass alle Beispiele, die ich gesehen habe, statische Hindernisse aufzeigen, die er berechnet.

Wenn ich bewegliche Hindernisse habe, zum Beispiel andere Charaktere, die sich ebenfalls bewegen, so dass der Charakter sich zurechtfinden muss, gehe ich davon aus, dass ich den Algorithmus für jeden Frame ausführen muss, aber ich mache mir Sorgen, dass dies ziemlich teuer wird Damit die Hardware jeden Frame für jeden sich bewegenden Akteur verarbeitet.

Ist A * also immer noch effizient genug, um zu verwenden, wenn sich die Hindernisse ebenfalls bewegen, oder gibt es eine andere Methode zur Wegfindung, mit der sich bewegende Hindernisse eloquenter handhaben lassen?

Ethan der Tapfere
quelle

Antworten:

27

Es gibt mehrere Algorithmen, die viel schneller als A * sind, wenn Sie einen Pfad mit sich bewegenden Hindernissen neu berechnen müssen. Siehe hier unter "Einfache Neuberechnungen".

Es ist jedoch unwahrscheinlich, dass Sie für eine dieser Lösungen eine Standardlösung finden. In 99% der Fälle sind sie für ein Spiel überfordert. Ihre Zeit wäre besser, wenn Sie eine vorhandene, vollständig optimierte A * -Lösung und die gängigen Tricks zur Beschleunigung der Pfadfindung in Spielen verwenden würden:

  • Berechnen Sie den besten Pfad nur in seltenen Abständen neu
  • Best-Paths zwischen mehreren Einheiten teilen ( Beispiel )
  • Erstellen Sie ein hierarchisches Diagramm, damit Sie nur einen Teil des Pfads neu berechnen müssen

usw. Weitere Informationen zu diesen und weiteren Tricks finden Sie auf dieser Website oder auf den A * -Seiten von Amit

BlueRaja - Danny Pflughoeft
quelle
10

Ja. Ein * ist in fast allen Fällen immer noch der richtige Weg. Es ist Ihre Knotenkostenberechnung, die dynamisch wird und daher komplexer zu berechnen und zu verfolgen ist.

Wenn Sie bereits wissen, wo sich die sich bewegenden Hindernisse in Zukunft befinden werden, kann Ihr A * die Zeitlichkeit von Hindernissen in der Kostenfunktion berücksichtigen.

ZB: Dieser Knoten wird in 4 Ticks erreicht, belegt von Tick # 3 bis Tick # 6, sodass die Reisekosten für diesen Knoten 6 - 4 = +2 Ticks betragen. Das ist vielleicht immer noch der beste Weg.

Die Fahrtrichtung des Hindernisses muss ebenfalls berücksichtigt werden.

Wenn Sie es nicht im Voraus wissen, können Sie keine Hindernisse annehmen und den Pfad neu berechnen, wenn Hindernisse erreicht sind, aber Sie müssen etwas gegen Deadlocks und Livelocks unternehmen. (Gleiches gilt, wenn Sie vorhersagen können, wo sich Hindernisse befinden werden, dies jedoch eine Art Deadlock / Livelock-Vermeidung darstellt und dies für Ihren Zweck gut genug sein kann.)

Ein Deadlock ist, wenn beide darauf warten, dass sich der andere bewegt, und keiner sich bewegt.

Ein livelock ist, wenn beide ( oder mehr) <- dies ist wichtig zu berücksichtigen) bewegen, um den anderen in die gleiche Richtung zu vermeiden, und am Ende ohne Fortschritt hin und her gehen.

Das Lösen von Livelocks kann sehr komplex werden und hängt ganz von den Kollisionsregeln und -mechanismen Ihres Spiels ab (z. B .: Sollten sie das Hindernis bekämpfen und zerstören?).

Es kommt oft vor, dass Ihre sich bewegenden Objekte Knoten- / Pfadreservierungen planen (Stornierungen nicht vergessen, wenn sie den Pfad ändern oder sterben), damit andere sich bewegende Objekte vorausplanen können.

Sobald Sie diese Informationen haben, können Sie auch das Abfangen planen.

Stephane Hockenhull
quelle
19
Oh mein Gott, "livelock" - Sie haben dieses schreckliche Ausweichmanöver beschrieben, das ich die ganze Zeit in Fluren machen muss.
Ethan The Brave
2
Eine einfache Live / Deadlock-Lösung besteht darin, zufällig zwischen den verfügbaren Optionen zu wählen (z. B. 50% Chance, sich nicht zu bewegen, und 50% Chance, sich nach links zu bewegen). Solange jeder Akteur nach dem Zufallsprinzip wählt, ist die Wahrscheinlichkeit nicht null, dass die Sperre aufgehoben wird.
Draco18s
@ Draco18s Und erhöhe exponentiell die Größe deiner Hin- und Herbewegung, bis eine nachgibt (ich habe vielleicht gerade beschrieben, wie Ethernet-Kollisionen gelöst werden!)
Cort Ammon - Wiedereinsetzung von Monica,
Ich nehme an, sie könnten stattdessen Rock Paper Scissors oder ein Freundschaftsspiel des Petri Dish Prisoner's Dilemma spielen. ; P
Draco18s