论文题目:Finding Optimal Solutions to Cooperative Pathfinding Problems
发表于2010年,这篇文章提出了MAPF的两种方法,一种是算子分解,一种是独立性检测
相关工作
A*常用来单agent路径规划,为了让A*应用到多agent规划中,对A*进行各种变体
LRA*先单独给每个agent用A*规划好,如果发生碰撞则给涉及碰撞的agent重新规划。这一方法容易导致死锁
分层合作A*( Hierarchical Cooperative A*),该算法选择agent的顺序,并为每个agent规划一个路径,通过检查保留表来避免与以前计算的路径发生冲突。这种算法属于贪心算法,导致次优解
其他方法要么是次优并且可能造成死锁的,要么需要花费大量内存导致不能解决规模较大MAPF问题的。
问题定义
地图和常规MAPF地图定义相似,agent占据一个空格,并且可以向相邻空格移动
不同之处在于:
-
可以对角线移动
-
可以循环移动,如下图


单个代理路径的cost是代理到达其目标所花费的总时间步数,而整个解决方案的cost是所有路径成本的总和。
虽然可以循环移动,但不能交换位置,比如图中不能发生1和2直接交换位置的情况
算子分解
常规的方法中,由于每个agent可以在下一个时间步选择向8个方向走或者在原地stay,因此n个agent在下一个时间步对应的状态空间大小为。
常规方法每个算子将状态推进一个时间步,并改变全部代理的位置。而算子分解提出一种新的状态空间表示,其中每个时间步长被分割,使每个算子只操作该时间步中的一个agent,一个状态需要n个算子前进到下一个时间步长(n是agent数量)。
OD不是事先将每个agent的路径用A*计算好再检测碰撞,而是在每个时间步的每个算子操作过程中都实时地计算启发式的值。以下图为例,1号和2号agent的目标点在自身右侧2步的位置,黑色表示障碍物。1先进行移动,它有3个选择:向上、向右、不动,其中向右这一算子执行之后的g+h最小,于是继续探索这一算子的下一算子;下一算子对2号agent进行操作,有2种选择:像左上、向右,不能不动,因为这会导致和1号agent位置重叠......

独立子问题
一般来说,我们希望有一种算法来将代理划分为不相交的集,这样为每一组代理计算的最优路径就不会干扰其他路径。这样,我们就可以确定组合解是最优的。
为了进行划分,首先使用如下的简单独立检测SID:
-
将每个代理分配给一个单例组
-
为每个组计划一个路径
-
模拟执行所有路径,直到发生冲突为止
-
将两个相互冲突的组合并为一个组
-
规划新的group
-
重复步骤3-步骤5,直到没有冲突
改进SID:每个agent可能有多个最优路径到达target,所以如果有冲突可以先看看agent的其他最优路径是否仍然有冲突。
改进后的独立检测算法:
-
将每个代理分配给一个单例组
-
为每个组计划一个路径
-
用每个路径填充冲突避免表
-
模拟所有路径的执行,直到两组G1和G2之间发生冲突
-
如果这两个组之前没有冲突,用G2的当前路径填充非法移动表并为G1寻找具有相同成本的另一组路径;如果寻找失败,则用G1的当前路径填充非法移动表并为G2寻找具有相同成本的另一组路径
-
如果G1和G2寻路都失败,则将G1和G2合并为一组
-
通过对路径进行的更改来更新冲突避免表
-
重复步骤4-步骤7,直到没有冲突

5029

被折叠的 条评论
为什么被折叠?



