[[NIPS-2003-ara-anytime-a-with-provable-bounds-o.pdf]]
#planning/path
整体结论
实际世界的规划问题所能利用的时间是有限的,而anytime planners正适于此:迅速找到一个可行解,并在时间允许时不断提高解的质量直至得到最优解。
而ARA*则是一种带启发的anytime planner先在宽约束下找到次优解,在时间允许时再不断收缩约束,尝试找最优解。而跟其他的最大不同,它还能尽量重用之前的搜索结果,计算效率显著提高。
采用设定
-
先搜索次优,再尝试最优,因此不保证结果总是最优解。
-
采用A*算法结合膨胀的启发函数。
-
采用大量的重用操作。
关键观点
-
常见的anytime planner在得到最优cost之前,无法得到次优的边界,也无法控制次优解。因此无法判断当前解、过去解的质量,也无法为下次求解分配合适的时间。
-
A*的改进算法:
-
带膨胀系数的A*,通过膨胀启发值,然后逐渐缩小,得到系列次优解。尽管能控制边界,然而重复计算极多,效率低。而减少重复计算,就是ARA*的优化方向。
-
而与此相反,逐渐膨胀的方式可以减少重复,但无法保障次优的边界。
-
膨胀的是启发值H的系数,并不会导致跳步,跟自动调整栅格大小的算法也不一样。它只会调整G和H的比重,令搜索方向偏向目标的位置。
-
由于使用的系数>=1,因此是膨胀而不是收缩。启发值和系数应该对应来看,也不是说所有小于1的系数都不合理,或者只是因为启发值过大,需要增加广度的比重。
-
-
Anytime Repairing A*(ARA*):膨胀系数A*的同时,重用之前循环得到的搜索结果。
- 重用的原则是:每当一个open的格子重新搜素,将它周围的格子计算g,若跟之前的g一样,就不用继续更新该格子和它周围的格子。(所有节省的计算,都是因为这一步。)
-
带膨胀系数的A*搜索:
-
在改变膨胀系数的时候,就会产生local inconsistency:g值在相邻格子不连贯。而产生不连贯的根源,在于不同路径来到同一个格子的cost不同。产生不同路径的根源又在于当初选择的方向不同,而方向是根据膨胀系数改变的。
-
每当发现local inconsistency,就重新将其放回open list,但每一次循环只放回一次,这就保证了次优边界。如果没发现,那就重用之前的结果,因此减少了搜索次数。
-
但这样Open list之中就不是所有local inconsistency的集合了,而为了保证记录下所有存在的local inconsistency,新增INCONS list。
-
此外,与普通A*的不同点还有最后一点:结束条件不同。
- 膨胀系数收缩到1,变成标准A*
- 其他的就一样了:超时、无解
-
完整的算法伪代码如下:
- 从open里拿出最小的s,放入closed
- 更新s及周围的格子s’的g值
- 当s‘的g出现不连续,如果在closed中,就移入incons,如果不在就放入open(所有搜索过的不会直接进入open,而是进入incons等待下一次循环再回到open,这就保证了搜索的次数有限)
- 收缩系数
- 将incons移入open,根据s重新排序,清空closed(因此每次循环开始的时候,除了open可以非空,incons和closed肯定是空的,而open带着上一次计算的s进行热启动,便加快了每一次的搜索。)
- 再来一次1~5,直至结束条件成立。
![[…/调研/_resources/061e7f8cd3951b00ada532dfaa6da55b_MD5.png]]
-
实验结果:
-
地图尺寸 91.2 x 94.4 m, 每个格子大小 0.4 x 0.4 m,2D搜索空间53808个。
-
4D state space:xy坐标、朝向、速度。
-
在25s时均得到最优解。
-
遗留问题
- 为什么次优路径的边界由膨胀系数k决定:g* <= g <= k * g* (@2024-09-01)
关联论文
- 理论计算:ARA : formal analysis
- Incremental A* NIPS-2001-incremental-a-Paper:
- 本文中通过循环迭代来提高搜索速度的方法来源
- 启发规划:Planning as heuristic search