Изменения

Перейти к: навигация, поиск

Алгоритм D*

1568 байт добавлено, 18:07, 17 декабря 2013
Нет описания правки
LPA*
Обозначим множество <tex>S</tex> как множество вершин графа.
Обозначим множество <tex>Succ(s) \in S</tex> как множество вершин, исходящих из вершины <tex>s</tex>.
Аналогично множество <tex>Pred(s) \in S</tex> как множество вершин, входящих в вершину <tex>s</tex>.
Обозначим множество SuccФункция <tex>0 <= с(s, s') in S как множество вершин, исходящих <= +inf</tex> будет возвращать перехода из вершины sв вершину s'. Аналогично множество PredПри этом s' in Succ(s) in S как множество вершин, входящих в вершину s.
Функция g(s) будет возвращать последнее известное значение расстояние от вершины s_start до s. Если <tex>s = s_starts_{start}</tex><tex>rhs(s) = 0</tex>
Иначе
<tex>rhs(s) = min_smin_{s' in pred(s) }(g(s') + c(s', s)</tex>
Будем говорить, что вершина s @A vertex s is called locally consistent@, если g(s) = rhs(s)
Очевидно, что если все вершины "locally consistent", то мы можем найти расстояние от стартовой вершины до любой.
Функция key(s), где s-вершина, возвращает вектор из 2-ух значений k_1(s), k_2(s). k_1(s) = min(g(s), rhs(s)) + h(s, s_goal). k_2(s) = min(g(s), rhs(s))
Функция keyЕсли в конце поиска пути g(ss_goal)= +inf, где то мы не смогли найти путь от s_start до s_goal Псевдокод: procedure CalcKey(s-вершина, возвращает вектор из 2-ух значений k_1){return [min(g(s), k_2; rhs(s). k_1) + h(s;sgoal) = ;min(g(s), ; rhs(s))];} procedure Initialize(){U = nullfor all s \in S{rhs(s) = g(s) = 1;}rhs(s_start) = 0;U.Insert(s_{start};CalcKey(s_{start}));} procedure UpdateVertex(u){if (u != s_{start}) rhs(u) = min_{s' \in Pred(u)}(g(s') + hc(s', s_goalu));if (u \in U) U.Remove(u);if (g(u) != rhs(u)){U.Insert(u;CalcKey(u));}} procedure ComputeShortestPath(){while (U.TopKey()< CalcKey(sgoal) OR rhs(sgoal) != g(sgoal))u = U. k_2Pop();if (g(u) > rhs(u))g(u) = rhs(u);for all s2 Succ(u) = minUpdateVertex(s);elseg(u) = 1;for all s\in Succ(u), rhsperec {u}{UpdateVertex(s);}} procedure Main(){Initialize();while (s_start != s_goal){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);}}}
418
правок

Навигация