Triangulation A * (TA *) Pfadfindungsalgorithmus

11

Ich brauche Hilfe beim Verständnis des Triangle A * (TA *) -Algorithmus, den Demyen in seinem Artikel Efficient Triangulation-Based Pathfinding auf den Seiten 76-81 beschrieben hat.

Er beschreibt, wie der reguläre A * -Algorithmus für die Triangulation angepasst werden kann, um nach anderen möglicherweise optimaleren Pfaden zu suchen, selbst nachdem der endgültige Knoten erreicht / erweitert wurde. Normales A * stoppt, wenn der letzte Knoten erweitert wird. Dies ist jedoch nicht immer der beste Pfad, wenn er in einem triangulierten Diagramm verwendet wird. Das ist genau das Problem, das ich habe.

Das Problem ist auf Seite 78, Abbildung 5.4 dargestellt: Geben Sie hier die Bildbeschreibung ein

Ich verstehe, wie man die in der Arbeit dargestellten g- und h-Werte berechnet (Seite 80).

Und ich denke, die Suchstoppbedingung ist:

if (currentNode.fCost > shortestDistanceFound)
{
    // stop
    break;
}

Dabei ist currentNode der Suchknoten, der aus der offenen Liste (Prioritätswarteschlange) mit dem niedrigsten f-Score entfernt wurde. shortestDistanceFound ist die tatsächliche Entfernung des kürzesten bisher gefundenen Pfades.

Aber wie schließe ich die zuvor gefundenen Pfade von zukünftigen Suchvorgängen aus? Denn wenn ich die Suche erneut durchführe, wird offensichtlich derselbe Pfad gefunden. Setze ich die geschlossene Liste zurück? Ich muss etwas ändern, aber ich weiß nicht, was ich ändern muss. Dem Papier fehlt der Pseudocode, das wäre also hilfreich.

Morgenlos
quelle

Antworten:

3

Ich habe das nicht implementiert, aber beim Lesen denke ich, dass Sie so etwas tun würden:

shortestDistance = infinity
do A* with modified g cost
    if node.fCost > shortestDistance (section 5.5)
        don't open node
    if node.isGoal()
        run funnel algorithm (string pulling)
        update shortestDistance

Der Unterschied besteht darin, dass selbst wenn Sie einen Weg zum Ziel finden, dies nicht unbedingt der kürzeste Weg ist. Sie werden jedoch die Obergrenzen auf dem kürzesten Weg weiter verbessern, sodass Sie nicht alle Knoten öffnen müssen. Schließlich sollte Ihr offener Satz leer sein und der beste Weg, den Sie bisher gefunden haben, sollte der kürzeste sein.

Die modifizierten g-Kosten, die er beschreibt, scheinen eine große Unterschätzung zu sein, daher bin ich skeptisch, wie gut es in der Praxis funktioniert.

Celion
quelle
Hmm, ich könnte mich irren, aber ich interpretiere das eher als Stoppbedingung als als Bedingung für das Hinzufügen zur offenen Liste. Folgendes klingt wie die Bedingung für das Hinzufügen zur offenen Liste: "Als Randnotiz wird kein untergeordnetes Element eines Suchstatus für ein bestimmtes benachbartes Dreieck generiert, wenn ein diesem Dreieck entsprechender Status bereits ein Vorfahr dieses Status ist. Dies Ein Ausschluss kann erfolgen, weil dadurch niemals ein optimaler Pfad beseitigt wird, sondern nur einer, der durch Entfernen eines Teils davon kürzer werden könnte, wie in Satz 4.3.4 angegeben. "
Morrowless