2010-12-29 13 views
1

Ich verwende derzeit den A * Pathfinding-Algorithmus, um einen Pfad auf einem unendlichen Gitter zu berechnen (mit einem UnboundedGrid in Gridworld, der AP CS Fallstudie, wenn das irgendjemand hilft). Alles funktioniert wunderbar, außer in Fällen, in denen kein gültiger Pfad existiert, weil der Endknoten vollständig von Wänden umgeben ist. Wie erwartet, sucht der Algorithmus unendlich weiter und findet niemals den Endknoten.Wäre es akzeptabel, Grenzen um meine Pfadfinderzone zu legen?

Eine mögliche Lösung wäre, die Wände um den gesamten Pfadsuchbereich unsichtbar zu platzieren (wie der Benutzer sie nicht sieht, aber der Algorithmus tut dies) und stellt den Startknoten, den Endknoten und die gesamte Wand sicher Knoten befinden sich innerhalb dieser Wände, mit 2-3 Zwischenräumen. Etwas wie:

_________________________________ 
|        | 
|    S |    | 
|   _____| _____  | 
|      | E |  | 
|      |___|  | 
|_______________________________| 

... die Idee ist, dass schließlich alle Knoten werden dem closedlist hinzugefügt werden, wird die Openlist leer geworden, und an diesem Punkt werde ich wissen, dass kein gültiger Pfad vorhanden ist.

Scheint dies eine vernünftige Lösung für das Problem? Gibt es irgendwelche Möglichkeiten, wie dies möglicherweise schiefgehen könnte? Ich verstehe, dass eine andere Lösung darin besteht, vom Ende her gleichzeitig rückwärts zu suchen, aber dies scheint möglicherweise teuer zu sein, insbesondere in Fällen, in denen der Endknoten nicht so eng umschlossen ist.

+0

Dies ist eine Frage mit einer subjektiven Antwort. Stimmt es, das zu tun? In manchen Fällen ist es das, in anderen nicht. Hängt von den Einschränkungen des Projekts ab. Musst du einen Weg finden? Wenn ja, bekommst du Situationen wie oben und solltest du sie lösen können, indem du sagst, dass es keinen Weg gibt? Wenn ja, dann brauchen Sie eine Art von Einschränkung. Wenn nicht, gut, du nicht :). – bastijn

+0

Der Benutzer kann die Umgebung so einrichten, wie sie wollen, also ja, ich muss in der Lage sein, mit schlechten Wegen umzugehen. Die gleichzeitige Navigation von beiden Seiten scheint/ich bin davon überzeugt, dass dies wahrscheinlich der beste Weg ist, dies zu tun, obwohl ich meinen Code ein wenig umgestalten muss, um ihn zum Laufen zu bringen. Naja: D – Lewis

Antwort

2

Wissen Sie nicht genau wo ist der Endknoten? Wenn Sie dies tun, überprüfen Sie einfach, ob es umschlossen ist, bevor Sie Ihren Algorithmus ausführen.

+0

Das Problem ist, dass es nicht sofort umstellt werden kann. Es könnte 10, 20, 50 Knoten sein, in allen möglichen seltsamen Formen. – Lewis

+1

@Lewis In diesem Fall führe ein A * sowohl am Anfang als auch am Ende durch und stoppe, wenn du einen Treffpunkt hast, oder wenn eine Warteschlange leer ist (in diesem Fall ist eine davon eingeschlossen) Tu, was du vorgeschlagen hast, es könnte einen gültigen Pfad außerhalb deiner Gegend geben, damit du gültige Pfade verpasst. –

+0

Ja, du hast natürlich recht, und wenn du diese Methode jetzt wieder ansiehst, sieht es wahrscheinlich effizienter aus als was Ich schlug in der Frage vor. Aber, nur zum Spaß, würde Surround-mit-einem-Rechteck-Wand-Methode tatsächlich funktionieren? – Lewis

1

Siehe auch meinen Kommentar zu Ihrer Frage. Nach dem Tippen kam ich auf, was eine nette Lösung sein könnte. Dies ist für einen Fall, in dem Sie Ihren Endknoten nicht kennen und nichts mit der Position Ihres Endknotens tun können, wie oben vorgeschlagen.

Sie könnten auch etwas entlang der Linien von: „Ich habe einen geschlossenen Kasten in meinem Bereich und keinen Weg nach x Zeit gefunden haben, so mit y% propability kann ich sagen, es gibt keinen Weg, und aktualisieren die y% im Laufe der Zeit zu erhöhen, aber nie zu 100% zu erreichen.

Könnte eine schöne Lösung sein, die in der Mitte ist das Suchgebiet begrenzt und nichts zu tun.

+0

Dies ist eine gute Lösung, besonders wenn ich möchte, dass der Benutzer die Statistiken sehen kann, während der Algorithmus läuft. A * erfordert, dass der Endknoten bekannt ist (ansonsten wird etwas wie Dijkstras Algorithmus benötigt), so dass ich glücklicherweise Zugriff auf den Endknoten habe. – Lewis

+0

A das ist wahr, es ist schon eine Weile her, seit ich A * :) benutzt habe. – bastijn

0

ich hatte ein ähnliches Problem und hier ist was ich tat:

  1. Run-Algorithmus für n Iterationen bei einem Start für B.
  2. Benutzer
  3. Run-Algorithmus für n Iterationen, bei B ausgehend von A. Benutzer

Wenn entweder Lauf feststellt, dass ein oder der andere befindet sich in einem vollständig isolierten Bereich (keine offenen Knoten mehr), die Suche schlägt fehl. Ansonsten wird die Suche als normal durchgeführt.

Der Trick hier ist natürlich, mit einem guten Wert für n zu kommen. Ich machte mehrere Durchgänge mit steigenden n und zwischengespeichert die Ergebnisse (mein Diagramm nicht viel geändert).

0

Sie verwenden A *, also sollten Sie in der Lage sein, die Terrain-Nodes mit Kosten zu gewichten. Setzen Sie einen wahnsinnig hohen Preis auf die Wandknoten. Es muss größer als die Gesamtkosten eines möglichen Pfades sein. Wenn die Endkosten des Pfads größer als diese Grenzkosten sind, mussten Sie eine Wand passieren, um einen Pfad zu finden, der ungültig ist.Der A * -Algorithmus routet um Knoten mit hohen Kosten, so dass er nicht durch eine Wand routet, es sei denn, es muss.