路径规划-A_Star
路径规划之 A_Star (A*)
A*算法是一种基于启发式搜索的算法,该算法综合了 BFS(最佳优先搜索)和 Dijkstra 算法的优点:在进行启发式搜索提高算法效率的同时,可以保证找到一条最优路径。
算法描述
A*算法扩展路径时,在主循环的每次迭代中,基于路当前节点到起点的成本以及将路径一直扩展到目标所需的估计成本来执行此操作。即选择最小化路径:
$f(n)=g(n)+h(n)$
随着路径的扩展,以扩展到的但未计算的节点放入列表 $open_table$ , 完成计算的节点放入列表 $close_table$。算法每次从 $open_table$ 中选择 $f(n)$ 最小的节点作为当前节点开始扩展。一直到找到目标点或者达到最大搜索次数而终止。
该公式包含有一下特征:
如果$g(n)=0$, 即只计算当前节点
n
到目标节点goal
的估计函数$h(n)$, 而不计算起点start
到当前节点n
的距离,算法转换为使用贪心策略的最佳优先搜索(BFS), 搜索速度提高,但是路径不是最优的
如果$h(n)$不大于当前节点n
到目标节点goal
的实际距离,则一定能得到最优解, 且$h(n)$越小,需要计算的节点越多,算法速度降低。
如果$h(n)=0$, 即只需求出起点start
到当前节点n
的最短路径$g(n)$,而不计算任何评估函数$h(n)$,则转化为单源最短路径问题,即 Dijkstra 算法,此时需要计算最多的顶点.
其中:
$f(n)$: 目标函数, 规划过程即最小化 f(n);
$g(n)$: 起点$start$到当前节点$n$的实际距离;
$h(n)$: 启发函数, 当前节点$n$到终点$goal$的估计距离;
$open_table$: 记录需要搜寻过的节点列表
$close_table$: 记录已经被搜寻过的节点列表
常用的启发函数$h(n)$一般有:
曼哈顿距离:
$d_{mahattan}=|p1.x-p2.x|+|p1.y-p2.y|$
切比雪夫距离:
$d_{chebyshev}=max(|p1.x-p2.x|,|p1.y-p2.y|)$
欧式距离:
$d_{euclidean}=\sqrt{(p1.x-p2.x)^2+(p1.y-p2.y)^2}$
对角距离:
$d_{diagonal}=(|p1.x-p2.x|+|p1.y-p2.y|)+\sqrt{2}-2\times min(|p1.x-p2.x|,|p1.y-p2.y|)$
流程
初始化
A_STAR.__init__
: 初始化地图,对地图图片二值化处理,网格节点划分,若网格内包含障碍物,则该网格节点标记为障碍物:Node.is_obs = True
输入需要随机产生的障碍物网格个数(可选);
计算起点
qstart
的$h$,$g$,$f$值,这里选择 $h=d_{mahattan}$, $g=d_{diagonal}$计算.将节点放入open_table
开始迭代, 若迭代次数达到上限或者
open_table
为空, 则退出迭代:从
open_table
列表中选择f
值最小的节点作为当前节点,记为best_node
若
best_node
为目标节点goal
, 即找到目标, 遍历best_node
的父节点链表并逆序, 得到完整路径, 退出算法. 否则继续下一步:将
best_node
从open_table
列表弹出, 并放入close_table
列表中.搜索
best_node
的 8 个邻接节点Neighbors
,对其中每个邻接节点neighbor
:若该
neighbor
在close_table
中,或者不可达, 则跳过该neighbor
,检查下一个邻接节点, 否则继续下一步:计算该
neighbor
的新g
值(tentative_g
), 即为当前节点best_node
的g
值加上, 当前节点best_node
到该邻接节点neighbor
的实际距离:tentative_g = best_node.g + Distance(best_node, neighbor)
若该
neighbor
不在open_table
中, 计算该neighbor
的g
,h
,f
值, 并放入open_table
中若该
neighbor
在open_table
中:若该邻接节点
neighbor
新的tentative_g
值比已有的g
值小, 意味着当前节点best_node
通过该neighbor
可以更快的到达终点.更新该
neighbor
节点的g
值为tentative_g
,并更新f
值更新该该
neighbor
节点的父节点为当前节点best_node
.
实现
数据结构
1 | class Node(object): |
接口
1 | ''' |
Planning
1 | def Planning(self): |
本文标题:路径规划-A_Star
文章作者:xwnb
发布时间:2020-06-20
最后更新:2023-04-17
原始链接:https://xwnb.github.io/posts/1627378678/
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!并保留本声明。感谢您的阅读和支持!
分享