CBS
-
实例
-
以下将通过一个简单的实例体现CBS的基本过程:
-
![](https://img-blog.csdnimg.cn/77ff24e77d4b4955b029d1e0f80bb66c.png)
讲解:
-
上层
-
结点:指的是每个”小方格“;
-
节点:树的节点;
-
(ai, aj, s, t):ai与aj在t时刻都在s结点上;
-
OPENcbs:存放待探测的状态,与下层的OPEN意思一样,都是将下一步(某时刻)可能要走的结点存放进来;
-
N:为结点;
-
N.constraints:一个约束集,包含对问题中所有 Agent 的约束;(我们要做的就是在某个结点上给定的约束集中,帮Agent规划避开在该结点的约束集后的其最佳路线);
-
N.solution:问题的一个解,这个解可能不是有效的,但是这个解中所有 的 Agent 的路径都满足该结点 的约束集中的约束;(看例子:在节点1,我们发现,他们在3结点冲突了,于是得到了节点2和节点3,这两个节点均得到了3结点的解,满足了该结点的约束集,但是整条路径下来,两个还是会撞上,因此不是有效的);
-
N.cost:该结点解的代价。(我们避开该结点的约束集可能有很多解,所以我们需要求解的代价,然后得到该结点的解中代价最小的那个);
-
-
下层
-
A*算法
-
流程:
CBS算法流程,即初始化上层的时候先计算出所有的Agent的解和其对应的总cost,令约束树为空,(解释:第一步我们无视其他Agent,得到每个Agent到指定位置的路线,其路线cost最优(小)),然后每一轮弹出约束树的cost最小的结点N(从OPEN队列中弹出),判断N中是否存在一个冲突,只需要找到一个即可,用(ai,aj,s,t)表示冲突,然后生成两个子结点N1,N2,并且都值传递继承节点N的内容,存进OPEN,接着将冲突(ai,aj,s,t)分成约束结点(ai,s,t)和(aj,s,t),一个加入到N1约束树中,一个加入到N2约束树中,(解释:我们以一个Agent为视角,走到s时发生冲突,那我退回去上个结点,然后此时我继承了s点冲突的信息,也就是说也保留了约束集,所以这台Agent会重新规划最优路线(cost最小),以保证自己在t时间内避开s,即约束集),对于N1而言,ai的约束发生了变化,因此需要对ai进行重新规划,规划时需要在约束树下进行规划,最后更新ai的路径和cost值并插入到上层优先队列中OPEN中,接着对N2进行同样的操作,直到取出的N检测没有冲突时返回结点N即可。
个人理解环节:
个人理解环节:上层其实和下层一样,都是A*,都是我(为一台Agent)走一步计算一步,每一步都是最优的,然后上层呢,就是我在某个结点和其他Agent撞上了,就记录下该时间该结点我不能走这个结点,于是我就重新规划绕开走(这里相当是发配命令给下层,让下层通过A*得到这台Agent一条路径,然后将这条路径反馈给上层,上层将其放入解中,分析这个解是否有效),然后因为我们是多台Agent,那么就产生了分支,树也就建出来了:我们假设是两台(a1,a2),一条分支a1动,a2不动;一条分支a2动,a1不动;但是呢,我绕开了这个结点,也不能保证,在绕开该结点后,我这台Agent就不撞上了,所以下一步就会继续寻找撞上的结点,再次进行避开操作,于是又产生了分支,以此类推,最终找到所有Agent不碰撞的解(路径)。