在哪里可以找到有关D *或D * Lite寻路算法的信息?

时间:2010-05-24 22:19:09

标签: algorithm path-finding d-star

关于D * here的一些论文有链接,但它们对我来说有点太数学了。有没有关于D * / D * Lite的信息更适合初学者?

7 个答案:

答案 0 :(得分:12)

维基百科有一篇关于这个主题的文章:http://en.wikipedia.org/wiki/D*

C中的D * Lite实现也可以从Sven Koenig的页面获得:http://idm-lab.org/code/dstarlite.tar但是我发现难以理解的数学比C源代码更容易阅读; - )

D * Lite(在C ++中)的另一个实现可以在这里找到:http://code.google.com/p/dstarlite/

答案 1 :(得分:11)

如果伪代码对你来说很难(你不必阅读定理和证明 - 如果你知道标准的算法,伪代码是非常简单的)你抱怨已发布的C和C ++代码然后我想你会需要去做别的事情: - )

说真的,不要指望有人可以在几个网段中教你一流的算法。拿一支笔和纸,然后在纸上写下,画出并跟踪发生了什么。您可能需要阅读两次并且谷歌一两个引用以了解它周围的一些概念,并且根本不需要深入研究定理和证明 - 除非您希望证明作者错误:-) )

没有更多的数学就无法前进 - c'est la vie。想象一下,你曾经让别人教你什么是矩阵反转,但你不知道什么是矢量。在你第一次学到足够的数学语境之前,没有人可以帮助你。

答案 2 :(得分:8)

话虽如此,为什么不再添加一些论文,是的,他们也有数学:-)但我会尝试获得一些更近期的东西。随着时间的推移,人们通常会更好地解释自己的工作,所以重点是Stentz,Likhachev和Koenig

答案 3 :(得分:5)

Layrie的D * Lite解释

D *以StartGoal之间的乌鸦,理想主义路径开始;它仅在遇到障碍物时(通常通过移动到相邻节点)处理障碍物。那就是 - D * Lite不知道任何障碍直到它开始沿着理想的路径移动。

任何寻路实施的圣杯都是为了让它在获得最短路径时快速,或者至少是一条不错的路径(以及处理[所有你在这里的各种特殊条件 - 对于D * Lite这是处理一个未知的火星漫游者可能会做的地图])。

所以D * Lite的一大挑战是在达到障碍时便宜地适应障碍。找到它们很简单 - 您只需在移动时检查邻居的节点状态。但是,我们如何调整现有地图的成本估算而不会遍历每个节点......这可能会非常昂贵?

LPA *使用巧妙的技巧来调整成本,这是D * Lite充分利用的技巧。当前节点询问其邻居:你最了解我,你认为我对自己是现实的吗?具体来说,它询问了它的g值,这是已知的成本从初始节点到自身,即当前节点。邻居查看他们自己的g,查看当前节点与他们相关的位置,然后估计他们认为其成本应该是什么。这些商品的最小值设置为当前节点的rhs值,然后用于更新其g值;在估算时,邻居会考虑新发现的障碍物(或自由空间),这样当使用g进行当前更新rhs时,会使用新障碍物(或自由空间)进行更新对

当我们全面拥有真实的g值时,当然会出现一条新的最短路径。

答案 4 :(得分:1)

我想出了这个 http://idm-lab.org/bib/abstracts/papers/aaai02b.pdf和这个 http://www.cs.cmu.edu/~maxim/docs/dlitemap_iros02.pdf

我希望那些链接可以帮到你:) 编辑:发布后我注意到我给你的链接也在你指出的链接中。不过我直接在Google上找到了这些。无论如何,我已经看了他们一点,他们似乎并不那么复杂。如果你很了解A *,你也应该设法理解D * 根据经验,我可以告诉你,A *也可以用于你想要的东西。

答案 5 :(得分:0)

Maxim Likhachev的CMU课堂笔记非常有用。它包含一个示例,该示例演示如何传播图形上发生的动态变化。还解释了不一致的思想,这对于理解算法非常重要。 http://www.cs.cmu.edu/~maxim/classes/robotplanning_grad/lectures/execanytimeincsearch_16782_fall18.pdf

答案 6 :(得分:0)

D *与D * Lite: 首先,D * -Lite被认为比D *简单得多,并且由于它始终至少与D *一样快地运行,因此它已经完全淘汰了D *。因此,从没有任何理由使用D *。请改用D * -Lite。

D * Lite与A *: D * Lite算法的工作原理是,从目标开始反向运行A *搜索,然后尝试重新开始。然后,求解器会给出当前的解决方案,并等待所提供的权重或障碍发生某种变化。与重复的A *搜索相反,D * Lite算法避免了从头开始进行重新规划,并避免了逐步修复路径,从而使更改保持在机器人姿势附近。

如果您想真正了解算法。我建议您先通读A *的伪代码并实现它。首先尝试了解如何将拾取和插入堆队列中,以及该算法如何使用另一种启发式方法而不是常规的Dijkstra算法,以及为什么该算法可以探索较少的顶点而不是Dijkstra。 / p>

一旦您对A *的工作原理有所了解(您也应该实施它),那么我建议您再次看看Koenig, 2002。我建议您首先开始查看常规的D * -Lite伪代码。确保您了解每一行代码。

优先级队列的概念

  • “ U”是您要在其中堆叠未探索顶点的优先级队列。
  • 'U'具有(key,value)元素,其中key是您的顶点,value是value = [k1,k2] = calculateKey的结果,表示键(含义顶点)的优先级。现在,您的优先级队列使用一个。
  • 'U.Top()'返回优先级队列U中所有顶点中优先级最低的顶点。
  • 'U.TopKey()'返回所有先前顶点的最小优先级。
  • 'U.Pop'删除优先级队列U中优先级最低的顶点并返回该顶点。
  • 'U.Insert()'将顶点插入具有优先级的优先级队列U。
  • 'U.Update()'将优先级队列U中顶点的优先级更改为。

实施

我已经使用python实现了Optimized D * -Lite算法(请看此线程here)。我建议您将代码和伪代码并排阅读。如果您愿意的话,那里也有说明来测试模拟。