目录
1.前言
本文侧重对A*算法的概念理解,整理了网上已有的优秀资料,加入了个人理解。
推荐阅读:A*寻路算法详解 #A星 #启发式搜索_哔哩哔哩_bilibili(个人感觉最好的、易懂的讲解)
A* 算法详解(超级详细讲解,附有大图)_a*算法__L.Y.H._的博客-CSDN博客(本文思路参考,清晰明了)
在游戏中,我们控制单位时,我们可以看到,存在障碍物时,单位会自动绕过去;同时,单位选择的是最短路线前进。
在机器人设计、游戏开发中,路径规划是一个重要部分,在很多地方会有寻路的需求。本文就来介绍一下路径规划中常用的A*算法。
2.其他路径规划算法
本文中将通过广度优先搜索、狄克斯特拉算法来引出A*算法。
2.1广度优先搜索
广度优先搜索:从起点开始,有由近及远进行广泛搜索。不仅适用于常规路径查找,还适用于程序地图生成、流场寻路、距离映射和其他类型的地图分析。不过,时间复杂度较大,当终点离起点较远时,搜索时间会比较长。
(灰色:已走过,算法不再探索;橙色:障碍)
在寻路过程中,我们可以记录下每个节点的来源的方向(父节点),在到达目标位置后,就可以获得一条最短路径。
优点:可找到最短路径;
缺点:没有方向性,效率低,最坏情况下遍历整个地图。
2.2狄克斯特拉算法
这里参考了:【精选】狄克斯特拉(Dijkstra)算法详解_wopelo的博客-CSDN博客
狄克斯特拉算法:狄克斯特拉算法让我们考虑需要探索路径的优先级。它不是平等地探索所有可能的路径,而是倾向于探索移动成本较低的路径。不足之处在于将其他的顶点的最短路径也计算出来,而这部分是无用的。
设想这样一个场景——在一个没有负权边的有向图中,如果从起点直接到节点A的开销小于从起点直接到节点B的开销,那么即使从起点出发经过节点B还有其他路径可以到达节点A,其总开销也会大于从起点到节点A的开销。
(权重:狄克斯特拉算法用于每条边都有关联数字的图,这些数字称为权重;加权图/非加权图:带权重的图称为加权图,不带权重的图称为非加权图)
通常,广度优先搜索用于计算非加权图中的最短路径;狄克斯特拉算法用于计算加权图中的最短路径
3.A*算法
A*算法 :A* 算法是专门用来求解地图中最短路径的算法,同样的算法有很多,但实际中最常用的就是A*算法。
3.1原理-代价
在狄克斯特拉算法的基础上,A*算法中,每一轮循环并不会把每一个节点都探索一遍,而是选择当前代价最低的节点进行探索。
总代价F=当前代价G+预估代价H
当前代价G:从起点到目前节点的代价
预估代价H:当前节点到目标的大概代价,它并不是一个精确的数值,也不代表从当前节点出发就一定会走这么多步,但我们会用这个估计值来指导算法选择更优的路径。
(H值的估算方法有很多,这里用曼哈顿(Manhattan)方法得到H值,即两点在竖直和水平方向上距离的总和,不用开方,计算速度快。之所以叫Manhattan方法是因为这就像计算从一个地方移动到另一个地方所经过的城市街区数一样,通常是不能斜着穿过街区的。)
在计算H值时并不考虑任何障碍物,这是对剩余距离的估计值而不是实际值(通常是要保证估计值不大于实际值)。
3.2原理-过程
总代价F=当前代价G+预估代价H
计算完成后,优先选择总代价最低的方块进行探索。
复杂情况下相同。
优点:搜寻区域较少,效率高
3.3应用
实际应用时,网格形式的节点过多,不便计算,可简化为路标形式(欧拉距离)。
4.python代码
gitee链接: Astar算法 python算法: Astar算法python