
简介一份关于数据新鲜度驱动的协作式无人机联邦学习智能决策优化研究文档面向移动边缘计算、联邦学习及无人机通信领域的研究者与算法工程师。资源为单篇docx论文大小423KB共1个文件内容完整呈现从问题建模到算法设计的全流程。文档在联邦学习与MEC结合框架下将无人机作为空中边缘服务器重新定义信息年龄为端侧等待与无人机处理时间之和并据此构建多无人机协作范式联合优化时延、能耗、模型准确率与数据新鲜度。针对大规模状态空间设计基于全局与局部奖励的多智能体深度强化学习算法实现移动、通信与计算卸载的协同决策。文档还包含区域模型、约束形式化及真实数据集上的仿真验证便于读者复现实验、学习问题建模思路与DRL算法实现细节。目前已有198人学习适合作为相关课题研究的参考资料。1. 为什么这篇 docx 值得拆着读把“数据新鲜度”放进无人机联邦学习的第一约束多个无人机在网格化区域里来回飞接收分散用户设备的数据协同训练一个图像分类模型训练过程中数据只做本地处理、只上传模型参数避免原始数据回传云端——这是联邦学习与移动边缘计算结合后最常见的愿景。但真到落地时你会发现一块区域的数据如果迟迟没被无人机采集模型再新也没用训练用的数据已经“过期”了。传统联邦学习论文讨论准确率和通信开销很少把“数据等了多久”当成一个硬指标写进优化目标而这份研究正文恰恰把数据新鲜度也就是信息年龄AoI当成和准确率、能耗并列的优化项并把无人机移动、通信、卸载三个决策放到同一个多智能体强化学习框架里联合求解。适合谁看适合正在做无人机辅助边缘计算、MEC联邦学习仿真或者想把多智能体DRL落地到资源调度场景的从业者。它的价值不止在算法名字而在那一整套“环境怎么建模、奖励怎么分解、指标怎么算”的过程。2. 系统建模拆解区域网格、联邦循环与三类卸载决策的可落地形态这篇 docx 花大量篇幅讲系统模型很多人拿到手会直接跳到 PD-MADDPG 算法章节这其实是个错误。它真正的工程价值在于把物理世界里的无人机约束、通信约束、计算约束翻译成了强化学习能用的状态、动作和奖励。如果你跳过建模部分直接看算法后面复现时连动作空间怎么定义都说不清楚。2.1 区域模型与通信约束网格、覆盖半径与二元决策变量感知区域被划分成 M 个子区域每个子区域的中心视为一个用户设备它持续感知并产生实时数据。无人机以固定高度 H 飞行在每个时隙结束时通过调整飞行方向 θ 和飞行距离 d 移动到下一个子区域d 的上限是 l_max也就是单时隙最大飞行距离。论文用二元变量 o_t^{i,k} 表示位置当且仅当无人机 i 在时隙 t 处于子区域 k 上空时取 1否则取 0。同时有两个约束必须同时满足每架无人机在同一时隙只能停留在一个子区域且多个无人机不能停留在同一个子区域。这个约束看起来简单实际写仿真代码时很容易漏掉“多机冲突”这条。def apply_motion_mask(env, uav_positions, proposed_positions): valid_actions [] for i, prop in enumerate(proposed_positions): # 越界检查不能飞出目标区域边界 if not (0 prop[0] env.grid_m and 0 prop[1] env.grid_n): valid_actions.append(False) continue # 冲突检查一个时隙内两架无人机不能落到同一个子区域 conflict False for j, other_pos in enumerate(proposed_positions): if i ! j and prop other_pos: conflict True break # 同时排除与上一时隙自身位置相同的原地不动动作 if not conflict and prop uav_positions[i]: valid_actions.append(False) else: valid_actions.append(not conflict) return valid_actions这里我把子区域展成了二维网格坐标论文正文是枚举集合 M逻辑等价。越界动作在探索阶段没有概率意义直接丢弃两架无人机落到同一个子区域违反式(1)中的互斥约束原地不动的动作本身是合法的但论文把“原地徘徊”交给能耗惩罚去抑制所以我在动作掩码里没有一刀切禁掉。注意论文的探索是“当前策略动作加上高斯随机噪声噪声幅度 ρ 随时间衰减”如果你的仿真没有这个动作掩码探索阶段会出现大量非法样本训练曲线的方差会大得没法看。通信决策同样是二元变量 b_t^{i,k}表示无人机 i 在时隙 t 是否与子区域 k 中的用户设备通信。这里有个容易被忽略的约束当一个用户设备同时处于多架无人机覆盖范围内时它至多选择一台无人机通信。翻译成代码就是在构造通信矩阵时每一列用户设备的二元取值和不能大于 1。很多复现者只写了覆盖半径判断忘了加这个约束结果就是同一份数据被多架无人机重复采集联邦聚合时 A_t^i 的数据量统计虚高模型效果自然对不上论文。2.2 联邦学习循环下载、训练、上传、聚合的时序关系论文的联邦学习框架走的是标准流程云端下发最新全局模型无人机将其作为本地初始模型在自己覆盖范围内收集数据并执行若干轮随机梯度下降然后把训练好的本地模型上传回云服务器云端用联邦平均做加权聚合。这里我建议先把四个步骤拆成一张对照表后面写训练循环时可以直接对着表逐项核对。阶段关键公式与参数对仿真的影响下载全局模型ω_{t,0}^i ← ω_{t-1}每轮全局迭代的起点决定本地模型是否延续上一轮知识本地模型训练ω_{t,n}^i ω_{t,n-1}^i − η ∇L_i(ω_{t,n-1}^i)学习率 η0.01直接影响收敛速度和稳定性本地训练停止条件‖∇L_i(ω_{t,n}^i)‖ ≤ ϵ ‖∇L_i(ω_{t,n-1}^i)‖本地迭代次数 I_t^i(ϵ) 由这个相对梯度范数决定而不是写死轮数上传本地模型ω_t^i ← ω_{t,n}^i只传模型参数不传原始数据这是隐私保护的关键设计全局模型聚合ω_t Σ A_t^i ω_t^i / Σ A_t^i聚合权重与无人机接收并用于训练的数据量挂钩注意聚合权重用的是 A_t^i即无人机 i 从其覆盖区域用户设备接收并实际用于本地训练的数据量。这个量受通信决策直接影响如果某台无人机虽然飞到了覆盖范围但通信决策为 0它这一轮就没有数据参与聚合模型更新等于没做。我在复现时习惯把“通信决策 → 数据量计算 → 聚合权重”这条链路单独抽成一个函数方便排查每一轮谁的权重为零。本地训练停止条件用的是相对梯度范数比不是绝对阈值。这意味着不同数据分布下每台无人机的本地迭代次数会不一样进而影响本地计算时延和计算能耗。这也是为什么论文在能耗模型里把 I_t^i(ϵ) 作为变量而不是常数。2.3 任务卸载模型本地、U2U 和 U2B 三种方式的权重组合每台无人机收到数据后面临三个去向留在本地计算、通过无人机到无人机U2U链路卸载给其他无人机、通过无人机到基站U2B链路卸载给基站。论文分别用 x_t^i、y_t^{i,j}、z_t^i 表示三种数据比例且要求三者加权和等于 1也就是式(4)。U2U 链路不是随时可用的论文引入有向连接图 G_t只有当链路指示变量 l_t^{i,j}1 时y_t^{i,j} 才有效。实现这个卸载决策时常见的做法是让 actor 网络输出三个 logits再用 softmax 归一化保证 xyz1 自动满足。链路可达性则通过一个 mask 乘到 y 的分支上不可达链路的概率直接被置零再重新归一化。这里有一个工程细节论文假设无人机可以同时通过 U2U 和 U2B 链路传输数据且 I/O 与 CPU 可并行执行所以最终数据处理时延取三种方式的最大值而不是相加。如果你在仿真里把三条链路的时延串行相加总时延和 AoI 会明显偏大和论文结果对不上。三种卸载方式的时延构成也不一样本地处理时延与本地迭代次数、数据量、自身计算能力相关U2B 时延包含传输时延、基站计算时延和基站的排队时延 λ_BU2U 时延则包含传输时延、对方无人机计算时延和对方队列时延 λ_j。队列时延这一项很容易被忽略如果你的仿真环境里基站和无人机节点有并发任务必须给每个计算节点加一个等待队列否则高负载场景下 AoI 会被低估。3. 信息年龄与能耗模型从公式到仿真引擎的两个核心指标这一章是全文的指标基础。优化目标里有三样东西信息年龄 T_t、准确率 Acc_t、总能耗 E_t^i其中信息年龄和能耗都需要你逐时隙去算。很多复现者把注意力放在算法上结果指标计算口径不一致最后曲线对不上还以为是网络结构问题。3.1 信息年龄的递推更新空闲时间、数据量与接收时延论文把数据的信息年龄定义为“用户设备产生数据后直到被无人机处理完成的时间长度”包括两部分数据在端设备上等待的时间以及被无人机接收并处理的时间。前者用空闲时间 τ_t^k 递推τ_t^k (τ_{t-1}^k Δt) × (1 − Σ_i b_t^{i,k})用户设备一旦与某架无人机通信空闲时间归零否则每个时隙累加一个时隙长度 Δt。注意用户设备不通信时数据量也在持续积累。设感知速度为 φ_k空闲时间内产生的数据量为 a_t^k τ_t^k × φ_k。无人机 i 在时隙 t 接收到的总数据量 A_t^i 就是所有通信用户设备的数据量之和接收时延为 A_t^i / P_i其中 P_i 是无人机的数据接收能力。我在仿真里把“空闲时间更新”和“数据量计算”拆成了两个独立函数前者依赖上一时隙的通信决策后者依赖空闲时间和感知速度。如果你把这两步合在一起容易出现数据量用旧时隙空闲时间、而通信决策用新时隙的错位问题。为了把 AoI 写进训练循环我给一段示意代码def update_aoi(env, comm_decision, proc_delay, dt): # comm_decision: (N, M) 的 0/1 矩阵表示无人机与用户设备的通信关系 # proc_delay: (N,) 各无人机本轮数据处理的完成时延 idle_time env.idle_time # 每台用户设备的空闲时间 aoi_zone env.aoi_zone # 每个子区域当前的数据信息年龄 for k in range(env.num_zones): connected int(np.any(comm_decision[:, k] 0)) # 有通信则空闲时间归零否则跳过 dt idle_time[k] (idle_time[k] dt) * (1 - connected) aoi_zone[k] idle_time[k] for i in range(env.num_uavs): served np.where(comm_decision[i, :] 0)[0] for k in served: # 被无人机处理后AoI 还要累加处理时延 aoi_zone[k] proc_delay[i] return idle_time, float(np.sum(aoi_zone))这里有两个容易弄错的地方。第一idle_time 的更新用的是“上一时隙的通信决策”如果你在仿真循环里先算新决策再更新 idle_time会让设备空闲时间少算一个时隙AoI 整体偏低优化方向会偏。第二proc_delay 不是单一数值它由卸载决策决定本地处理的无人机算本地时延走 U2U 的算对方时延走 U2B 的算基站时延最后取三种方式的最大值作为该无人机的处理时延。我习惯在卸载决策模块里就把它算好再传给 AoI 更新函数。3.2 能耗模型移动、接收、计算、传输四类能耗不是平权的能耗模型拆成四项每一项背后都有明确物理意义。我整理成表格方便对照实现能耗项核心公式关键参数仿真注意点移动能耗E_mov ΣΣ p_mov^i × d_{k1,k2} / v_mov^i × o^{t-1} × o^t移动功率 p_mov、移动速率 v_mov和位置切换耦合需要查询两子区域间距离数据接收能耗E_rev p_rev^i × (A_t^i A_{i,rev}^t)接收功率 p_rev别忘了 U2U 中继数据 A_{i,rev} 也要算接收能耗计算能耗E_cmp I_t^i(ϵ) × p_cmp^i × (A_{i,i}^t A_{i,rev}^t) / c_i计算功率 p_cmp、计算能力 c_iI_t^i 是本地迭代次数和停止条件 ϵ 相关数据传输能耗E_tra p_tra^{iU} × Σ A_{i,j}^t / v_{i,j}^t p_tra^{iB} × A_{i,B}^t / v_{i,B}^t两条链路的发送功率和速率U2U 与 U2B 各自独立不要合并复现时最大的坑在计算能耗E_cmp 里乘了 I_t^i(ϵ)这是本地模型训练的迭代次数而迭代次数由梯度下降的停止条件决定不是固定值。如果你在仿真里把本地迭代次数写死为常数E_cmp 就会失去和“数据难度”的关联模型准确率变化时计算能耗却不变整个奖励信号就扭曲了。另一个坑在接收能耗U2U 卸载不仅发送方要花传输能耗接收方也要花接收能耗也就是公式里的 A_{i,rev}^t 那一项。只算发送不算接收能耗会少一大截μ2 对能耗的约束力就不对。3.3 优化目标 P1 的工程转化三个指标怎么放在同一目标里比大小论文的优化目标是最大化长期平均收益max (1/T) Σ [-T_t μ1 × Acc_t − μ2 × Σ E_t^i]同时满足式(1)到式(4)。这其实是在做三件事最小化区域总 AoI最大化全局模型准确率最小化所有无人机的总能耗。权重系数 μ11000、μ20.1 是论文给出的实验配置但它不是随便填的。AoI 是“时隙累积”量动辄几千上万准确率是 0 到 1 的小数能耗是每时隙产生的物理量量级可能在几十到几百。用 μ11000 去放大准确率用 μ20.1 去压缩能耗本质上是在做指标量级对齐而不是简单的喜好加权。我在自己仿真里通常会先跑一轮随机策略把 T_t、Acc_t、E_t 的量级各统计一遍再把 μ1、μ2 设成让三项对奖励贡献大致同等的数值。论文给的 1000 和 0.1 是个不错的起点但换了数据集、换了区域规模后量级会变直接搬运不一定稳。这点后面避坑章节会专门展开。4. PD-MADDPG 算法实现双 Critic、可分解奖励与优先级经验回放怎么配合系统建模搞定后算法部分其实是在回答一个问题这个含有离散变量和连续变量的组合优化问题怎么用深度强化学习求解。论文没有用 MADDPG 直接硬上而是在它基础上做了两个改动奖励分解成全局和局部两份再叠加优先级经验回放。这两处改动都有明确的工程动机。4.1 MDP 三元组与连续离散混合动作的包装问题先转成马尔可夫决策过程三元组 S, A, R。无人机的状态 s_i 包括当前位置 k_t^i、所有用户设备的空闲时间向量 τ_t、以及自己到其他无人机的链路状态 l_t^i。动作 a_i 包括飞行方向 θ、飞行距离 d、通信决策 b_i、本地处理比例 x、U2U 卸载比例 y、U2B 卸载比例 z。注意 b 是离散的 0/1 向量其余全是连续值。这是标准的连续离散混合动作空间。直接用确定性策略梯度输出混合动作一个常见做法是让 actor 网络对不同类型动作分头输出方向角和距离走连续头通信决策走 sigmoid 再二值化三个卸载比例走 softmax 保证和为 1。class UAVActor(nn.Module): def __init__(self, obs_dim, num_zones, num_uavs): super().__init__() self.fc1 nn.Linear(obs_dim, 256) self.fc2 nn.Linear(256, 256) # 动作头部分开设计避免离散和连续互相干扰 self.theta_head nn.Linear(256, 1) self.dist_head nn.Linear(256, 1) self.comm_head nn.Linear(256, num_zones) self.offload_head nn.Linear(256, 3) # 本地 / U2U / U2B 三条分支 def forward(self, obs): x F.relu(self.fc1(obs)) x F.relu(self.fc2(x)) theta torch.sigmoid(self.theta_head(x)) * 2 * 3.14159 # 方向角映射到 [0, 2π) dist torch.sigmoid(self.dist_head(x)) * self.max_dist # 距离映射到 [0, l_max) comm torch.sigmoid(self.comm_head(x)) # 通信概率 offload F.softmax(self.offload_head(x), dim-1) # 卸载比例归一化 return theta, dist, comm, offload这里每个头的设计都有对应约束θ 用 sigmoid 再乘 2π 是保证输出范围合法dist 用 sigmoid 再乘最大飞行距离避免出现超过 l_max 的非法动作offload 用 softmax 是为了让 xyz1 自动成立不需要在环境里再做一次归一化。通信决策 b 在训练时用 sigmoid 输出概率仿真环境里做二值化采样这样可以保留梯度信息如果直接输出 0/1 整数梯度传不回去actor 网络就没法更新了。4.2 双 Critic 与可分解奖励全局和局部奖励如何各自引导策略论文把奖励拆成全局和局部两份。全局奖励 r_g −T_t μ1 × Acc_t衡量区域数据新鲜度和模型准确率局部奖励 r_i −E_t^i衡量单台无人机能耗。优化目标变成最大化 r_g μ2 × Σ r_i。对应地算法引入两个 critic 网络全局 critic Q_ψ^g 接收所有无人机的状态和动作负责指导全局优化局部 critic Q_φ^l 只接收无人机 i 自己的状态和动作负责指导能耗最小化。这个分解的工程价值在于单一整体奖励在多智能体场景下容易让学习在全局目标和局部目标之间来回震荡。比如某架无人机为了减少整体 AoI 拼命往外飞能耗大增如果只有整体奖励它不知道自己应该为高能耗负责多少。有了局部 critic能耗信号可以直接回传到对应智能体的 actor梯度更新更精准。用公式表达的话actor 的策略梯度就是全局 critic 路径和局部 critic 路径的梯度之和这也是 DE-MADDPG 名字里 Decomposed 的由来。实现时我一般这样组织网络更新顺序先用全局 batch 更新全局 critic再用局部 batch 更新各个局部 critic最后用两个 critic 的梯度之和更新每个 actor。目标网络参数则用更新速率 ξ 做滑动平均也就是 ξ 取 0.01每次把 target 参数向在线参数拉近 1%。4.3 优先级经验回放 PER用 TD 误差决定样本的“重要性”优先级经验回放的核心思想是不是所有历史样本都值得同样的训练权重。论文用样本的 TD 误差作为优先级误差越大说明当前网络对这个样本的估计越不准用它训练能更快提升性能。这个机制对非独立同分布数据尤其重要因为不同区域的样本价值天然不一样均匀采样会浪费算力在大量“已经会了”的样本上。实际操作时每条样本存入缓存时记录一个优先级采样时按优先级大小做加权随机抽取更新完网络后用最新的 TD 误差重新计算该样本的优先级并回写。缓存满后新样本覆盖旧样本覆盖策略上可以保留一部分高优先级历史样本避免重要经验被冲掉。论文里 PER 缓冲区大小写的是 64我理解这更像训练 batch size实际做仿真时建议把缓存容量放在几千条的量级否则学习初期样本多样性严重不足容易过拟合到最近几十步的经验上。算法流程上论文把过程分成了三个阶段初始化阶段为每台无人机创建局部 actor/critic 和目标网络创建全局 critic 与目标网络初始化 PER探索阶段无人机按当前策略加衰减高斯噪声生成动作并处理边界和位置冲突约束利用阶段执行动作获得新状态和奖励存入 PER再抽取样本分别更新全局 critic、局部 critic 和 actor。这个“先在线跑一整个时隙再离线更新网络”的结构和常见的 centralized training with decentralized execution 是一致的区别只在奖励被拆成了两层。5. 复现避坑量级失衡、非独立同分布与动作空间里的三个翻车现场论文正文里给的参数是 MNIST、Fashion-MNIST、CIFAR-10 三个数据集无人机数量 N3覆盖半径 R_max1m飞行高度 H0.1m最大飞行距离 l_max10m通信带宽 W100MHz全局迭代回合 T_max400本地最大训练回合 N_max500学习率 η0.01折扣因子 γ0.9更新速率 ξ0.01。复现时你按这些参数能跑通但结果能不能收敛往往取决于几个容易翻车的细节。5.1 现象非独立同分布程度 D 一调大准确率直接崩掉复现论文时我一开始直接按 D2 设置数据分布结果 MNIST 上的准确率只有 0.35 左右比论文表格里的 0.533 差了一大截。后来发现 D 是每个子区域设备数据包含的类别标签数D2 意味着每个设备只有两类标签的数据本地模型训练时会严重偏向这两个类别聚合时模型发散准确率下降且收敛变慢。原因非独立同分布程度越大本地模型之间的差异越大联邦平均聚合出来的全局模型质量越差。这本质上是联邦学习里经典的非独立同分布问题论文用 D 这个参数把它显式建模进了仿真环境。解决如果你复现时发现自己跑出的曲线和论文对不上先检查 D 的赋值逻辑。我建议从 D0 完全均匀分布开始确认训练流程通顺后再逐步调大 D每一步对比准确率和收敛回合数。另外 CIFAR-10 对非独立同分布更敏感复现时优先用 MNIST 和 Fashion-MNIST 验证算法正确性再上难度高的数据集。5.2 现象μ11000、μ20.1 直接搬过来能耗项完全不起作用把论文的 μ11000、μ20.1 搬到自己的仿真里发现训练初期奖励值高得离谱但无人机几乎不做任何移动能耗低但数据新鲜度极差。后来把各指标打出来看才发现AoI 的量级是几千上万准确率是 0 到 1 的小数能耗是几十的数值。奖励函数里 T_t 的负值动辄上千μ1×Acc_t 撑死一千μ2×ΣE_t 只有个位数三项加在一起时能耗项几乎被淹没。原因奖励合成的量级没对齐。μ1 和 μ2 的取值本质上是在补偿三个指标之间的量级差异直接搬运论文参数到不同的环境配置下量级关系变了优化重心就偏了。解决我先用随机策略跑几十轮统计 T_t、Acc_t、E_t 的均值量级然后把三个子项分别做归一化再在归一化后的目标上加权重搜索。具体做法是T_t 除以一个参考值 T_refE_t 除以 E_refAcc_t 保持在 0 到 1然后再设 μ1、μ2。这样权重系数变化对训练曲线的影响才是可解释的。从那以后我每次新开环境第一件事就是做“指标量级检查”不再无脑沿用论文的超参。5.3 现象PER 刚开始训练就出现剧烈震荡loss 上下跳但奖励不涨优先级经验回放最大的坑在于“早期高 TD 误差样本被反复采样”。训练前几百步网络对状态的估计完全不准TD 误差普遍很大高优先级样本会集中在少数几个离群状态上导致 batch 多样性不足loss 震荡。我一开始是在缓存刚积累了 64 条样本时就开训练结果前 100 个回合完全没收敛。原因论文正文里 PER 缓冲区大小写的 64更像是指训练 batch size如果整个缓存只有 64 条高优先级的旧样本很快被覆盖网络在短时间窗口内反复看同样的经验样本多样性不够模型学不到通用策略。解决我的做法是先积累一个 warm-up 阶段缓冲区至少存够 2000 到 5000 条样本再开启训练同时把优先级求幂指数设置在 0.6 左右避免少数极端样本主导采样。另一处要注意的是探索噪声幅度 ρ 的衰减速度要与训练启动时机匹配。如果你 warm-up 期间噪声已经衰减到很低智能体探索范围受限后面学到的策略容易陷入局部最优。我一般把 ρ 设成线性衰减训练前期 300 个回合内从 1.0 降到 0.1然后再开一个小幅常数项保证长期探索。6. 拿到 docx 后的第一件事先做量级检查与随机基线再谈网络结构这份 docx 和普通论文最大的区别在于把数据新鲜度和联邦学习、多无人机协作放在一个优化框架里并且给出了完整的系统模型和算法设计。但拿它做复现我的经验是不要急着搭 PD-MADDPG先做两件事量级检查和随机基线对齐。先说你自己的环境无论你是改写成车联网、机器人巡检还是固定翼无人机编队第一步把五个基本要素列出来状态维度里有哪些连续值、哪些离散值动作空间的范围是什么比如飞行距离上限、通信链路数目奖励项由哪几部分组成分量覆盖数据新鲜度、任务完成度还是能耗数据分布用什么参数控制优化目标有没有做量纲归一化。这五列对齐了再进入代码层面。第二步是跑一个随机策略基线对应论文里的 RANDOM 算法。不训练任何网络每时隙随机生成方向角、飞行距离、通信和卸载动作记录 50 轮以上的平均总奖励、平均 AoI、平均能耗。这个基线的意义有两个一是验证你的环境实现是否自洽二是给后续训练结果一个参照系。比如我在自己的场景里发现随机策略的平均 AoI 在 800 左右那么训练算法至少要压到 500 以下才算有真实提升否则优化成果说不清楚。第三步才是把论文的 PD-MADDPG 拆进你的训练循环。核心结构是三段式actor 网络输出动作全局 critic 和局部 critic 分别评估全局和局部价值PER 缓存按 TD 误差加权采样。如果你觉得自己场景的状态空间比论文复杂可以先跑一个简化版比如固定无人机轨迹只优化通信和卸载决策确认双 critic 和奖励分解逻辑没问题之后再把移动决策加回来。第四步是验证方法。论文用了三个数据集和四种对比算法你不需要全做但至少保留一组PD-MADDPG 对 P-MADDPG 对 RANDOM。P-MADDPG 的存在只有价值它证明了优先级回放单独带来的提升RANDOM 则定义了最底线。两组对比加一条收敛曲线足以说明你的复现是否到达了论文效果。最后是迁移应用的进阶技巧。这份资源最值得搬走的部分不是 PD-MADDPG 这个名字而是“奖励分解 双 critic”这个设计模式。它广泛适用任何多智能体场景里如果同时存在一个全局目标和若干个局部目标比如车队总时延最小加单车能耗最小仓库机器人总吞吐最大加单机避碰损失最小都可以用这个思路把奖励拆开避免单一奖励信号让学习过程左右摇摆。我在自己项目里已经复用这个模式两次效果都比直接搬 MADDPG 要稳。另外提一个很容易被忽略的点论文没有专门处理联邦学习里的灾难性遗忘问题。如果你把训练轮次拉长本地模型在连续几轮都接收同一种分布的数据后可能会覆盖掉之前学到的类别特征这是联邦学习场景里的常见隐患。我的应对习惯是每过若干全局轮次随机让一部分无人机不参与聚合保持全局模型的类别记忆多样性。这里不展开但值得你留意。从那以后我每次开始一个多智能体联邦学习仿真都会强制自己先走过一遍量级检查、随机基线、简化版验证再谈“换上更漂亮的网络结构”。这套流程救过我很多次尤其是当训练曲线不收敛时绝大部分问题出在指标量级和动作空间定义上而不是网络本身。希望帮到你。本文还有配套的精品资源点击获取