MAPF 多智能体路径规划:从 CBS 的最优性证明到对称性爆炸
完整推导冲突基搜索(CBS)的两层结构与最优性证明,用实测数据展示走廊对称如何让搜索精确指数爆炸、优先级规划为何不完备,并梳理 ECBS/PBS/LNS 到终身 MAPF 的实用算法谱系。
采样式路径规划那篇解决的是“一个机器人怎么绕过障碍”。把机器人换成一千台在仓库里跑的 AGV,问题的性质就变了:障碍会动,而且它们也在规划。这就是多智能体路径规划(Multi-Agent Path Finding,MAPF)。
它是亚马逊仓库里数千台 Kiva 机器人、自动化码头的集装箱车队、无人机编队背后的同一个数学问题。本文从问题定义推起,把冲突基搜索(CBS)的最优性证明写完,然后用实测数据回答三个问题:它为什么会爆炸、快速算法牺牲了什么、离散解怎么落到实机上。
文中所有数据来自一套自己实现的 CBS 与优先级规划(时空 A* 低层、四连通网格、独立的解校验器)。
给定无向图 (网格地图最常见,四连通)和 个智能体。智能体 有起点 和目标 。时间是离散的:在每个时间步,每个智能体要么移动到相邻顶点,要么原地等待( 也算一个时间步)。
一个解是 条路径 ,满足两类无冲突条件:
点冲突就是两个智能体同时站在同一格;边冲突(也叫交换冲突)是两个智能体同时对穿一条边——在物理上它们会撞在通道中央,而单看“每个时刻的位置”是发现不了的,必须单独检查。
(a) 一个 3 智能体实例的最优解。注意智能体 1 在 等了一步、智能体 2 绕到 让路——等待和绕行是 MAPF 唯一的两种妥协方式。(b)(c) 两类冲突的定义
代价函数有两个标准选择,它们不能同时最优化:
是智能体 到达目标并从此停留的时间。SOC 关心总能耗/总吞吐,makespan 关心最后一个完成的时刻。仓储场景通常优化 SOC(吞吐量导向),编队/同步任务优化 makespan。本文统一用 SOC。
还有几个建模选择在工程上很要紧,读论文时要留意:
- 智能体到达目标后是否消失?消失(“disappear at target”)会让问题简单不少,但真实机器人不会消失,它会停在目标上继续挡路。本文和主流文献都采用“停留”模型;
- 是否允许跟随(following)? 在 时刻进入 在 时刻刚离开的格子。离散模型通常允许,但实机上如果两车速度不同就会追尾,所以执行层要么禁止跟随,要么用后面第 8 节的鲁棒化手段;
- 旋转循环(rotation):一圈智能体首尾相接同时转动,没有点冲突也没有边冲突,但在实机上要求所有车完美同步。
朴素想法是把 个智能体当成一个“超级智能体”,在联合状态空间 里做 A*。这条路的死因很具体:状态空间大小 ,而且分支因子是 (每个智能体 5 个动作的笛卡尔积)。 时单次扩展就要生成 个后继。
理论上的结论比直觉更精细,而且这组对照值得记住:
| 问题 | 复杂度 |
|---|---|
| 判定是否存在解(可行性) | 多项式时间(Kornhauser 等,1984) |
| 最小化 SOC 或 makespan 的最优解 | NP-hard(Yu & LaValle,2013;Surynek,2010) |
| 常数因子近似 makespan | 仍是 NP-hard |
“有没有解”容易、“最好的解”难——这个落差决定了整个领域的形态:既然最优解注定要指数时间,那么算法研究的主战场就是在最优、有界次优、快速可行三者之间选位置。
顺带说一句可行性的判定为什么容易:它可以归约到“图上的令牌重排”问题(类似华容道/十五数码的可解性判定),用图的连通性与置换的奇偶性就能判断,甚至能给出 步数的构造性解。规则式算法(Push-and-Rotate、BIBOX)就是这条路线的产物:保证完备但解的质量没有保证。
工业界最常见的做法是优先级规划(Prioritized Planning,PP):给智能体排个序,逐个规划,先规划者的整条路径变成后规划者的动态障碍。
def prioritised_planning(grid, starts, goals, order): constraints = [] paths = [None] * len(starts) for a in order: paths[a] = space_time_astar(grid, starts[a], goals[a], constraints) if paths[a] is None: return None # 失败:被先规划者堵死 # 把这条路径冻结成后续所有智能体的约束(含到达目标后的停留) for later in order[order.index(a) + 1:]: freeze(constraints, later, paths[a]) return paths它的复杂度只是 次单智能体时空 A*,快得离谱(本文实验里 时约 0.09 s,而最优 CBS 已经超时)。代价是它不完备:即使实例有解,PP 也可能失败。
这不是罕见的边界情况。下面这个 6 格实例是我能构造的最小反例:
. . . 智能体 1:(0,0) → (0,2)# . # 智能体 2:(0,2) → (0,0)一条 3 格的单宽走廊,中间格下方挂一个凹槽 。实例显然有解——一个智能体钻进凹槽让另一个过去。但两种优先级顺序 PP 都失败:先规划者走最短路并永久停在对方的起点上,后规划者从第一步就被堵死(它连“离开自己的起点”都做不到,因为唯一的邻格在关键时刻被占,且对穿会触发边冲突)。
我的实现实测:顺序 失败于智能体 2,顺序 失败于智能体 1;而 CBS 用 11 次扩展找到 SOC = 7 的最优解——智能体 1 先等一步,智能体 2 钻进凹槽,等对方过去再出来。
失败的根源是PP 从不回退:先规划者的路径一旦定下就是硬约束,而“为了别人短暂让路”这种行为在它自己的最短路里没有动机。改进方向有两个:随机重启换优先级顺序(便宜但没保证),或者把优先级本身也纳入搜索——这就是 PBS(Priority-Based Search),在优先级偏序上做树搜索,比 PP 完备性好但仍不保证最优。
冲突基搜索(Conflict-Based Search,Sharon 等 2015)是最优 MAPF 的主力算法。它的核心洞察是:
不要在 的联合动作空间里搜索,而是在约束的组合上搜索。绝大多数智能体对之间根本不冲突,所以真正需要枚举的约束组合远比联合状态空间小。
CBS 是两层结构。
低层为单个智能体规划,把其他智能体完全忽略,只服从加在自己头上的约束。约束有两种形式:
搜索状态是时空对 而不是 ——同一个格子在不同时刻是不同的状态,这是整套方法能表达“等待”和“错时通过”的前提。每步代价 1(等待也算),所以 ,启发式用目标点的真实距离场(对网格做一次 BFS 得到,比曼哈顿距离紧得多,尤其在有障碍时)。
有一个极易写错的细节:目标条件不能只是 。因为智能体到达目标后要一直停在那里,如果目标格在未来某个时刻还有约束,这条路径就是非法的。正确的终止条件是
也就是必须晚于“目标格上最后一条约束”才算到达。漏掉这一条,CBS 会返回带冲突的解,而且这类 bug 只在目标冲突(一个智能体停在目标上,另一个后来要经过那里)的实例上才暴露。
高层在约束树(Constraint Tree,CT)上做最佳优先搜索。每个 CT 节点 包含:
- 约束集合 ;
- 解 :每个智能体在自己约束下的最短路径(由低层给出);
- 代价 。
根节点约束集为空,所以它的解就是“每个智能体各走各的最短路”,代价是整个问题 SOC 的下界。
算法主循环:
while 开放表非空: N ← 取出代价最小的节点 C ← 在 paths(N) 中检测第一个冲突 if C 不存在: return paths(N) # 这就是最优解 # 冲突涉及 a_i 和 a_j,分裂出两个子节点 for a in (a_i, a_j): N' ← N 的副本,约束集加上"禁止 a 参与该冲突" 重规划 a 的路径(低层),更新 cost(N') 把 N' 放进开放表关键在于分裂规则:一个冲突产生两个子节点,而不是指数多个。这是 CBS 的全部效率来源。
上图实例的完整约束树:根节点代价 16(各自最短路之和,SOC 的下界),每层解决一个冲突、代价单调上升,在代价 19 处找到无冲突解。共生成 15 个节点、展开 8 个——注意每次分裂只产生 2 个孩子
CBS 的正确性建立在两条引理上,都不难但都必须成立。
引理 1(代价是下界)。 对任意 CT 节点 ,任何满足 的无冲突解 都有 。
证明: 中每条路径都是该智能体在其约束下的最短路,所以 里每个智能体的路径长度都 对应的 中的长度。逐项求和即得。注意这里不要求 本身无冲突——它通常是有冲突的,这正是需要继续分裂的原因。
引理 2(分裂不丢解)。 设节点 的解中存在冲突 。那么任何满足 的无冲突解 ,必然满足两个子节点之一的约束集。
证明: 无冲突,所以 与 不可能同时在 时刻占据 。于是要么 中 不在 ——满足左子节点新增的约束 ;要么 不在 ——满足右子节点。两个子节点的其余约束与 相同,故 至少满足其中一个。
定理(最优性)。 CBS 返回的第一个无冲突节点的解是最优解。
证明:设 CBS 弹出无冲突节点 并返回 ,其代价为 。反设存在更优解 ,。 满足根节点的空约束集;由引理 2 反复应用,从根出发总能找到一条下降路径,使得 满足路径上每个节点的约束集——这条路径要么走到某个仍在开放表里的节点 ,要么走到一个已展开的无冲突节点(但那会与” 是第一个“矛盾)。对开放表中的 用引理 1:。这与” 是开放表中代价最小者被弹出“矛盾。
完备性同理:如果实例有解,那么沿引理 2 的下降链总有节点可扩展,CT 的深度有限(约束数量有上界),所以 CBS 终会找到解。
值得注意的是反面:如果实例无解,朴素 CBS 不保证能判定出来——它会一直分裂下去。我的实现在单宽走廊里两个智能体强制交换的实例上就是这样:每个智能体单独都能到达目标,CBS 于是不停加约束直到超时。工程上要么先用多项式的可行性判定过一遍,要么设代价上界( 超过某个界就宣告无解)。
点冲突的分裂是对称的。边冲突则不然:冲突 中, 走 , 走 。分裂时必须各禁各自的方向:
如果两边都加同一个方向的约束,就会漏掉合法解(引理 2 不再成立),CBS 的最优性随之失效。
CBS 在多数实例上表现很好,但它有一类系统性的死穴——对称性冲突:许多代价相同的路径两两冲突,CBS 只能一条一条地禁止,每次分裂只排除掉一个组合。
最干净的例子是走廊对称:两个智能体必须反向穿过同一条单宽走廊。正确的解是其中一个在走廊外等着,但 CBS 发现这件事之前,要把“在走廊第 1 格相遇”“在第 2 格相遇”……逐一否掉。
我把走廊长度 从 1 扫到 12,测量 CBS 展开的节点数:
实测结果精确等于 :走廊每加一格,搜索规模翻一倍;而最优解本身只是线性变长()。 时已需 16,384 个节点、8.6 秒——问题的“难度”和解的“复杂度”完全脱钩
这个精确的 2 的幂次不是巧合:走廊里每个格子都提供一次二选一的分裂, 个格子就是 量级的组合。同类现象还有矩形对称(两个智能体在开阔区域同向斜穿,各有指数多条等价最短路)和目标对称(一个智能体的目标在另一个的必经之路上)。
现代 CBS 的主要改进都在攻这一点:
- 对称性破除约束(Li 等,2019/2020):识别走廊/矩形/目标对称的结构,一次性加入一条更强的约束(例如” 在 区间内不得进入整条走廊”),把指数多次分裂压成一次。这是近年最有效的单项改进;
- 冲突优先级分类:用多值决策图(MDD,编码一个智能体所有等代价最短路的紧凑结构)判断冲突是 cardinal(两个子节点代价都必然上升)、semi-cardinal 还是 non-cardinal。优先解决 cardinal 冲突,因为它们能立刻推高下界;
- 高层启发式(CBSH 系列):把智能体两两之间的依赖关系建成图,用最小顶点覆盖(CG 启发式)、依赖图(DG)、带权依赖图(WDG)算出高层代价的可采纳下界,让高层 A* 从“均匀代价搜索”变成有启发的 A*。WDG 通常能把节点数再降一个量级;
- 绕过冲突(bypassing):如果某个子节点代价没上升且冲突数减少了,直接用它替换父节点,不做分裂。
工业系统几乎不用最优 MAPF。放弃的方式分两档。
有界次优:保证解不超过最优的 倍。代表是 ECBS(Enhanced CBS)和 EECBS。做法是把两层的最佳优先搜索都换成 focal search:维护一个“代价不超过 “的候选集合(focal list),在这个集合里按另一个启发式(例如冲突数最少)挑节点。这样既有 的质量保证,又能优先走”看起来更容易解决冲突“的方向。 通常能带来数量级的加速。
无界次优但快:
- PBS(Priority-Based Search):在优先级偏序上做树搜索,冲突时尝试两种优先级顺序。比 PP 完备性好、比 CBS 快得多;
- PIBT:一步一步走,用优先级继承 + 回溯保证每步都不死锁。它是在线算法(不预先规划整条路径),适合上千智能体的实时场景,但解质量一般;
- MAPF-LNS / LNS2:先用任意快速方法拿一个解,然后反复“拆掉一小部分智能体的路径重规划”(大邻域搜索)。LNS2 甚至可以从带冲突的解出发逐步修复。这是目前大规模实例上综合表现最好的一类方法。
归约法:把 MAPF 编译成 SAT / ILP / CP 交给成熟求解器。SAT 类方法(MDD-SAT)在 makespan 最优、智能体密度极高的小图上很强;分支切割定价(BCP)在 SOC 最优上是当前最强之一。它们的优势是可以直接复用几十年的求解器工程。
把自己实现的 CBS 与 PP 放在两种地图上跑:一张 、10% 随机障碍的地图(359 个空格),一张 的仓库地图(货架块 + 单宽通道,125 个空格)。每个 跑 20 个随机实例,超时 10 秒。
(a) 随机地图上 CBS 撑到 还有 50% 成功率;换成仓库地图, 就掉到 40%、 全部超时。(b) 同一个 下 CBS 耗时跨越四个数量级——重尾分布是 NP-hard 问题的典型指纹。(c) 优先级规划的次优程度:随机地图约 6%,仓库地图升到 15%
三条实测结论,都直接对应工程决策:
- **地图结构的影响远大于智能体数量。**仓库地图的空格数只有随机地图的三分之一,但 CBS 的可解规模从 掉到 。原因就是第 5 节的走廊对称——仓库的单宽通道是对称性冲突的温床。所以“我的场景有多少台车”根本不足以判断难度,必须看通道拓扑;
- 耗时是重尾的。同一个 、同样的地图,最快和最慢的实例差四个数量级。这意味着平均耗时是个没用的指标,实时系统必须按分位数设预算并准备超时降级路径;
- **PP 的不完备性只在结构化地图上现形。**随机地图上 PP 240 个实例全部成功;仓库地图上开始出现“被先规划者堵死”的失败(100 个实例里 3 例)。而 PP 的次优代价也从 6% 涨到 15%。用随机地图做的评测会系统性地高估 PP——这是选型时最容易踩的坑。
MAPF 的解是“第 个时间步在哪个格子”,而真实机器人有加减速、转弯耗时、定位误差、电量差异。直接把离散解当轨迹下发,第一个走慢的机器人就会破坏所有同步假设,然后连环相撞。
这中间需要一层转换,主流有三种思路:
时序规划图(Temporal Plan Graph, TPG)。把 MAPF 解转成一个偏序图:节点是“智能体 到达位置 “这一事件,边表示先后关系(同一智能体的路径顺序,以及不同智能体经过同一格子的先后次序)。执行时机器人只需保证偏序被满足,不需要保证绝对时刻——谁慢了,后面的等它就行。这把”同步执行“放松成”按序执行”,鲁棒性提升巨大,而且可以证明不会死锁(原图无环即可)。
**MAPF-POST 与运动学后处理。**在 TPG 基础上给每条边配上时间下界(由最大速度、加减速能力决定),解一个线性程序得到一条满足运动学的带时间轨迹。这一步和单机器人的时间参数化是同一类问题,只是约束里多了智能体间的先后关系。
**-鲁棒 MAPF。**在规划阶段就留余量:要求任意智能体延迟不超过 个时间步时解仍然无冲突。实现上把点约束从“同一时刻”扩展到” 个时刻窗口”。代价是解会变长,但换来了对执行扰动的免疫。
工程上还有一条常被忽略的:禁止跟随。离散模型允许 进入 刚离开的格子,但实机上前车稍慢就会追尾。要么在规划时加约束禁止,要么在执行层保持安全车距(等价于 1-鲁棒)。
前面讨论的是“一次性”MAPF:给定起点终点,规划一次结束。真实仓库是终身的(Lifelong MAPF / Multi-Agent Pickup and Delivery,MAPD):机器人送完一个货架,立刻被分配下一个任务,任务流永不停止。
直接的做法是每来新任务就重新规划全部智能体——但 MAPF 是 NP-hard,重规划跟不上任务到达的速度。主流解法是 RHCR(Rolling-Horizon Collision Resolution,Li 等 2021):
- 只规划未来 个时间步内的无冲突路径(窗口内保证无碰);
- 每 步重规划一次(滚动前移);
- 窗口外的路径只作参考,不保证无冲突。
这是典型的用有限视野换计算量: 小则快但容易陷入局部死锁, 大则慢但更全局。它和模型预测控制的滚动优化是同一个思想。
终身场景还引入一个新的耦合:任务分配与路径规划相互影响。把任务分给“离得近”的机器人可能造成局部拥堵,反而不如分给远一点但路线通畅的。完全联合优化不现实,实用做法是让任务分配感知拥堵(用当前路径的占用密度做代价修正)。
- MAPF 的两类冲突(点、边)和两个目标(SOC、makespan)构成问题定义;建模选择(到达后是否停留、是否允许跟随)会显著改变难度,读论文时必须先看清。
- 复杂度对照值得记住:可行性判定是多项式的,最优化是 NP-hard。这个落差决定了整个领域在“最优 / 有界次优 / 快速可行”三档上分布。
- 优先级规划快到离谱但不完备——6 个格子、2 个智能体就能构造出所有优先级顺序都失败的反例,而 CBS 11 次扩展就解出来。
- CBS 的效率来自“在约束组合而非联合动作空间上搜索”,每个冲突只分裂成两个子节点。最优性由两条引理支撑:节点代价是下界(引理 1),分裂不丢解(引理 2)。
- 低层时空 A* 有两个必须做对的细节:状态是 而非 ;目标条件必须晚于目标格上最后一条约束,否则会返回带冲突的解。
- CBS 的系统性死穴是对称性冲突。走廊对称的实测是精确的 :走廊每加一格搜索翻倍,而解只线性变长。现代改进(对称性破除、MDD 冲突分类、WDG 启发式)都在攻这一点。
- 实测最反直觉的一条:地图拓扑比智能体数量更决定难度。仓库式单宽通道让 CBS 的可解规模腰斩,也让 PP 的不完备性和次优程度同时恶化——用随机地图评测会系统性高估快速算法。
- 离散解不能直接下发。时序规划图把“同步执行”放松成“按序执行”,配合运动学后处理和 -鲁棒规划,才是能上实机的形态。
- G. Sharon, R. Stern, A. Felner, N. R. Sturtevant. Conflict-Based Search for Optimal Multi-Agent Pathfinding. Artificial Intelligence, 2015.(CBS 原始论文)
- D. Kornhauser, G. Miller, P. Spirakis. Coordinating Pebble Motion on Graphs, the Diameter of Permutation Groups, and Applications. FOCS 1984.(可行性的多项式判定)
- J. Yu, S. M. LaValle. Structure and Intractability of Optimal Multi-Robot Path Planning on Graphs. AAAI 2013.(NP-hard 证明)
- M. Barer, G. Sharon, R. Stern, A. Felner. Suboptimal Variants of the Conflict-Based Search Algorithm. SoCS 2014.(ECBS)
- J. Li, W. Ruml, S. Koenig. EECBS: A Bounded-Suboptimal Search for Multi-Agent Path Finding. AAAI 2021.
- J. Li, D. Harabor, P. J. Stuckey, H. Ma, S. Koenig. Symmetry-Breaking Constraints for Grid-Based Multi-Agent Path Finding. AAAI 2019.(对称性破除)
- J. Li et al. Anytime Multi-Agent Path Finding via Large Neighborhood Search. IJCAI 2021.(MAPF-LNS)
- K. Okumura et al. Priority Inheritance with Backtracking for Iterative Multi-Agent Path Finding. IJCAI 2019.(PIBT)
- W. Hönig et al. Multi-Agent Path Finding with Kinematic Constraints. ICAPS 2016.(MAPF-POST 与 TPG)
- J. Li, A. Tinka, S. Kiesel, J. W. Durham, T. K. S. Kumar, S. Koenig. Lifelong Multi-Agent Path Finding in Large-Scale Warehouses. AAAI 2021.(RHCR)
- R. Stern et al. Multi-Agent Pathfinding: Definitions, Variants, and Benchmarks. SoCS 2019.(术语与基准的统一,入门必读)