Алгоритм D * - Lite
я пытаюсь реализовать алгоритм поиска пути D * - Lite, как описано в статья 2002 по Кенигу и Лихачеву, для Boost:: Graph. Я думаю, что я получил приличное представление об основных идеях и теории за ним, но у меня есть проблема с пониманием, когда Pred
и Succ
наборы обновляются.
я предполагаю, что это происходит в Move to sstart
шаг Main
, но тогда первый вызов ComputeShortestPath
будет довольно бессмысленным? И это Succ
установить предполагается вставлять одновременно с Pred
только? Тогда Pred
и Succ
может быть имплантирован как дважды связанные списки?
я вставил псевдокод алгоритма ниже. The Pred
и Succ
наборы являются предшественниками и преемниками соответственно. g
, h
, rhs
и c
различные цены и Весы. U
является приоритетной очередью вершин для посещения.
procedure CalculateKey(s)
{01’} return [min(g(s), rhs(s)) + h(sstart, s) + km; min(g(s), rhs(s))];
procedure Initialize()
{02’} U = ∅;
{03’} km = 0;
{04’} for all s ∈ S rhs(s) = g(s) = ∞;
{05’} rhs(sgoal) = 0;
{06’} U.Insert(sgoal, CalculateKey(sgoal));
procedure UpdateVertex(u)
{07’} if (u ≠ sgoal) rhs(u) = min s'∈Succ(u)(c(u, s') + g(s'));
{08’} if (u ∈ U) U.Remove(u);
{09’} if (g(u) ≠ rhs(u)) U.Insert(u, CalculateKey(u));
procedure ComputeShortestPath()
{10’} while (U.TopKey() < CalculateKey(sstart) OR rhs(sstart) ≠ g(sstart))
{11’} kold = U.TopKey();
{12’} u = U.Pop();
{13’} if (kold ˙<CalculateKey(u))
{14’} U.Insert(u, CalculateKey(u));
{15’} else if (g(u) > rhs(u))
{16’} g(u) = rhs(u);
{17’} for all s ∈ Pred(u) UpdateVertex(s);
{18’} else
{19’} g(u) = ∞;
{20’} for all s ∈ Pred(u) ∪ {u} UpdateVertex(s);
procedure Main()
{21’} slast = sstart;
{22’} Initialize();
{23’} ComputeShortestPath();
{24’} while (sstart ≠ sgoal)
{25’} /* if (g(sstart) = ∞) then there is no known path */
{26’} sstart = argmin s'∈Succ(sstart)(c(sstart, s') + g(s'));
{27’} Move to sstart;
{28’} Scan graph for changed edge costs;
{29’} if any edge costs changed
{30’} km = km + h(slast, sstart);
{31’} slast = sstart;
{32’} for all directed edges (u, v) with changed edge costs
{33’} Update the edge cost c(u, v);
{34’} UpdateVertex(u);
{35’} ComputeShortestPath();
2 ответов
оказывается я не иметь приличное представление об основных идеях и теории... Я неправильно понял значение "преемник" и "предшественник", так как я предполагал, что это означает "в порядке пути", так что в пути v0->v1->v2
, v0
будет предшественником v1
и v2
преемник.
то, что подразумевалось, однако, было просто соседями. Набор предшественников был набором всех вершин с "in-edge" для данной вершины, а преемники имели "вне края".
читать LPA * бумага вы будете знать, что они такое. В принципе, в LPA* поиск начинается с начальной позиции. Таким образом, преемниками будут узлы вокруг u.Поп-узел. Это означает, что они являются узлами, на которые вы перейдете из текущего узла. И пред, это просто материнский узел. Это означает, что пред преемников-u.Поп.
В DLite, все идет наоборот. Поиск начинается с позиции цели. Так что, это немного запутано для вас. Преемник DLite Pred in LPA*. Итак, преемник = U. pop. Пред ДLite является преемником в LPA. Таким образом, Pred-это узел, на который вы перейдете от преемника.
надеюсь, вы понимаете мой плохой английский.