运动规划相关基础算法——基于搜索的路径规划算法之A*

1. A* 概述

A* 是一种启发式算法,是由Dijkstra发展而来的。一般基于grid(栅格)地图或者Voronoi(诺维图)进行机器人、无人车路径规划的基础算法。

2. BFS(广度优先搜索算法)

BFS维护的是一个队列的容器,遵循先进先出的原则。
image

3. Dijkstra算法

Dijkstra是运筹学中进行最短路径查找的经典算法。Dijktra算法维护的数据结构与BFS相同,都是队列。不同的是Dijkstra的数据结构类型是具有一定规则的优先级队列。
代价函数:f(n) = g(n);
Dijkstra搜索策略:扩展/访问累计代价最小的节点g(n)。

  • g(n):从开始状态到节点n的累积代价的当前最佳代价

优点:在具有可行解的路径搜索空间,总能找到路径最短的最优解;
缺点:对目标点没有启发信息,属于盲目搜索,搜索效率低。

4. A* 算法的流程步骤

A* 算法本质上相当于Dijkstra算法加上启发式信息;
A* 算法维护的数据结构也是一个队列,遵循先进先出的原则。

4.1 代价函数

f(n) = g(n) + h(n)
g(n): 从起始点start到当前点n的代价值;
h(n): 从当前点n到目标点goal的估计代价值函数;在路径规划中h(n)函数一般选择曼哈顿距离或者欧式距离。

4.2 伪代码

input:map、start_point、goal_point
output:path

open_list[start_point];
close_list[];

while(true){
	if(open_list is empty) break;
	Remove the node “n” with the lowest f(n) from the open_list[];
	Add the ‘n’ to close_list[];
	Mark node “n” as expanded;
	if(n == goal_point) break;
	For m { //m是n未搜索过的相邻的节点
		if(g(m) == inf){
			g(m) = g(n) + distance(m, n);
			f(m) = g(m) + h(m);
		}
		
		if(g(m) > g(n) + distance(m, n)){
			g(m) = g(n) + distance(m, n);
			f(m) = g(m) + h(m);
		}
	}
	Find full open_list[];
}

Find Path from open_list;

4.3 回溯找路径

image
以上图为例,假设目标点为(9, 9),起始点为(4, 5),在open_list[],中分别存放,当前节点的坐标,以及其父节点坐标,按图示的方法,从目标点回溯找到起始点,即找到一条路径。

posted @ 2022-01-22 23:00  XiaoMu-1230  阅读(408)  评论(0编辑  收藏  举报