SMA*

SMA* lub Simplified Memory Bounded A* to algorytm najkrótszej ścieżki oparty na algorytmie A* . Główną zaletą SMA* jest to, że używa ograniczonej pamięci, podczas gdy algorytm A* może wymagać pamięci wykładniczej. Wszystkie inne cechy SMA* są dziedziczone z A*.

Proces

Nieruchomości

SMA* ma następujące właściwości

  • Działa z heurystyką , podobnie jak A*
  • Jest kompletna, jeśli dozwolona pamięć jest wystarczająco duża, aby przechowywać najpłytsze rozwiązanie
  • Jest optymalny, jeśli dozwolona pamięć jest wystarczająco wysoka, aby przechowywać najpłytsze optymalne rozwiązanie, w przeciwnym razie zwróci najlepsze rozwiązanie, które mieści się w dozwolonej pamięci
  • Unika powtarzających się stanów, o ile pozwala na to ograniczenie pamięci
  • Wykorzysta całą dostępną pamięć
  • Zwiększenie ograniczenia pamięci algorytmu tylko przyspieszy obliczenia
  • Gdy dostępna jest wystarczająca ilość pamięci, aby pomieścić całe drzewo wyszukiwania, obliczenia mają optymalną szybkość

Realizacja

Implementacja prostego A* ograniczonego pamięcią jest bardzo podobna do implementacji A*; jedyna różnica polega na tym, że węzły o najwyższym koszcie f są usuwane z kolejki, gdy nie ma już miejsca. Ponieważ te węzły są usuwane, prosty A* ograniczony pamięcią musi pamiętać koszt f najlepiej zapomnianego dziecka węzła nadrzędnego. Kiedy wydaje się, że wszystkie zbadane ścieżki są gorsze od takiej zapomnianej ścieżki, ścieżka jest regenerowana.

Pseudo kod: funkcja prosta ograniczona pamięcią A*-gwiazda(problem): ścieżka

kolejka: zbiór węzłów uporządkowanych według f-cost;

zaczynać

 kolejka.insert(problem.węzeł główny); 
 while True rozpocznij, jeśli kolejka.empty() następnie zwróć błąd; //nie ma rozwiązania pasującego do podanego węzła pamięci := kolejka.begin();  // min-f-cost-node if problem.is-goal(node) następnie zwróć sukces;  s := następny-następca (węzeł) if !problem.is-goal(s) && głębokość(s) == maksymalna_głębokość następnie f(s) := inf;  // nie ma już pamięci do przejścia przez s, więc cała ścieżka jest bezużyteczna else f(s) := max(f(node), g(s) + h(s));  // wartość f następnika to maksimum // wartość f rodzica i // heurystyka następnika + długość ścieżki do końca następnika, jeśli nie ma więcej następców, zaktualizuj koszt f węzła i tych jego przodkowie w razie potrzeby if node.successors ⊆ kolejka, a następnie kolejka.remove(węzeł);  // wszystkie dzieci zostały już dodane do kolejki krótszą drogą jeśli pamięć jest pełna to zacznij źle Node := najpłytszy węzeł z najwyższym kosztem f;  dla rodzica w złym węźle.rodzice rozpoczynają parent.successors.remove(bad Node);  w razie potrzeby kolejka.wstaw(rodzic);  koniec za koniec, jeśli  
 kolejka.wstaw(y); koniec póki  

koniec</syntax highlight>