前言
关于A*算法的实现是很早之前的一次开发中的成果,并做了一些改进。当然,在这里就不记录改进部分了,因为其中还有一些争议。这里仅是对A*算法的理解和使用Python实现。
参考链接
之所以放在前面,是因为这些链接的参考价值特别高,如果希望获得更多的了解,可以通过以下链接进行学习。
英文网站
redblobgames(红色斑点游戏)
中文网站
csdn:A星算法详解(个人认为最详细,最通俗易懂的一个版本)|模块 A*算法总结 非常有参考价值
知乎:路线规划之A*算法
定义
(百度百科)A*(A-Star)算法是一种静态路网中求解
最短路径
最有效的直接搜索方法,也是解决许多搜索问题的
有效
算法。算法中的
距离
估算值与实际值越接近,最终
搜索
速度越快
一个真正的A*算法必须包含以下对象:开启列表、关闭列表、G、H
分析
估价函数F(n)=G(n)+H(n)
G(n)
G(n)表示的是从起始节点到当前节点的距离代价。
在A*算法中,这是一个确切但可变的数值
可变是因为从起始节点到当前节点的不同移动方案,其距离代价也是不同的
确切是一旦移动方案的确定,其距离代价也确定了
例如以下的
如果从节点A出发,那么选择方案1的话,G(n)=30,这是确切的
如果有更好的移动方案,如这里的方案3的话,则G(n)=/2*10,这是可变的
(假设一个正方形的大小为10)
H(n)
H(n)表示的是从当前节点到目标节点的估计代价,也就是说只是一个估计值。
也是A*算法的启发函数
有3种处理方式:
方式1:如果从当前点出发,可以向上下左右四个方向移动,则使用曼哈顿距离
方式2:如果从当前点出发,可以向上下左右四个方向移动外,还能斜方向运行,共八个方向,则使用对角距离
方式3:允许向任何方向移动,则使用欧几里得距离
补充
曼哈顿距离、对角距离、欧氏距离
思考:3种距离对A*算法的影响
曼哈顿距离可以说是最简单粗暴的计算距离的方法
其实对角距离是将欧氏距离的处理方法局部化,局限于当前节点的当前移动。
而欧氏距离是对角距离的整体化。
思考:G(n)和H(n)的区别
1.G(n)是个可变但确切的实际值,H(n)是个确切的估计值
一旦当前点的确定,H(n)将是一个定值.
而G(n)会随着移动方案的改变而改变
2.G(n)是无法通过欧氏距离计算的。
因为每一个静态路网中,如果不存在不可达的点,那么A*算法将没有存在的意义。
每一次从起点到达终点,只需要从起点出发,向终点方向移动即可。
而当存在不可达点,那么如果使用欧氏距离计算G(n),如果起点到当前点的欧氏距离