首先声明参考学习文献:
Likhachev, M., Gordon, G. J., & Thrun, S. (2004). ARA*: Anytime A* with provable bounds on sub-optimality. In Advances in neural information processing systems (pp. 767-774).
ARA* 是一种anytime planner,这种算法适合在有限的时间里做出尽可能最好的路径规划的场合,方法是先快速的得到一条次优路径,然后在时间允许的范围内不断地优化这条路径,可以证明在时间足够充裕的条件下,这个算法可以得到最优路径。
几个基本概念
- Sstart : 开始状态。
- Sgoal : 目标状态。
- g(s) : 在从父节点扩展子节点的过程中,从开始状态到当前状态s的代价。
- h(s) : 从当前状态s到目标状态的估计代价。
- v(s) : 在从某一父节点扩展完所有子节点后,从开始状态到f值最小的状态s,其对应的g值就是v(s)。
- c(s,s’) :从状态s到子状态s’的消耗代价。
- ε: 膨胀系数。
- key() 函数:在ARA*算法中
key ( s ) = g ( s ) + ε ⋆ h ( s ) \text { key }(\mathrm{s})=\mathrm{g}(\mathrm{s})+\varepsilon^{\star} \mathrm{h}(\mathrm{s}) key (s)=g(s)+ε⋆h(s) - inconsistent : 若一个状态s的v(s)不等于g(s), 则称为inconsistent 。放入open列表的状态均是inconsistent状态,但是inconsisitent状态不一定在open列表中。
- OPEN list: 存放不一致性(inconsistent)状态的列表,当不在CLOSED列表的状态被计算降低g值时,放入open表中。表中根据状态的key()值进行排序,最小的在最上面。
- CLOSED list: 存放已经扩展过的状态的列表。此列表中v值等于g值,为一致(consistent)状态。
- INCONS list: 当属于CLOSED的状态又被降低g值时,放入此表中;存放在此表的状态仍然为inconsistent状态。
Weighted A*
Weighted A* 是对传统A*的改良,加入了膨胀因子(一般大于1),
key
(
s
)
=
g
(
s
)
+
ε
⋆
h
(
s
)
\text { key }(\mathrm{s})=\mathrm{g}(\mathrm{s})+\varepsilon^{\star} \mathrm{h}(\mathrm{s})
key (s)=g(s)+ε⋆h(s)使得搜索更容易朝着目标扩展,扩展的状态数量会减小,因此搜索时间会缩短;但是此算法会导致得到的路径并不一定是最优路径,比如距离最优。这是在搜索时间与搜索效率的一种折中选择,能够使得算法更好的符合工程需要。
这个图片就说明了在不同的膨胀因子下,最终得到路径的不同,其中膨胀因子为1时是最短路径。灰色的单元格代表被扩展的单元格,可以发现膨胀因子越大,扩展的单元格数量越少。
ARA*
ARA* 则在 weighted A* 的基础上进行了发展,使得膨胀因子会变化,在时间允许的范围内,膨胀因子会越来越小直到变成1;在时间不够的时候,膨胀因子会尽可能的接近1,因为膨胀因子为1时,ARA* 算法接近于A* 算法,而A* 算法在理论上是最优的。
设置三个列表(open,closed, incons)的作用主要是为了使得ARA* 算法能够在每次降低膨胀因子后能够利用先前搜索所得到的一些结果,从而提高搜索效率。下面是ARA* 算法执行的基本流程:
- 选取一个比较大的膨胀因子,快速的规划出一条次优的路径。
- 在上一步规划的过程中会得到一个OPEN列表和INCONS列表,将二者合并为一个包含所有inconsistent状态的列表。
- 将膨胀因子降低,在包含所有inconsistent状态的列表中进行搜索,规划出一个相对更优的路径。
- 重复第2 3步,直到路径收敛(总的代价没有明显变化)或者膨胀因子降低为1为止。
- 看是否规划出一条路径,返回成功/失败。
此图可以说明ARA* 算法在减小膨胀因子的过程中利用先前搜索的结果示意,若ARA* 最终可以将膨胀因子减小到1,那么它扩展的单元格总数和A* 所扩展的单元格总数相同。所以可以发现ARA* 算法具有anytime 特性,搜索结果会随着时间的延长而逐渐变得优化,若时间短缺时仍然可以得到一条可行路径,可以完美的满足工程要求。