多智能体 移动多目标点 分布式控制 编队控制 初始位置任意的一组代理在平面上迅速移动到指定的编队中最近在折腾多智能体编队控制的时候发现了个特别有意思的现象——一群随机分布的智能体能在完全不依赖中央控制器的情况下自己商量着摆出指定队形。就像军训时教官突然消失但同学们还能默契地排成方阵。这里头藏着分布式控制的魔法咱们用Python来扒开看看。先扔个场景设定平面上20个智能体随机出生目标是要摆出直径5米的圆形队列。关键是不能有指挥官每个铁憨憨只能和附近2米内的队友唠嗑。import numpy as np import matplotlib.pyplot as plt class Agent: def __init__(self, id): self.pos np.random.rand(2)*10 # 随机初始位置 self.target None # 动态调整的目标点 self.neighbors [] def update_neighbors(self, agents, radius2): self.neighbors [a for a in agents if np.linalg.norm(a.pos - self.pos) radius and a ! self]重点来了每个智能体的目标点不是固定值而是动态计算的。这里用了个混合策略既要往全局目标队形的位置靠又要和邻居保持队形相对位置。def compute_target(self, global_targets): # 全局队形吸引力类似弹簧拉力 global_force 0.1 * (global_targets[self.id] - self.pos) # 邻居相对位置修正 neighbor_force np.zeros(2) for neighbor in self.neighbors: desired_offset global_targets[neighbor.id] - global_targets[self.id] actual_offset neighbor.pos - self.pos neighbor_force 0.8 * (actual_offset - desired_offset) # 合成移动方向 self.target self.pos global_force neighbor_force这段代码像极了人际交往——既要顾全大局全局目标又要处理邻里关系相对位置。0.8这个系数控制着从众心理的强度调大了容易扎堆调小了队伍容易散架。多智能体 移动多目标点 分布式控制 编队控制 初始位置任意的一组代理在平面上迅速移动到指定的编队中跑个模拟看看效果# 初始化 agents [Agent(i) for i in range(20)] global_targets [np.array([55*np.cos(theta),55*np.sin(theta)]) for theta in np.linspace(0, 2*np.pi, 20)] # 模拟循环 for _ in range(100): for agent in agents: agent.update_neighbors(agents) agent.compute_target(global_targets) # 简单运动模型 agent.pos 0.1 * (agent.target - agent.pos)用matplotlib做动态可视化时能看到智能体们最初像无头苍蝇乱撞约20步后开始出现圆形轮廓50步左右基本稳定。有意思的是边缘的智能体会自发调整位置就像有人喊口令似的。实际调试时踩过几个坑通信半径小于目标队形尺寸时队伍会分裂成小团体移动速度参数需要与更新频率匹配否则会出现过冲抖动加入障碍物规避时可以在计算目标时叠加斥力场这种分布式搞法比集中式控制抗揍多了——随便干掉几个智能体剩下的会自动补位。就像蜂群掉了几只工蜂整个队形还能保持完整生物界的智慧确实有料。最后留个思考题要是目标队形在移动中变形比如从圆形变三角形代码要怎么改才能让智能体们优雅地切换队形提示可以给global_targets加个时间维度参数让目标位置动态更新。
多智能体协同编队控制:移动多目标点与分布式控制的实现策略
多智能体 移动多目标点 分布式控制 编队控制 初始位置任意的一组代理在平面上迅速移动到指定的编队中最近在折腾多智能体编队控制的时候发现了个特别有意思的现象——一群随机分布的智能体能在完全不依赖中央控制器的情况下自己商量着摆出指定队形。就像军训时教官突然消失但同学们还能默契地排成方阵。这里头藏着分布式控制的魔法咱们用Python来扒开看看。先扔个场景设定平面上20个智能体随机出生目标是要摆出直径5米的圆形队列。关键是不能有指挥官每个铁憨憨只能和附近2米内的队友唠嗑。import numpy as np import matplotlib.pyplot as plt class Agent: def __init__(self, id): self.pos np.random.rand(2)*10 # 随机初始位置 self.target None # 动态调整的目标点 self.neighbors [] def update_neighbors(self, agents, radius2): self.neighbors [a for a in agents if np.linalg.norm(a.pos - self.pos) radius and a ! self]重点来了每个智能体的目标点不是固定值而是动态计算的。这里用了个混合策略既要往全局目标队形的位置靠又要和邻居保持队形相对位置。def compute_target(self, global_targets): # 全局队形吸引力类似弹簧拉力 global_force 0.1 * (global_targets[self.id] - self.pos) # 邻居相对位置修正 neighbor_force np.zeros(2) for neighbor in self.neighbors: desired_offset global_targets[neighbor.id] - global_targets[self.id] actual_offset neighbor.pos - self.pos neighbor_force 0.8 * (actual_offset - desired_offset) # 合成移动方向 self.target self.pos global_force neighbor_force这段代码像极了人际交往——既要顾全大局全局目标又要处理邻里关系相对位置。0.8这个系数控制着从众心理的强度调大了容易扎堆调小了队伍容易散架。多智能体 移动多目标点 分布式控制 编队控制 初始位置任意的一组代理在平面上迅速移动到指定的编队中跑个模拟看看效果# 初始化 agents [Agent(i) for i in range(20)] global_targets [np.array([55*np.cos(theta),55*np.sin(theta)]) for theta in np.linspace(0, 2*np.pi, 20)] # 模拟循环 for _ in range(100): for agent in agents: agent.update_neighbors(agents) agent.compute_target(global_targets) # 简单运动模型 agent.pos 0.1 * (agent.target - agent.pos)用matplotlib做动态可视化时能看到智能体们最初像无头苍蝇乱撞约20步后开始出现圆形轮廓50步左右基本稳定。有意思的是边缘的智能体会自发调整位置就像有人喊口令似的。实际调试时踩过几个坑通信半径小于目标队形尺寸时队伍会分裂成小团体移动速度参数需要与更新频率匹配否则会出现过冲抖动加入障碍物规避时可以在计算目标时叠加斥力场这种分布式搞法比集中式控制抗揍多了——随便干掉几个智能体剩下的会自动补位。就像蜂群掉了几只工蜂整个队形还能保持完整生物界的智慧确实有料。最后留个思考题要是目标队形在移动中变形比如从圆形变三角形代码要怎么改才能让智能体们优雅地切换队形提示可以给global_targets加个时间维度参数让目标位置动态更新。