我正在尝试为Boost::Graph实现D*-Lite路径查找算法,正如Koenig和Likhachev在2002年的文章中所描述的那样。我想我已经很好地掌握了它背后的基本思想和理论,但我在理解Pred
和Succ
集何时更新时遇到了问题。
我猜它发生在Main
中的Move to sstart
步骤中,但对ComputeShortestPath
的第一次调用将毫无意义?Succ
集合是否应该与Pred
同时插入?那么CCD_ 8和CCD_?
我在下面插入了算法的伪代码。CCD_ 10和CCD_。g
、h
、rhs
和c
是不同的成本和权重。CCD_ 16是要访问的顶点的优先级队列。
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();
原来我对基本思想和理论没有很好的把握。。。我误解了"继任者"one_answers"前任"的含义,因为我认为它的意思是"按路径顺序",所以在路径v0->v1->v2
中,v0
将是v1
的前任,v2
将是继任者。
然而,这仅仅意味着邻居。前一个集合是所有顶点的集合,其中给定顶点具有"内边",后继顶点具有"外边"。
阅读LPA*论文,您就会知道它们是什么。基本上,在LPA*中,搜索从起始位置开始。因此,后继节点将是u.Pop节点周围的节点。这意味着,它们是您将从当前节点转到的节点。Pred,它只是一个母节点。这意味着继任者的Pred是u.Pop.
在DLite中,一切都相反。搜索从目标位置开始。所以,这对你来说有点困惑。DLite的继任者是LPA*中的Pred。因此,继任者=U.pop。DLite的Pred是LPA的继任者。因此,Pred是您将从后续节点转到的节点。
希望你能理解我糟糕的英语。