Алгоритм D*
D* (pronounced "D star") is any one of the following three related incremental search algorithms.
LPA* Обозначим множество как множество вершин графа. Обозначим множество как множество вершин, исходящих из вершины . Аналогично множество как множество вершин, входящих в вершину .
Функция будет возвращать перехода из вершины в вершину . При этом .
Функция до .
Если Иначе
Будем говорить, что вершина s @A vertex s is called locally consistent@, если Очевидно, что если все вершины "locally consistent", то мы можем найти расстояние от стартовой вершины до любой.
Функция , где - вершина, возвращает вектор из 2-ух значений , . .
Если в конце поиска пути , то мы не смогли найти путь от до
Псевдокод:
 CalcKey(s):
 {
   return [;];
 }
 Initialize():
 {
   
   
     
   
   
 }
UpdateVertex(): { if () if () U.Remove(u); if (g(u) != rhs(u)) U.Insert(;CalcKey()); }
 ComputeShortestPath():
 {
   while (U.TopKey()< CalcKey(s_{goal}) OR rhs(s_{goal}) != g(s_{goal}))
     u = U.Pop();
     if (g(u) > rhs(u))
       g(u) = rhs(u);
       for all s 2 Succ(u) UpdateVertex(s);
     else
       g(u) = 1;
     for all s \in Succ(u) perec {u}
       UpdateVertex(s);
 }
 Main():
 {
   Initialize();
   while ()
   {
     ComputeShortestPath();
     Wait for changes in edge costs;
     for all directed edges (u;v) with changed edge costs
     {
       Update the edge cost c(u;v);
       UpdateVertex(v);
     }
   }
 }
Таким образом мы описали алгоритм LPA*. Он неоднократно определяет путь между вершинами и , используя при этом данные из предыдущих итераций. Очевидно, что в худшем случае (а именно когда все ребра вокруг текущей вершины изменили свой вес) алгоритм будет работать как последовательные вызовы алгоритма А* за O(n^2*log(n)). Улучшим эту оценку с помощью алгоритма D* lite. Примечание: на практике же такой подход тоже имеет место на плотных графах (или матрицах), так как в среднем дает оценку О(n*log(n)).
