Algorytm wyszukiwania ścieżki triangulacji A * (TA *)


11

Potrzebuję pomocy w zrozumieniu algorytmu trójkąta A * (TA *) opisanego przez Demyen w jego dokumencie „ Efficient-Triangulation-Based Pathfinding” na stronach 76-81.

Opisuje, jak dostosować zwykły algorytm A * do triangulacji, aby szukać innych możliwie bardziej optymalnych ścieżek, nawet po osiągnięciu / rozwinięciu końcowego węzła. Zwykły A * zatrzymuje się po rozwinięciu ostatniego węzła, ale nie zawsze jest to najlepsza ścieżka, gdy jest używana na wykresie triangulowanym. To właśnie mam problem.

Problem zilustrowano na stronie 78, rysunek 5.4: wprowadź opis zdjęcia tutaj

Rozumiem, jak obliczyć wartości g i h przedstawione w artykule (strona 80).

Myślę, że warunkiem zatrzymania wyszukiwania jest:

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

gdzie currentNode to węzeł wyszukiwania wyskakujący z otwartej listy (kolejka priorytetowa), która ma najniższy wynik f. shortestDistanceFound to rzeczywista odległość najkrótszej znalezionej do tej pory ścieżki.

Ale jak wykluczyć wcześniej znalezione ścieżki z przyszłych wyszukiwań? Bo jeśli powtórzę wyszukiwanie, to oczywiście znajdzie tę samą ścieżkę. Czy resetuję zamkniętą listę? Muszę coś zmodyfikować, ale nie wiem, co muszę zmienić. Papier nie ma pseudokodu, więc byłoby to pomocne.

Odpowiedzi:


3

Nie wdrożyłem tego, ale kiedy to czytam, myślę, że zrobiłbyś coś takiego:

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

Różnica polega na tym, że nawet jeśli okaże się drogę do bramki, to nie koniecznie najkrótsza ścieżka. Ale będziesz nadal poprawiać górne granice na najkrótszej ścieżce, co oznacza, że ​​nie będziesz musiał otwierać wszystkich węzłów. W końcu twój otwarty zestaw powinien być pusty, a najlepsza znaleziona do tej pory ścieżka powinna być najkrótsza.

Zmodyfikowany koszt g, który opisuje, wydaje się dużym niedoszacowaniem, więc jestem sceptyczny co do tego, jak dobrze działa w praktyce.


Hmm, mogę się mylić, ale interpretuję to jako warunek zatrzymania, a nie warunek dodania do otwartej listy. Następujące brzmienie brzmi jak warunek dodania do otwartej listy: „Na marginesie, potomek stanu wyszukiwania nie będzie generowany dla konkretnego sąsiadującego trójkąta, jeśli stan odpowiadający temu trójkątowi jest już przodkiem tego stanu. To wykluczenia można dokonać, ponieważ nigdy nie wyeliminuje ono optymalnej ścieżki, tylko takiej, która może stać się krótsza poprzez usunięcie jej części, jak stwierdzono w Twierdzeniu 4.3.4. ”
Morrowless
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.