几个概念
- S:路径规划的起点
- G:路径规划的终点
- g(s):从起点S到点s的代价
- h(s):从点s到终点G的预估代价
- c(s,s):从点s移动到点s的代价
- e:膨胀系数
- 产生(generate):对一个节点进行分析当降低g(s)的值时这个节点就被产生
- 扩展(expand):每次从已经排好的OPEN列表中提取表头对应的节点叫做被扩展
- 非均衡性(inconsistency):当一个节点的g(s)值降低了而并没有对该节点进行扩展那么该节点具有非均衡性
- CLOSED列表:存储已扩展节点的表格
- OPEN列表: 当一个不属于CLOSED的节点被产生后,将被放入OPEN列表中
- INCONS列表:当一个属于CLOSED表的节点被产生后,就放入INCONS列表
- 非均衡列表:由OPEN和INCONS组成
e膨胀系数
在介绍ARA* 算法之前,有必要介绍一下weighted A* 算法,在最初的A* 算法中,f(s)的计算方法为:
F=G+H
可以看出f(s)是由个g(s)和h(s)两项构成的,其中g(s)是一个后验值,而h(s)是一个先验值,这样一种启发式的搜索方式本身为算法本身节省了很多资源,去除了一些不必要点的搜索,所以A* 算法的可靠性和时效性都很好,weighted A* 算法是对A* 算法的一个改进,为了使搜索方向更好的指向终点,在原来算法的基础上引入了一个膨胀系数e(epsilon)来给h(s)进行加权,e是一个大于1的值,这样以来算法可以快速的搜索到终点,相对于原来的A* 算法而言,weighted A* 算法更加节省资源,具有更高的时效性,但是它规划出的路径是一条"次优"的,这是在时效性和最优性之间做出折中的一个结果.
F=G+e*H
ARA* 算法的基本流程
在原来weighted A* 算法的基础上,ARA* 算法做了这样的处理:
- 选取一个比较大的e快速的规划出一条次优的路径
- 在上一步规划的过程中会得到一个OPEN列表和INCONS列表,将二者合并为一个非均衡列表
- 将e降低一个层级,在非均衡列表中进行搜索,规划出一个相对更优的路径
- 重复第2 3步,直到路径收敛(总的代价没有明显变化)或者e降低为1为止
- 看是否规划出一条路径,返回成功/失败