路径规划算法C++实现(二)--A*

A*算法介绍

Dijkstra算法介绍参考
路径规划算法C++实现(一)–Dijkstra

Dijkstra算法使用贪心思想搜索出全局最优路径,但是搜索速度慢。考虑到实际情况,人们不一定需要全局最优的路径,反而是希望能快速搜索出一条局部最优路径,为此A*算法在Dijkstra算法的基础上引入启发函数,以提高搜索终点速度,使用时可通过调节启发函数来权衡算法速度和精度。

下视频为用C++在Qt上进行算法的可视化

A*可视化

启发函数

f(n) = g(n) + h(n)
g(n) 为从起点到节点n的代价
h(n)为A
的启发函数,常使用节点n到终点的距离
f(n)为A算法的综合代价 A算法在运算过程中,每次从列表openlist中选取f(n)值最小(优先级最高)的节点作为下一个待遍历的节点。*

1、当启发函数h(n)=0,则将由g(n)决定节点的优先级,此时A算法就退化成了Dijkstra算法。
2、如果h(n)始终小于等于节点n到终点的代价,则A
算法一定能够找到全局最优路径。但是当h(n)的值越小,算法将遍历越多的节点,也就导致算法越慢。
3、 如果h(n)完全等于节点n到终点的代价,则A算法将找到最佳路径,并且速度很快。可惜的是,并非所有场景下都能做到这一点。因为在没有达到终点之前,我们很难确切算出距离终点还有多远。
4、 如果h(n)的值比节点n到终点的代价要大,则A
算法不能保证找到最短路径,不过此时会很快。
5、 在另外一个极端情况下,如果h()n相较于g(n)大很多,则此时只有h(n)产生效果,这也就变成了最佳优先搜索。
由上面这些信息我们可以知道,通过调节启发函数我们可以控制算法的速度和精度
启发函数可使用如下公式

h(n) = k * d(n)
k为权重,可以自己调节以权衡速度和精度
d(n)为节点n到终点的距离, 如欧氏距离、曼哈顿距离等

算法伪代码

A*算法与Dijkstra算法的区别仅仅在选取openlist 中最小代价节点上

openlist中存放已经访问过但没确定最短路径的节点
closedlist中存放已经确定最短路径的节点

while true
	if openlist 为空
		搜索失败, 结束搜索
	取 openlist 中f(n)最小的节点为当前节点,并在 openlist 中删除
	将节点放入closedlise 
	if 节点为终点
		找到路径,返回结果
	遍历当前节点中未在closedlist中的邻接节点
		if 节点在openlist中
			根据代价更新节点
		else
			计算节点的代价,并加入openlist中
	

Qt上的C++程序

在QT5.9上编写,工程文件下载链接如下
工程源码文件
工程目录
路径规划算法C++实现(二)--A*_第1张图片

astar.cpp文件中planning函数中为算法主体流程
路径规划算法C++实现(二)--A*_第2张图片

你可能感兴趣的:(A*,C++,可视化,c++,可视化)