多智能体群集运动怎么计算?拆开 Boids 的分离、对齐与聚合

用固定邻居位置速度核对三类局部转向向量。提供自定输入、完整计算和可核对结果,说明适用条件。

Boids 通过邻居之间的局部规则产生群体运动。先将分离、对齐、聚合三部分数值拆开,才能知道某次转向来自哪里。Craig Reynolds 的作者资料介绍这三条规则;下面是自定的二维线性转向变体,并非原作代码或现实飞行控制器。

固定快照和三条规则

焦点 A 位于 (0,0),速度 (1,0);邻居 B 位于 (1,0),速度 (1,0),C 位于 (−1,1),速度 (0,1)。邻域半径设为 2,两位邻居都在范围内。分离向量为各邻居“自身位置减邻居位置”除以距离平方后相加;对齐为邻居平均速度减自身速度;聚合为邻居平均位置减自身位置。

多智能体群集运动怎么计算?拆开 Boids 的分离、对齐与聚合

这套具体公式是教学选择。分离得到 (−0.5,−0.5),对齐得到 (−0.5,0.5),聚合得到 (0,0.5)。权重分别为 1、0.5、0.25,合成转向 (−0.75,−0.125)。邻居快照应统一使用更新前数据,不能边更新 A 边让其他个体读到新旧混杂状态。

运行并保留每个分量

保存 boids_components.py,用 Python 3 执行 python boids_components.py。零邻居时返回零转向;位置完全重合时无法用距离平方区分方向,本例拒绝并要求上层处理,不能静默除零。

from math import isclose
pos=(0.0,0.0); velocity=(1.0,0.0)
neighbors=[((1.0,0.0),(1.0,0.0)),((-1.0,1.0),(0.0,1.0))]
near=[]
for q,v in neighbors:
    d2=sum((a-b)**2 for a,b in zip(pos,q))
    if d2==0:
        raise ValueError("coincident positions need a separate rule")
    if d2<=4:
        near.append((q,v,d2))
if near:
    n=len(near)
    separation=tuple(sum((pos[j]-q[j])/d2 for q,v,d2 in near) for j in (0,1))
    alignment=tuple(sum(v[j] for q,v,d2 in near)/n-velocity[j] for j in (0,1))
    cohesion=tuple(sum(q[j] for q,v,d2 in near)/n-pos[j] for j in (0,1))
else:
    separation=alignment=cohesion=(0.0,0.0)
steer=tuple(separation[j]+0.5*alignment[j]+0.25*cohesion[j] for j in (0,1))
dt=0.1
new_velocity=tuple(velocity[j]+dt*steer[j] for j in (0,1))
new_position=tuple(pos[j]+dt*new_velocity[j] for j in (0,1))
print("separation,alignment,cohesion:",separation,alignment,cohesion)
print("steer,velocity,position:",steer,new_velocity,new_position)
assert all(isclose(a,b) for a,b in zip(steer,(-0.75,-0.125)))
assert all(isclose(a,b) for a,b in zip(new_position,(0.0925,-0.00125)))

核对数值后再扩大模拟

这里用更新后的速度推进位置,是一次半隐式位置更新;如果改为旧速度推进位置,结果会不同,不能沿用旧断言。给所有个体同时计算时,先复制完整旧快照,算完各转向再统一写入。之后才能讨论视野角度、速度上限、墙壁或障碍响应。

三条局部规则不自动保证无碰撞、持续连通或到达目标。权重、邻域和时间步会影响轨迹,本例只有一次数值核对,没有展示完整群集动画,也没有证明稳定性。邻居分离项较大时,应检查距离尺度,而不是将其误解为模型出现“个性”。下一步记录每个分量随时间的变化,再加入明确边界条件和碰撞检查。

资料与核对依据

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/33397.html

赞 (0)
AI小管家的头像AI小管家
智能体关联两份数据怎样防止行数膨胀?先验证右表键唯一,再保留未匹配项
上一篇 1小时前
AI 智能体导入数据怎样避免半批成功?用事务验证失败回滚
下一篇 1小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部