我在23:14时正在http://youtu.be/gGQ-vAmdAOI?t=23m14s工作,我觉得那个分支&与“扩展列表”绑定的方式与Dijkstra的算法非常相似。稍后在演讲中,当算法再次使用可接受的启发式扩展时,我们得到A *。
这让我想到Dijkstra的算法就是这个分支的子类。界。是吗?
总结讲座:
探索搜索算法。特别是,它们从一个简单的分支开始。约束解决方案:
在访问(扩展)目标节点之前,访问距离源最短距离的节点,并将其后续节点添加到要访问的节点的优先级队列(按最小距离排序)。这还没有检测到周期(例如,不止一次访问节点),并且由于组合爆炸而效率相当低。
简单的扩展会使算法执行得更好:记住已经访问过哪些节点(扩展,因此扩展名列表)。现在没有两次访问节点,算法的性能要好得多。
在最后一部分中,将一个可接受的启发式添加到混音中以获得A *。
我希望这是足够的信息,我不必复制讲座中的例子。如果不是,请告诉我,我会这样做!
答案 0 :(得分:3)
区别仅在于实施,这个想法是一样的。 Dijkstra算法的特殊之处在于它的分支和分支。用堆完成绑定(这会给你一个很大的加速)。
答案 1 :(得分:1)
是的,只要我们假设可以动态检查扩展列表,那么您是对的。如果我们在"extended list"
中有一个状态,则意味着我们已经使用value = n
的路径访问了该状态。
虽然我们运行算法时遇到的路径是使用value < n
访问该节点,但是"extended list"
为我们提供了替换BnB
优先级队列上的路径的选项,本质上是Djikstra
。您可以使用哈希表来实现这一点,该哈希表在算法每次运行时都像Djikstra
一样,为每个节点保留最短路径的值。