BFS(Best-First-Search)算法也是可以看作基于启发式的深度优先算法,其按照和Dijkstra类似的流程运行,不同的是它能够评估任意结点到目标点的代价(即启发式函数) 。与选择离初始结点最近的结点不同的是,它选择离目标最近的结点 。BFS不能保证找到一条最短路径 。但是它比Dijkstra算法快的多,因为它用了一个启发式函数(heuristic )能快速地导向目标结点 。例如,如果目标位于出发点的南方,BFS将趋向于导向南方的路径 。在下面的图中,越黄的结点代表越高的启发值(移动到目标的代价高),而越黑的结点代表越低的启发值(移动到目标的代价低) 。这表明了与Dijkstra 算法相比,BFS运行得更快 。
文章插图
然而,这两个例子都仅仅是最简单的情况——地图中没有障碍物,最短路径是直线的 。现在我们来考虑前边描述的凹型障碍物 。Dijkstra算法运行得较慢,但确实能保证找到一条最短路径:
文章插图
另一方面,BFS运行得较快 , 但是它找到的路径明显不是一条好的路径:
文章插图
由于BFS是基于贪心策略的 , 它试图向目标移动尽管这不是正确的路径 。由于它仅仅考虑到达目标的代价,而忽略了当前已花费的代价,于是尽管路径变得很长,它仍然继续走下去 。
结合两者的优点不是更好吗?1968年发明的A算法就是把启发式方法(heuristic approaches)如BFS,和常规方法如Dijsktra算法结合在一起的算法 。有点不同的是,类似BFS的启发式方法经常给出一个近似解而不是保证最佳解 。然而,尽管A基于无法保证最佳解的启发式方法,A却能保证找到一条最短路径 。
A: 带有启发式函数的Dijkstra算法*
把Dijkstra算法(靠近初始点的结点)和BFS算法(靠近目标点的结点)的信息块结合起来 。在A的标准术语中,g(n)表示从初始结点到任意结点n的代价 , h(n)表示从结点n到目标点的启发式评估代价(heuristic estimated cost) 。当从初始点向目标点移动时,A* 权衡这两者 。每次进行主循环时,它检查f(n)最小的结点n , 其中f(n) = g(n) + h(n) 。
- 累积成本
- g(n): 从起始状态到节点“n”的累积成本的当前最佳估计
- 启发式函数
- h(n): 从节点n到目标状态(即目标成本)的预计最小成本
- 从起始状态到通过节点“n”的目标状态的最小预计成本是 f(n) = g(n) + h(n)
- 策略: 扩展具有最便宜的 f(n) = g(n) + h(n) 的节点
- 更新所有未扩展邻居“m”的节点“n”的累积成本 g(m)
- 已经扩展的节点保证具有从起始状态到该节点的最小成本 :::success
- 维护一个优先队列来存储所有待扩展的节点
- 对所有节点预定义启发函数h(n)
推荐阅读
- 张国立:别再将我儿子当“问题男人”,他41岁未婚谁之过?
- 600亿财产!朱玲玲不掺和罗家夺产之争,两嫁豪门分文不要!
- 中之源集团是什么公司,昆虫记毛虫的毒素之源在他的绒毛中
- 演技、台词都被吐槽,刘诗诗复出之作《一念关山》不如预期,或将掉出85花阵营
- 不只是减肥,运动还有这项超级能力,医学证明有效!
- 电脑怎么恢复误关的网页,电脑意外断电之后连不上网络怎么解决
- 民风民俗的故事之泼水节的来历是什么
- 怎样可以快速瘦腰,怎样运动能快速减肥?
- 电脑出厂设置在哪里,电脑出厂设置之后怎么开始用
- 直击曾之乔、辰亦儒林口吃饭!几乎“0互动全被拍”回家也分开走