1.简介
A* (A-Star) 算法一种静态路网中求解最短路径最有效的方法之一, 是一种常用的启发式算法.
启发式算法:通过启发函数(heruistic)计算出键值, 引导算法的搜索方向.
2. 算法描述
Ray Wenderlich - Introduction to A* Pathfinding
此文非常好的介绍了A*算法的逻辑及其中的关键点, 而且英文通俗易懂, 因此本文并不会详细的翻译此篇博文.
简单说来, A*算法是从起点开始, 通过对相邻可到达点的键值计算以及和其它可选点的键值对比, 从中选出最小键值的点, 然后继续计算此点的相邻点的键值, 直到抵达终点. 想象如同一个石子落入水中, 水的波纹外扩散, 一圈一圈的波纹可看作键值相同的点. A*算法并不需要遍历所有的点, 相反, 如果启发函数即当前点距离估计与实际值越接近, A*算法即会沿最短路径向终点移动, 避免遍历键值高的点.
因此算法关键在于利用OPEN和CLOSE列表记录访问点的情况以及如何计算键值
2.1 OPEN和CLOSE列表
OPEN列表: 所有正在被考虑的备选点列表, 此表并不是所有的点的列表, 而是A*算法在计算相邻点时, 可到达的点.
CLOSE列表: 所有访问过的点列表.
当从所有相邻可到达点中选中最小键值的点, 此点则放入CLOSE列表, 其余的点则放入OPEN列表.
2.2 键值计算 F = G+H
G值: 代表从起点到当前点的代价
H值: 代表从当前点到终点的代价, 由于从当前点出发, 并不知道最终会如何抵达终点, 所以此值为启发函数估计的值.
需要注意的是, 如果当计算相邻点(相邻点已在OPEN中)的键值F小于已存储的键值, 代表有更好的路径到达相邻点, 那么需要更新相邻点的键值以及G值.
2.3 H (heuristic)
以h(n)表达状态n到目标状态估计的距离, h*(n) 代表实际距离,那么h(n)的选取大致有如下三种情况:
-
如果h(n)< h*(n),这种情况,搜索的点数多,搜索范围大,效率低。但能得到最优解。
-
如果h(n)=h*(n),此时的搜索效率是最高的。
-
如果 h(n)>h*(n),搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
通常的启发式函数可以有曼哈顿距离, 对角线距离, 欧几里得距离等等, 或者根据实际情况建立启发式方程.