路径规划:基于搜索的算法A*

一、A*算法

A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,算法中的距离估算值与实际值越接近,最终搜索速度越快。它是一种启发式搜索算法;基于搜索的全局路径规划方法

1、基本知识

在最短路径搜索算法中分类为:
直接搜索算法:直接在实际地图上进行搜索,不经过任何预处理;
启发式算法:通过启发函数引导算法的搜索方向;
静态图搜索算法:被搜索的图的权值不随时间变化。
代价函数表达式: f(n)=g(n)+h(n)
f(n) 是从初始状态经由状态n到目标状态的代价估计,
g(n) 是在状态空间中从初始状态到状态n的实际代价,
h(n) 是从状态n到目标状态的最佳路径的估计代价。
(路径搜索问题中,状态就是图中的节点,代价就是距离)
找到最短路径(最优解的)条件
关键在于估价函数f(n)的选取。d(n)表达状态n到目标状态的距离。
h(n)< d(n)到目标状态的实际距离,搜索的点数多,搜索范围大,效率低。能得到最优解。
h(n)=d(n),即距离估计h(n)等于最短距离,搜索将严格沿着最短路径进行,搜索效率是最高的。
h(n)>d(n),搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。

2、算法原理及流程

在这里插入图片描述
(1)算法步骤:
1.把起点加入 open list (当前需要处理的地图上的点)。
2.重复如下过程:
a.遍历 open list ,查找 F 值最小的节点,把它作为当前要处理的节点。
b. 把这个节点移到 close list (当前已经处理的地图上的点)。
c. 对当前方格的 8 个相邻方格的每一个方格。
◆ 如果它是不可抵达的或者它在 close list 中,忽略它。否则,做如下操作。
◆ 如果它不在 open list 中,把它加入 open list ,并且把当前方格设置为它的父亲,记录该方格的 F , G 和 H 值。
◆ 如果它已经在 open list 中,检查这条路径 ( 即经由当前方格到达它那里 ) 是否更好,用 G 值作参考。更小的 G 值表示这是更好的路径。如果是这样,把它的父亲设置为当前方格,并重新计算它的 G 和 F 值。如果你的 open list 是按 F 值排序的话,改变后需要重新排序。
d. 当以下情况停止:
◆ 把终点加入到了 open list 中,此时路径已经找到了。
◆ 查找终点失败,并且 open list 是空的,此时没有路径。
3. 保存路径。从终点开始,每个方格沿着父节点移动直至起点,找到最短路径。
(2)伪代码如下:
在这里插入图片描述
(图片来源于深蓝学院:移动机器人运动规划课程课件)

流程理解:
在这里插入图片描述

3、其他注意

(1)核心部分也就是这个估值函数h(n)的设计
最优解需要保证对于所有节点n,h(n)<=h*(n),其中h*(n)是从节点n到目标的真正最小成本。下面是无最优解情形。
在这里插入图片描述
启发函数的设计:
欧氏距离:
曼哈顿距离距离: not admissiable
L无穷 norm distance:
0 distance:
Diagonal Heuristic:h = h*。
Tie breaker:
许多路径具有相同的f值。
在这里插入图片描述
当节点具有相同的f,比较他们的h。
首选从起点开始沿直线的路径指向目标。
Jump Point Search (JPS)

推荐的参考链接

算法过程详细分析
https://blog.csdn.net/weixin_44489823/article/details/89382502
算法讲解有示意动态图
https://www.redblobgames.com/pathfinding/a-star/introduction.html
视频讲解
深蓝学院:移动机器人运动规划

二、代码实现

python代码实现:https://blog.csdn.net/qq_39687901/article/details/80753433
c++代码实现:https://blog.csdn.net/u012234115/article/details/47152137
c++代码简单实现:
https://blog.csdn.net/sinat_19682279/article/details/79965584

内容来源于网络整理和参考链接,侵权联系删~

猜你喜欢

转载自blog.csdn.net/qq_41667348/article/details/121879562