A*算法是启发式搜索算法,是根据Dijkstra算法改进而来。

一、定义:是一种在图形平面上,对于有多个节点的路径求出最低通过成本的算法。它属于图遍历和最佳优先搜索算法,亦是BFS 的改进。


二、如何更好的理解A*算法?

如下图所示,S为起始(start)节点,G为目标(goal)节点。

(1)节点之间连线是两点的路径长度,如A到E的路径长度c(A,E) = 9。

(2)节点旁的h值时当前节点到达目标节点(G)的预估值,如h(A)=15, 表示从当前点A到达目标点G的估计路径长度为15,此处h(x)即为启发函数。

(3)从起点S到达当前节点x的路径长度表示为g(x) 。

(4)从起点S到达目标G并经过点x的估计距离长度表示为f(x) = g(x) + h(x),该公式是A*算法的核心公式。

(5)A*算法通过不断的选择估计距离f最小的节点,逐渐构建最短路径。

A*算法


逻辑流程

创建两个集合OPEN集,CLOSED集,算法核心是从OPEN集中选择最优(f值小最优,或f相同时,h小的更优)的节点到CLOSED集中,然后将其后继节点放入OPEN集中,然后重复操作选取最优节点,直到到达目标,或者OPEN为空为止。最后再CLOSED集中根据目标G所包含的前序节点逆序查找最后到达起点S,这个链路的逆序即最优路径,具体流程如下图。

A*算法


搜索过程

以下是前面网络的搜索过程展开图。

组合块中:

(a)灰色为前序节点

(b)蓝色当前节点x

(c)g:起点S到当前节点x的路径距离。

(d)h:当前节点x到终点G的估计距离

(e)f:起点S途径x到达终点G的估计距离,即 f = g + h

(f)绿色框为当前OPEN集合中的最优节点

(g)红色框表示当前OPEN集合中需要被删除的节点

在OPEN、CLOSED中每一行表示一次完整迭代完成时两集合中的节点集合。

最后的最优路径是:S->B->F->k->G

注:当两个节点f相同时,h小的更优

A*算法


点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)