8

我正在尝试实现 D*-Lite 寻路算法,如 Koenig 和 Likhachev 在2002 年针对 Boost::Graph 的文章中所述。我想我已经很好地掌握了它背后的基本思想和理论,但是当PredSucc集合更新时我在理解上遇到了问题。

我猜它发生在Move to sstartstep in 中Main,但是第一次调用ComputeShortestPath将毫无意义?并且该Succ集合是否应该同时插入Pred?那么Pred并且Succ可以实现为双向链表吗?

我在下面插入了算法的伪代码。和集合分别是前任和后继Pred。, ,和是不同的成本和权重。是要访问的顶点的优先级队列。SuccghrhscU

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();
4

2 回答 2

8

事实证明我对基本思想和理论没有很好的掌握......我误解了“继任者”和“前任者”的含义,因为我认为它的意思是“按路径顺序”,所以在路径中v0->v1->v2v0将是 的前身v1v2继任者。

然而,这只是邻居的意思。前驱集是给定顶点具有“入边”的所有顶点的集合,而后继有“出边”。

于 2011-08-15T16:15:37.087 回答
0

阅读 LPA* 论文,您就会知道它们是什么。基本上,在 LPA* 中,搜索从起始位置开始。因此,继任者将是 u.Pop 节点周围的节点。这意味着,它们是您将从当前节点转到的节点。而Pred,简直就是一个母节点。这意味着继承者的 Pred 是 u.Pop。

在 D Lite 中,一切都相反。搜索从目标位置开始。所以,这对你来说有点困惑。D Lite 的继任者是 LPA* 中的 Pred。所以,继任者 = U.pop。D Lite 的Pred是 LPA 的继任者。因此,Pred 是您将从继任者那里转到的节点。

希望你能理解我糟糕的英语。

于 2014-10-22T16:58:03.863 回答