Изменения

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

Алгоритм D*

1530 байт добавлено, 23:41, 2 января 2014
Нет описания правки
=== Описание ===
Обозначим множество <tex>SSucc(s) \in V</tex> как множество вершин графа, исходящих из вершины <tex>s</tex>.
Обозначим Аналогично множество <tex>SuccPred(s) \in SV</tex> как множество вершин, исходящих из вершины входящих в вершину <tex>s</tex>.
Аналогично множество Функция <tex>Pred0 \le с(s, s') \in Sle +\infty</tex> будет возвращать стоимость перехода из вершины <tex>s</tex> как множество вершин, входящих в вершину <tex>s'</tex>. При этом <tex>s' \in Succ(s)</tex>.
Функция <tex>0 \le с(s, s') \le +inf</tex> будет возвращать перехода из вершины <tex>s</tex> в вершину <tex>s'</tex>. При этом <tex>s' \in Succ(s)</tex>. Функция <tex>g(s)</tex> будет возвращать последнее известное (и самое минимальное) значение расстояние расстояния от вершины <tex>s_{start}</tex> до <tex>s</tex>.
Если <tex>s = s_{start}</tex>
:<texdpi="120">rhs(s) = 0</tex>
Иначе
:<texdpi="120">rhs(s) = min_{s' \in pred(s)}(g(s') + c(s', s)</tex> Вершина <tex>s</tex> может быть 3-х видов:* насыщена, если <tex>g(s) = rhs(s)</tex>* переполнена, если <tex>g(s) > rhs(s)</tex>* ненасыщена, если <tex>g(s) < rhs(s)</tex>
Будем говорить, что вершина <tex>s</tex> насыщена, если <tex>g(s) = rhs(s)</tex>
переполнена
ненасыщена
Очевидно, что если все вершины насыщены, то мы можем найти расстояние от стартовой вершины до любой.
Функция <tex>key(s)</tex>, где <tex>s</tex> - вершина, возвращает вектор из 2-ух значений <tex>k_1(s)</tex>, <tex>k_2(s)</tex>. <tex>k_1(s) = min(g(s), rhs(s)) + h(s, s_goal)</tex>. <tex>k_2(s) = min(g(s), rhs(s))</tex>
Если в конце поиска пути <tex>g(s_{goal}) = +inf\infty</tex>, то мы не смогли найти путь от <tex>s_{start}</tex> до <tex>s_{goal}</tex>на текущей итерации. Но после следующего изменения графа путь вполне может найтись.
=== Псевдокод ===
Основная функция, описывающая алгоритм '''CalcKeyMain'''(s):
{
return [<tex>min(g'''Initialize'''(s); rhs while (strue) { '''ComputeShortestPath'''() + h(s; В данный момент мы знаем кратчайший путь из <tex>s_{start}</tex> в <tex>s_{goal}</tex>. Ждем каких-либо изменений графа. for всех ориентированных ребер <tex>(u; v)</tex>;с измененными весами: { Обновляем результат функции <tex>minc(g(su; v)</tex>; rhs '''UpdateVertex'''(s))<tex>v</tex>]); } }
}
 
Теперь опишем составные элементы подробнее
'''Initialize'''():
{
//Заведем приоритетную очередь <tex>U</tex>, в которую будем помещать вершины. Сортировка будет производиться по функции <tex>key(s)</tex>. <tex>U = null\varnothing;</tex> for <tex>for all s \in S</tex> <tex>rhs(s) = g(s) = 1\infty;</tex> <tex>rhs(s_starts_{start}) = 0;</tex> <tex>U.Insert(<tex>s_{start}</tex>;CalcKey(<tex>s_{start}</tex>)); }  Функция <tex>key(s)</tex>. Возвращаемые значения сортируются в лексографическом порядке, т.е. сначала <tex>k_1(s)</tex>, потом <tex>k_2(s)</tex> '''CalcKey'''(s): { return [<tex>\min(g(s); rhs(s)) + h(s; s_{goal})</tex>;<tex>\min(g(s);rhs(s))</tex>];
}
'''UpdateVertex'''(<tex>u</tex>):
{
if (<tex>u != \ne s_{start}</tex>) <tex>rhs(u) = min_{s' \in Pred(u)}(g(s')+c(s',u));</tex>
if (<tex>u \in U</tex>)
U.Remove(u);
if (<tex>g(u) != \ne rhs(u)</tex>) U.Insert(<tex>u</tex>;CalcKey(<tex>u</tex>));
}
'''ComputeShortestPath'''():
{
while (U.TopKey()< CalcKey(<tex>s_{goal}</tex>) OR rhs(<tex>s_{goal}) != \ne g(s_{goal}</tex>))
u = U.Pop();
if (g(u) > rhs(u))
g(u) = rhs(u);
for all <tex>s 2 \in Succ(u) </tex> UpdateVertex(s);
else
g(u) = 1<tex>+\infty</tex>; for all <tex>s \in Succ(u) perec \cup \{u\}</tex> UpdateVertex(s); }  '''Main'''(): { Initialize(); while (<tex>s_{start} != s_{goal}</tex>) { 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); } }
}
== Алгоритм D* ==
=== Псевдокод (Первая версия) ===
'''CalcKey'''(s):
return [<tex>\min(g(s);rhs(s)) + h(sstarts_{start};s)</tex>;<tex>\min(g(s); rhs(s))</tex>];
'''Initialize'''():
U = null<tex>\varnothing</tex>; for all <tex>s \in S</tex> <tex>rhs(s) = g(s) = 1+\infty</tex>
<tex>rhs(s_{goal}) = 0</tex>
U.Insert(sgoal<tex>s_{goal}</tex>;CalcKey(sgoal<tex>s_{goal}</tex>));
'''UpdateVertex'''(u):
if (<tex>u 6!= s_{goal}</tex>) rhs(u) = mins02Succmin_{s' \in Succ(u)}(c(u;,s0') + g(s0'));f07’g if (<tex>u 2 \in U</tex>) U.Remove(u);f08’g if (<tex>g(u) 6!= rhs(u)</tex>) U.Insert(u;CalcKey(u));
'''ComputeShortestPath'''()
while (U.TopKey()<_ tex><=</tex> CalcKey(<tex>s_{start}</tex>) OR <tex>rhs(s_{start}) 6!= g(s_{start})</tex>)
u = U.Pop();
if (g(u) > rhs(u))
g(u) = rhs(u);
for all <tex>s 2 \in Pred(u) </tex> UpdateVertex(s);
else
g(u) = 1<tex>+\infty</tex>; for all <tex>s 2 \in Pred(u) [ fug \cup \{u\}</tex> UpdateVertex(s);
'''Main'''():
Initialize();
ComputeShortestPath();
while (<tex>s_{start} 6= \ne s_{goal}</tex>) // if (<tex>g(sstarts_{start}) = 1\infty</tex>) then there is no known path */тогда путь на данной итерации не найден. sstart s_{start} = argmins02Succ(sstart)(c(sstart;s0) + g(s0));f22’g Move to sstart<tex>s_{start}</tex>;f23’g Scan graph for changed edge costs;f24’g if any edge costs changedf25’g for all directed edges (u;v) with changed edge costsf26’g Update the edge cost c(u;v);f27’g UpdateVertex(u);f28’g for all <tex>s 2 \in U</tex>f29’g U.Update(<tex>s</tex>;CalcKey(<tex>s</tex>));f30’g ComputeShortestPath();
==Ссылки==
418
правок

Навигация