
1. 项目背景与核心问题定义最近在做一个挺有意思的仿真项目核心是让一群带着网的无人机去拦截一个机动性特别强的目标。这听起来有点像老鹰抓小鸡但难点在于目标不是傻站着等你抓它特别“敏捷”Agile会跑、会躲而且我们的无人机是“多智能体”Multi-Agent它们之间需要配合还得考虑那张“网”Net-Carrying带来的物理和协作约束。传统的控制方法在这里有点力不从心因为环境动态复杂对手策略未知所以很自然地我们转向了多智能体强化学习Multi-Agent Reinforcement Learning, MARL这个方向。这个问题的本质是一个“追逃博弈”Pursuit-Evasion Game的变体。追逃问题研究了几十年从早期的微分博弈理论到现在的AI方法一直是检验协同控制算法的试金石。我们项目的特殊之处在于两个关键词“Net-Carrying”和“Competitive”。带网意味着抓捕动作不是简单的“碰到就算”可能需要多架无人机协同拉网、定位、收网这引入了复杂的动作空间和协作需求。竞争性则意味着目标和拦截方是利益完全对立的目标会尽一切可能逃脱这要求我们的拦截策略不能是静态的必须能适应并击败一个不断进化的对手策略。为什么选择MARL因为在这种部分可观测、非稳态的环境里每个无人机智能体只能看到局部信息比如自己和附近队友的位置、速度以及目标的相对方位它们需要基于这些不完整的信息做出决策并且决策会相互影响。传统的集中式规划计算量大且难以应对实时变化。MARL让每个智能体学会一个策略通过与环境以及队友的不断交互试错最终涌现出有效的协同拦截行为。这比我们手动设计规则要强大和灵活得多。2. 多智能体强化学习框架选型与对比确定了用MARL这个大方向后下一个问题就是用哪种算法框架这直接决定了我们训练的效率、最终策略的智能程度以及工程实现的复杂度。围绕“竞争性”和“协同拦截”这两个核心我们重点对比了几种主流范式。2.1 集中式训练与分布式执行CTDE范式这是我们最终选择的基石。CTDE的核心思想是在训练时允许算法使用一些全局信息比如所有智能体的观测、动作甚至环境的全局状态来学习更优的策略但在执行时每个智能体只依赖自己的局部观测进行独立决策。这完美契合了我们的需求训练时可以利用全局信息学习复杂的配合比如如何布网执行时每架无人机只需依赖自身的传感器如摄像头、雷达数据具备真正的分布式部署能力。2.2 主流算法对比MAPPO vs. MADDPG vs. 注意力机制在CTDE框架下有几个著名的算法MADDPG深度确定性策略梯度算法的多智能体版本。它采用Actor-Critic结构为每个智能体维护一个Actor策略网络和一个Critic价值网络。其Critic在训练时可以获取所有智能体的动作和状态信息以此来指导每个Actor的更新。MADDPG在处理连续动作空间比如无人机的速度、航向角上表现很好我们的无人机控制正好是连续的。但它对超参数比较敏感且训练可能不太稳定。MAPPO近端策略优化算法的多智能体版本。这是PPO在多智能体场景下的直接扩展。PPO本身就以训练稳定、对超参数不敏感著称。MAPPO通常采用集中式的价值函数Critic在训练时评估联合动作的优劣。它的策略Actor输出可以是连续的也可以是离散的。考虑到我们初期对算法稳定性的要求MAPPO是一个强有力的候选。Actor-Attention-Critic这是随着Transformer在RL领域应用而兴起的一种架构。其核心是在Critic网络中引入注意力机制Attention Mechanism让每个智能体的Critic能够自适应地“关注”对其决策最重要的其他智能体的信息而不是粗暴地把所有信息拼接起来。这对于我们这种需要精细协同比如谁主攻、谁策应、谁补位的场景可能特别有用。最新的网络热词也提到了它说明这是当前的一个研究热点。2.3 我们的选择基于MAPPO的改进方案经过权衡我们选择了以MAPPO作为基础框架并计划融入注意力机制进行改进。理由如下稳定性优先项目首要目标是得到一个能工作、可训练的基线系统。MAPPO相比MADDPG具有更好的训练稳定性减少了初期调试的难度。与注意力机制的自然结合MAPPO的集中式Critic是引入注意力机制的理想位置。我们可以构建一个Actor-Attention-Critic网络其中Actor网络保持不变基于局部观测输出动作而Critic网络则是一个注意力网络它接收所有智能体的观测和动作作为输入通过注意力层计算出一个加权后的全局状态表征再评估价值。这样Critic能学会在评估时更关注那些与当前智能体决策密切相关的队友和目标信息。应对部分可观性注意力机制天生擅长处理序列和关联信息能一定程度上缓解部分可观性带来的挑战帮助智能体间接“推断”出全局态势的关键部分。注意算法选型没有绝对的对错只有是否适合当前问题。MADDPG在有些场景下性能可能更好但我们需要在性能、稳定性和实现复杂度之间取得平衡。先建立一个稳定的基线Baseline再在其基础上迭代优化是更稳妥的工程实践。3. 竞争性训练环境构建自博弈与课程学习有了算法框架接下来要解决“竞争性”这个核心。我们的对手敏捷目标不是一个固定脚本而应该也是一个智能体这样才能训练出强大的拦截策略。这里我们采用了“自博弈”Self-Play结合“课程学习”Curriculum Learning的方法。3.1 自博弈让自己成为自己的老师自博弈是训练竞争性AI的经典方法从AlphaGo到OpenAI Five都在使用。在我们的场景中具体做法是初始化两个策略网络一个用于拦截方policy_net_pursuer一个用于逃跑方policy_net_evader。在每一轮训练中拦截方和逃跑方使用各自当前的策略进行对抗。收集对抗产生的轨迹数据分别用于更新拦截方和逃跑方的策略。随着训练进行逃跑方策略不断进化迫使拦截方策略也必须持续进步从而形成一种“水涨船高”的竞争进化环境。3.2 课程学习从易到难循序渐进直接让新手拦截方去抓一个高手逃跑方训练会非常困难智能体可能什么都学不到。课程学习的思路是设计一系列难度递增的训练场景阶段一固定路径目标。让目标沿着一个简单的、固定的轨迹运动比如匀速直线运动。这个阶段的目标是让拦截方无人机学会基本的追踪和围堵概念以及初步的协同站位。阶段二规则策略目标。让目标采用一些简单的逃逸规则比如总是朝着离它最近的无人机反方向加速或者向包围圈最薄弱处突围。这个阶段开始引入策略对抗。阶段三历史策略对手。将训练过程中保存下来的、过去版本的拦截方策略作为逃跑方策略。例如用第1000轮训练时的拦截方策略作为当前逃跑方的策略。这样拦截方总是在与“过去的自己”或“稍弱一点的自己”对抗难度逐步提升。阶段四并行训练与池化对手。维护一个“对手策略池”Opponent Pool里面保存了多个不同训练阶段、不同强度的逃跑方策略。每一局训练随机从池中抽样一个策略作为对手。这可以防止拦截方策略过度拟合Overfit到某一种特定的逃跑风格上使其泛化能力更强。3.3 环境仿真与奖励函数设计我们使用PyBullet或Unity ML-Agents这类物理仿真平台来构建三维环境。奖励函数Reward Function是指挥棒设计好坏至关重要。拦截方奖励稀疏最终奖励成功拦截网住目标时给予一个大的正奖励如100。这是最终目标。密集过程奖励距离奖励团队中距离目标最近的无人机其与目标距离的负值作为奖励鼓励接近。reward_distance -min_distance_to_target包围奖励计算目标到所有拦截无人机形成的多边形的质心的距离距离越小奖励越高鼓励形成包围圈。协同奖励如果多架无人机同时从不同方向接近目标给予额外奖励鼓励协同。能耗惩罚对无人机的加速度、角速度变化进行小幅负奖励鼓励平滑、节能的运动。时间惩罚每一步给予一个小的负奖励如-0.01鼓励快速解决问题。逃跑方奖励生存奖励每存活一步获得一个小的正奖励。距离奖励与最近拦截者的距离越大奖励越高。被捕惩罚被拦截时给予一个大的负奖励如-100。实操心得奖励函数的设计是一个反复调参的过程。初期可以简化先以稀疏奖励只有成功/失败为主让智能体先探索到成功轨迹。然后逐步加入密集奖励来 shaping 其行为。要小心奖励之间的量级和冲突避免智能体找到“刷分”的漏洞比如只顾围着目标转却不抓捕。4. 网络架构与协同机制实现细节这一部分深入到代码和模型层面讲讲我们如何具体实现那个“带网无人机协同拦截”的智能体大脑。4.1 智能体观测空间与动作空间观测空间对于每一架拦截无人机其局部观测可能包括自身状态位置、速度、姿态、剩余电量。相对信息相对于目标的位置、速度。队友信息一定范围内最近K个队友的相对位置、速度处理成固定维度的向量不足则补零。网络状态网是否已部署、网的张角、张力等如果已部署。历史信息过去N步的自身动作或观测可选用于感知动态。动作空间连续动作空间。通常包括三维空间中的加速度指令或推力矢量。偏航角速度指令。一个离散或连续的动作用于触发“撒网”或“收网”。这里需要仔细设计例如可以是一个0-1之间的连续值表示“撒网准备度”当多架无人机的准备度同时超过阈值且位置合适时视为协同撒网动作触发。4.2 Actor-Attention-Critic 网络实现我们基于MAPPO实现了注意力Critic。以下是简化后的PyTorch风格伪代码展示核心思想import torch import torch.nn as nn import torch.nn.functional as F class MultiHeadAttentionLayer(nn.Module): # 一个简单的多头注意力层 def __init__(self, embed_dim, num_heads): super().__init__() self.attention nn.MultiheadAttention(embed_dim, num_heads) def forward(self, query, key, value): # query: [target_agent_dim] - [1, 1, embed_dim] # key, value: [num_agents, 1, embed_dim] attn_output, attn_weights self.attention(query, key, value) return attn_output.squeeze(0), attn_weights # 返回注意力输出和权重 class AttentionCritic(nn.Module): def __init__(self, obs_dim, act_dim, num_agents, hidden_dim128, attn_heads4): super().__init__() self.num_agents num_agents # 编码器将每个智能体的观测动作编码为特征向量 self.encoder nn.Sequential( nn.Linear(obs_dim act_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim) ) # 注意力层 self.attention MultiHeadAttentionLayer(hidden_dim, attn_heads) # 价值头基于注意力聚合后的全局信息为当前智能体计算价值 self.value_head nn.Sequential( nn.Linear(hidden_dim * 2, hidden_dim), # 聚合信息 自身编码 nn.ReLU(), nn.Linear(hidden_dim, 1) ) def forward(self, obs, acts, agent_id): obs: [num_agents, obs_dim] acts: [num_agents, act_dim] agent_id: 当前需要计算价值的智能体ID # 1. 编码所有智能体信息 agent_inputs torch.cat([obs, acts], dim-1) # [num_agents, obs_dimact_dim] encoded_features self.encoder(agent_inputs) # [num_agents, hidden_dim] # 2. 当前智能体的特征作为query所有智能体特征作为key和value query encoded_features[agent_id].unsqueeze(0).unsqueeze(0) # [1, 1, hidden_dim] keys values encoded_features.unsqueeze(1) # [num_agents, 1, hidden_dim] # 3. 应用注意力 attn_output, attn_weights self.attention(query, keys, values) # attn_output: [1, hidden_dim] attn_output attn_output.squeeze(0) # [hidden_dim] # 4. 将注意力输出与当前智能体自身编码拼接计算价值 critic_input torch.cat([attn_output, encoded_features[agent_id]], dim-1) value self.value_head(critic_input) return value, attn_weights # 返回价值以及注意力权重可用于可视化分析 # Actor网络相对传统基于局部观测输出动作分布均值和对数标准差 class Actor(nn.Module): def __init__(self, obs_dim, act_dim, hidden_dim128): super().__init__() self.mean_net nn.Sequential( nn.Linear(obs_dim, hidden_dim), nn.Tanh(), nn.Linear(hidden_dim, hidden_dim), nn.Tanh(), nn.Linear(hidden_dim, act_dim) ) self.log_std nn.Parameter(torch.zeros(1, act_dim)) def forward(self, obs): action_mean self.mean_net(obs) action_std torch.exp(self.log_std).expand_as(action_mean) return torch.distributions.Normal(action_mean, action_std)在这个设计中AttentionCritic为每个智能体计算价值时会通过注意力机制“看”一遍所有队友的信息并动态地决定哪些队友的信息更重要。这比简单的全连接网络拼接所有信息更高效也更容易学到复杂的协同模式。4.3 协同撒网的动作协调机制“带网”这个约束是项目的物理核心。我们假设网由多架无人机共同携带。协同撒网需要解决两个问题时机判断和动作同步。时机判断When我们让每个无人机的Actor网络除了输出运动动作还输出一个额外的标量net_readiness范围0-1。这个值可以理解为“我认为现在可以撒网的程度”。同时Critic网络在训练中会学习到在何种全局状态下集体撒网能获得高奖励。动作同步How在实际执行中我们设置一个全局阈值如0.7。当超过一定比例如2/3的无人机其net_readiness 阈值并且它们相对于目标的位置满足一定的几何条件比如形成一个包围圈且距离合适时就触发协同撒网指令。触发后所有无人机执行一个预设的“撒网”动作序列如减速、调整姿态、释放网具。训练信号成功拦截获得的高额奖励会通过Critic和Actor的反向传播最终教会各个无人机在正确的时机输出高的net_readiness并移动到正确的位置。注意力机制在这里可以帮助无人机感知到队友是否也做好了准备通过队友的观测和动作信息间接推断。踩坑实录最初我们尝试让一个“领导”无人机单独决定撒网时机然后广播指令。但发现这引入了单点故障且“领导”的决策很难训练。改为上述的分布式共识机制后虽然训练初期协同效率低大家节奏不一但通过奖励的 shaping 和足够长的训练智能体们自己学会了“默契”。可视化注意力权重图会发现在接近抓捕时智能体们会格外关注那些处于关键围堵位置的队友的状态。5. 训练流程、超参数调优与性能评估将上述所有部分组合起来就构成了完整的训练管线。这里分享我们的训练设置和一些调参经验。5.1 训练流程概述环境初始化创建包含N架拦截无人机和1个逃跑目标的物理仿真环境。智能体初始化为拦截方和逃跑方分别初始化其Actor和AttentionCritic网络。数据收集并行运行多个环境实例。在每个实例中智能体根据当前策略与环境交互收集轨迹数据观测、动作、奖励、下一个观测、是否结束。优势估计与回报计算使用GAEGeneralized Advantage Estimation为每一步数据计算优势函数A_t并计算回报R_t。这是PPO系列算法的标准步骤。网络更新拦截方更新使用收集到的拦截方数据计算策略损失PPO的Clip损失和价值损失更新拦截方的Actor和Critic网络。逃跑方更新同理使用逃跑方数据更新其网络。对手策略更新按照课程学习计划定期更新“对手策略池”。例如每训练10000步将当前逃跑方策略加入池中并可能随机从池中移除一个旧策略。评估定期如每训练50000步冻结当前策略在一个独立的测试环境集合中运行一定次数统计拦截成功率、平均拦截时间、团队协同度指标如队形保持度、动作同步性等。5.2 关键超参数与调优经验下表列出了我们调整后效果较好的一组核心超参数超参数取值说明与调优经验PPO Clip范围 (ε)0.2标准值。调小如0.1会使策略更新更保守训练稳定但慢调大可能不稳定。价值函数系数0.5价值损失在总损失中的权重。需要与策略损失平衡防止价值网络过拟合或欠拟合。熵系数0.01鼓励探索。训练初期可稍大如0.05后期逐渐衰减以利于策略收敛。GAE参数 (λ)0.95优势估计的衰减因子。常用值。折扣因子 (γ)0.99远期奖励的折扣。对于追逃这种延迟奖励明显的任务需要接近1的值。学习率Actor: 3e-4, Critic: 5e-4使用Adam优化器。Critic通常可以比Actor学得快一点。我们使用了学习率线性衰减。批量大小每环境512步 并行8环境总批量大小4096。增大批量大小通常更稳定但需要更多内存。训练epoch数10每次用一批数据更新网络时迭代的次数。太多可能导致过拟合。注意力头数4在我们的实验中4头或8头注意力效果差异不大4头计算效率更高。智能体编码维度128Actor和Critic编码层的隐藏层维度。根据问题复杂度调整。5.3 性能评估与可视化除了拦截成功率这个最终指标我们更关注策略的“智能”程度。以下是一些有用的评估和可视化方法轨迹回放将成功和失败的拦截案例可视化出来观察无人机群的协同路径、包围圈的形成过程、以及撒网时机。这是最直观的调试工具。注意力权重可视化将AttentionCritic输出的attn_weights可视化。可以看到在决策的不同时刻每架无人机更关注哪个队友或目标的哪个方面。例如在追击阶段可能更关注目标在合围阶段可能更关注侧翼队友的位置。** ablati**on study消融实验这是证明我们设计有效性的关键。实验A使用标准MAPPOCritic为简单全连接网络。实验B使用我们设计的Actor-Attention-Critic。实验C在B的基础上移除课程学习让拦截方从一开始就与最终版的逃跑策略对抗。实验D在B的基础上移除协同撒网的net_readiness机制改为一个中心控制器触发。通过对比A和B可以评估注意力机制带来的性能提升对比B和C可以评估课程学习的有效性对比B和D可以评估分布式协同决策机制的必要性。在我们的实验中B组完整模型在最终拦截成功率和策略鲁棒性上显著优于其他组。训练这样一个系统在单台RTX 4090显卡上大约需要150万到200万步的环境交互相当于数天的训练时间才能达到一个比较理想的拦截成功率在中等难度的测试场景下超过85%。关键的训练曲线拐点通常出现在课程学习切换阶段以及智能体首次“发现”有效的协同围捕策略时。