Pogłębianie iteracyjne A*
Klasa | Algorytm wyszukiwania |
---|---|
Struktura danych | Drzewo , wykres |
Złożoność przestrzeni w najgorszym przypadku |
Pogłębianie iteracyjne A* ( IDA* ) to algorytm przechodzenia grafu i wyszukiwania ścieżki , który może znaleźć najkrótszą ścieżkę między wyznaczonym węzłem początkowym a dowolnym elementem zbioru węzłów docelowych w grafie ważonym. Jest to wariant iteracyjnego pogłębiania przeszukiwania w głąb , który zapożycza pomysł wykorzystania funkcji heurystycznej do oceny pozostałego kosztu dotarcia do celu z algorytmu wyszukiwania A* . Ponieważ jest to algorytm przeszukiwania w głąb, jego wykorzystanie pamięci jest mniejsze niż w A*, ale w przeciwieństwie do zwykłego iteracyjnego wyszukiwania pogłębiającego, koncentruje się on na eksploracji najbardziej obiecujących węzłów, a zatem nie dociera do tej samej głębokości wszędzie w drzewie wyszukiwania. W przeciwieństwie do A*, IDA* nie wykorzystuje programowania dynamicznego i dlatego często kończy się wielokrotnym eksplorowaniem tych samych węzłów.
Podczas gdy standardowe iteracyjne pogłębianie w głąb wyszukiwania wykorzystuje głębokość wyszukiwania jako punkt odcięcia dla każdej iteracji, IDA * używa bardziej informacyjnego , gdzie to koszt podróży od korzenia do węzła h problemu heurystycznym oszacowaniem kosztu podróży od do celu.
Algorytm został po raz pierwszy opisany przez Richarda Korfa w 1985 roku.
Opis
Iteracyjne pogłębianie-A * działa w następujący sposób: przy każdej iteracji przeszukuj najpierw w głąb, odcinając gałąź, gdy jej całkowity koszt przekracza określony próg . Próg ten zaczyna się od oszacowania kosztu w stanie początkowym i wzrasta dla każdej iteracji algorytmu. W każdej iteracji próg używany do następnej iteracji jest minimalnym kosztem wszystkich wartości, które przekroczyły bieżący próg.
Podobnie jak w A*, heurystyka musi mieć określone właściwości, aby zagwarantować optymalność (najkrótsze ścieżki). Zobacz Właściwości poniżej.
Pseudo kod
ścieżka bieżąca ścieżka wyszukiwania (działa jak stos) węzeł bieżący węzeł (ostatni węzeł w bieżącej ścieżce) g koszt dotarcia do bieżącego węzła f szacowany koszt najtańszej ścieżki (root..node..goal) h ( węzeł ) szacowany koszt najtańsza ścieżka (node..goal) cost ( node , succ ) krok cost function is_goal ( node ) cel test następcy ( node ) funkcja rozwijania węzłów, rozwiń węzły uporządkowane według g + h(węzeł) ida_star ( root ) zwróć albo NOT_FOUND albo parę z najlepszą ścieżką i jej procedurą kosztową ida_star ( root ) bound := h ( root ) path := [ root ] pętla t := szukaj ( ścieżka , 0, granica ) jeśli t = ZNALEZIONO to wróć (ścieżka, granica) jeśli t = ∞ to zwróć NOT_FOUND granica := t koniec pętli koniec procedury wyszukiwanie funkcji ( ścieżka , g , granica ) węzeł := ścieżka .last f := g + h ( węzeł ) jeśli f > granica to powrót f jeśli is_cel ( węzeł ) następnie zwróć ZNALEZIONO min := ∞ dla succ w następnikach ( węzeł ) zrób jeśli succ nie w ścieżce to ścieżka .push( succ ) t := szukaj ( ścieżka , g + koszt ( węzeł , succ ), powiązany ) jeśli t = ZNALEZIONO następnie zwróć ZNALEZIONO if t < min then min := t ścieżka .pop() end if end for return min end funkcja
Nieruchomości
Podobnie jak A*, IDA* gwarantuje znalezienie najkrótszej ścieżki prowadzącej od danego węzła początkowego do dowolnego węzła docelowego na grafie problemu, jeśli funkcja heurystyczna h jest dopuszczalna , tj.
dla wszystkich węzłów n , gdzie h * jest prawdziwym kosztem najkrótszej ścieżki od n do najbliższego celu („doskonała heurystyka”).
IDA* jest korzystne, gdy problemem jest ograniczona pamięć. Wyszukiwanie * utrzymuje dużą kolejkę niezbadanych węzłów, które mogą szybko zapełnić pamięć. Z drugiej strony, ponieważ IDA* nie zapamiętuje żadnego węzła oprócz tych znajdujących się na bieżącej ścieżce , wymaga ilości pamięci , która jest liniowa tylko w długości konstruowanego rozwiązania. Jego złożoność czasową analizują Korf i in. przy założeniu, że heurystyczne oszacowanie kosztów h jest spójne , co oznacza, że
dla wszystkich węzłów n i wszystkich sąsiadów n' z n ; dochodzą do wniosku, że w porównaniu z przeszukiwaniem drzewa metodą brute-force nad problemem o wykładniczej wielkości, IDA* osiąga mniejszą głębokość wyszukiwania (o stały współczynnik), ale nie mniejszy współczynnik rozgałęzienia.
Wyszukiwanie rekurencyjne od najlepszego do pierwszego to kolejna ograniczona pamięcią wersja wyszukiwania A*, która w praktyce może być szybsza niż IDA*, ponieważ wymaga mniejszej regeneracji węzłów.
Aplikacje
Zastosowania IDA* znajdują zastosowanie w takich problemach jak planowanie .