ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

博弈论与模糊强化学习驱动的多智能体二分包含控制

博弈论与模糊强化学习驱动的多智能体二分包含控制 简介一份面向多智能体系统研究人员与算法工程师的中文资料包聚焦基于博弈论和模糊强化学习的非线性多智能体系统二分包含控制方法尤其适合需要处理智能体间合作与竞争关系的分布式控制系统。内容以英文论文及配套Python复现代码与中文解释呈现核心思想是将最优包含问题建模为通信拓扑上的N玩家博弈通过积分强化学习在线求解纳什均衡并利用模糊逻辑系统逼近值函数无需依赖系统漂移动态针对高阶系统给出了严格的稳定性证明与仿真验证。整包仅含1个PDF文件大小约627KB文档内除论文全文外还逐步展示了带符号图建模、结构平衡性检查、模糊规则设计、经验回放更新参数等关键环节复现代码可迁移至无人机编队、智能电网等实际场景。目前已有130人浏览学习适合具备多智能体系统、博弈论、模糊逻辑或强化学习基础的读者用于算法复现与理论验证。1. 非线性多智能体系统的二分包含控制不只是“收敛到凸包”那么简单做过多智能体协同控制的人都知道包含控制的目标是让所有跟随者进入领导者围成的凸包但如果你在拓扑里引入“对抗”关系让一部分边带负号问题立刻变成二分包含控制——跟随者不再收敛到一个凸包而是收敛到一个由正、负两侧领导者共同界定的符号区间。这个方向在协同群集运动控制里很常见有人配合你也有人抵消你控制目标是在博弈中站住位置。这个标题提出的方案是用博弈论描述智能体之间的对抗与合作用模糊强化学习在不知道系统精确动力学的前提下在线逼近最优控制律最终让高阶非线性系统实现分布式最优二分包含控制。适合正在做多智能体仿真、准备写论文或做算法对比的研究生与工程师尤其适合被“非线性、高阶、最优”三个词同时卡住的项目。2. 为什么要用博弈论和模糊强化学习二分包含控制的数学底座2.1 从包含控制到二分包含符号图、结构平衡与收敛区间先说普通包含控制。假设有 m 个领导者和 n 个跟随者跟随者之间以及与领导者之间通过通信拓扑交换状态控制目标是让每个跟随者的状态最终进入领导者状态构成的凸包 co(H) 内。这个定义很直观但隐含一个前提所有交互都是合作的邻接矩阵元素 a_ij ≥ 0。二分包含控制打破了这个前提。拓扑变成符号图a_ij 可以取正也可以取负。正边代表合作关系负边代表对抗关系。此时如果直接套用普通包含控制协议跟随者会被正、负方向的力拉扯。要让问题有意义必须加一个结构条件符号图是结构平衡的也就是对任意三个节点 i、j、k有 sign(a_ij)·sign(a_jk) sign(a_ik)。结构平衡保证可以把节点分成两个阵营阵营内部是合作关系阵营之间是竞争关系。在这个条件下收敛目标变成跟随者 xi 最终满足min(co(H)) ≤ xi ≤ max(co(H))也就是落在一组正凸包和它的相反数负凸包之间。直观理解是正阵营的领导者把你拉向某一侧负阵营的领导者把你拉向另一侧你最后停在两个阵营的平衡区间里。这也是“二分”这个词的来源——解不再是单一凸包而是符号对称的两个凸包之间的区域。这里要提醒一句结构平衡不是可选的是必要前提。你可以在下一步构造符号图时多花一秒钟做校验否则后面所有仿真曲线都会出现“部分跟随者跑出凸包”的诡异现象而问题根本不在控制器。2.2 把分布式最优控制写成一个微分博弈HJI 方程与鞍点解普通最优控制只解决“一个人怎么走最优”。但在二分包含控制里跟随者同时面对合作邻居的拉拢和对抗邻居的排斥本质上是多方利益冲突。用博弈论来建模比单纯最小化一个全局代价函数更贴切。常见的建模方式是把每个跟随者 i 与一个外部干扰 ωi 构成二人零和微分博弈。跟随者想最小化自己与领导者阵营之间的误差代价干扰想最大化这个代价。定义局部代价函数Ji ∫ ( ei^T Q ei ui^T R ui - γ² ωi^T ωi ) dt其中 ei 是分布式包含误差Q、R 是正定权重γ 是干扰抑制系数。这个积分形式里γ²ωᵀω 带的负号表示干扰在帮倒忙时也要付出代价所以博弈双方都有约束。对每个智能体来说它不需要知道全局信息只需要用邻居状态算出的 ei 来构造自己的博弈。于是问题从“全局最优控制”降级为“局部博弈最优”这就是分布式最优控制的关键一步。对应的最优值函数 Vi(ei) 满足 Hamilton-Jacobi-IsaacsHJI方程0 min_ui max_ωi { ei^T Q ei ui^T R ui - γ² ωi^T ωi ∇Viᵀ ( Fi Gi ui Di ωi ) }这个方程的非线性很强而且 Fi、Gi 里带着未知的非线性动力学。解析解基本不存在所以标题里的模糊强化学习才登场——它用来在未知 Fi 的情况下在线逼近 ∇Vi 和最优策略 ui。需要格外注意的是 HJI 方程的解不是唯一的最小值而是一个鞍点控制策略 ui 在最小化干扰 ωi 在最大化。后面做强化学习时如果更新律只朝最小值方向走、完全不考虑干扰的存在最终得到的不是博弈意义上的最优只是普通最优控制的近似。2.3 模糊系统逼近与强化学习在线求解为什么不用传统自适应非线性项 fi(x) 未知时传统做法是自适应反步法先假设 fi 可以线性参数化为 φᵀθ再用参数估计器在线辨识 θ。这个路子对模型结构要求很高而且高阶系统反步推导里虚拟控制律的导数会让代数爆炸代码里全是手工展开的项改一个系统就要重推一遍。模糊强化学习的思路完全不同。模糊逻辑系统FLS被当作万能逼近器用一组高斯隶属函数构造模糊基函数 φ(x)然后用 φ(x) 的线性组合逼近未知函数或值函数。对控制工程师来说模糊基函数可以理解成一组固定的非线性特征映射不需要知道 fi 的具体形式只需要知道状态 x 的范围来设计隶属函数中心和宽度。强化学习部分负责在线调整逼近器的权重。评价网络critic逼近值函数 Vi执行网络actor逼近最优控制 ui。通过策略迭代让贝尔曼残差收敛到零就等价于求解了 HJI 方程的鞍点解。整个过程不需要系统模型参与只需要测量状态、计算包含误差、给控制输入再根据反馈更新权重。这正是标题把三个词串起来的逻辑博弈论提供目标函数和解的概念模糊系统提供未知函数的逼近能力强化学习提供不依赖模型的在线求解框架。三者少一个这个问题要么无法建模成最优控制要么无法对非线性系统实施要么无法在线实现。3. 模糊强化学习算法设计评价网络、执行网络与更新律3.1 值函数定义与贝尔曼残差分布式误差作为强化学习状态强化学习要能落地第一步是定义状态、动作和奖励。状态不能直接取全体智能体的全局状态否则就丢了“分布式”三个字。我用局部包含误差 ei 作为第 i 个智能体的强化学习状态。ei 的定义是ei Σ a_ij ( xi - sign(a_ij) xj ) Σ b_il ( xi - sign(b_il) xl )其中第一项是邻居跟随者的耦合误差第二项是与领导者的连接b_il 为权重。这里 sign() 函数是二分控制的关键看到对抗邻居时求的是 xi xj也就是往相反方向拉看到合作邻居时求的是 xi - xj。这样 ei 已经包含了符号信息后续所有计算都不需要再关心边的正负。奖励函数取单步代价的相反数r(k) -[ ei^T Q ei ui^T R ui ]值函数定义为折扣累计奖励的期望Vi(ei) Σ_{k0}^∞ γ^k r(k)那么贝尔曼方程就是Vi(ei(k)) r(k) γ Vi(ei(k1))强化学习的目标是让贝尔曼残差 δ(k) r(k) γ Vi(ei(k1)) - Vi(ei(k)) 收敛到零。在批评者-执行者架构里critic 网络负责逼近 Viactor 网络负责根据当前 ei 生成控制 u。整个算法只需要维护两组权重Wc 和 Wa。3.2 模糊基函数构造27 条规则如何覆盖三阶状态空间模糊基函数是整个逼近器的输入特征。以三阶系统为例ei 是 3 维向量每一维对应一个物理量位置误差、速度误差、加速度误差。对每一维设计 3 个高斯隶属函数中心取 -1、0、1宽度取 0.5状态先归一化到 [-1, 1]。组合之后就产生 3 × 3 × 3 27 条模糊规则。每条规则的激活强度是三个一维高斯值的乘积μ_j exp(-‖x1-c1j‖²/(2σ²)) · exp(-‖x2-c2j‖²/(2σ²)) · exp(-‖x3-c3j‖²/(2σ²))最终模糊基函数是归一化后的激活强度φ_j μ_j / Σ_{t1}^{27} μ_t注意分母不能是零。如果你把状态归一化到很窄的区间而隶属函数中心设在 ±2那么某个状态下的所有激活强度都可能接近 0归一化分母趋近 0基函数瞬间变成 NaN。我第一次跑这个方向就在这儿翻过车后面避坑章节会细说。27 这个数字是刻意控制的。如果每一维放 5 个隶属函数125 条规则在主循环里每次都要计算指数函数仿真速度会明显下降而且规则数越多critic 收敛越慢。对论文里的对比仿真27 条规则配合 3 阶系统已经足够逼近值函数。3.3 在线策略迭代流程持续激励噪声与权重更新整个在线算法按下面这个循环执行。每一步都要完成状态获取、误差合成、动作生成、系统更新、critic 更新、actor 更新六个动作根据当前状态 x按 2.1 的公式计算局部包含误差 ei计算模糊基函数 φ(ei)得到 critic 输出 V Wcᵀ φ计算 actor 输出 ui Waᵀ φ叠加探索噪声把 u noise 施加到系统测量下一步状态用贝尔曼残差 δ 更新 Wc用 δ 和 φ 更新 Wacritic 的更新用的是贝尔曼残差的平方最小化Wc ← Wc - αc · δ · φ(ei)actor 的更新目标是让控制往值函数下降最快的方向移动这里我用常见的一段式简化更新Wa ← Wa - αa · φ(ei) · δ · (u / (|u| ε))其中 ε 是避免除零的小常数。这个式子的直观含义是当 δ 为正说明当前动作让值函数偏离预期权重反向更新当 δ 接近零说明逼近已经收敛策略不再显著变化。探索噪声不能一开始就停。完全去掉噪声后系统不再激励贝尔曼残差恒为零权重不再更新整个学习过程会停在某个不算最优的策略上。常用做法是让噪声幅值按指数衰减noise_amp 0.5 · exp(-0.005 · k)初始幅值 0.5仿真 1000 步后衰减到接近 0.003。这样前期充分探索后期稳定收敛。持续激励是强化学习在多智能体仿真里最容易忽略的一环后面避坑章节我会专门讲它失效时的表现。4. 高阶系统分布式最优控制的 MATLAB 实现可直接改跑的代码骨架4.1 生成符号拓扑结构平衡邻接矩阵与领导者设置仿真从拓扑生成开始。我习惯把跟随者数量设为 4领导者设为 2其中一个领导者带正权重另一个带负权重对应二分包含控制里“两个阵营的领导者”。下面这段 MATLAB 代码生成一个结构平衡的符号图% 4个跟随者2个领导者 % 邻接矩阵符号图1/-1/0 分别代表合作、对抗、无连接 A [ 0 -1 1 0; -1 0 0 1; 1 0 0 -1; 0 1 -1 0]; % 领导者连接矩阵第1列是正阵营领导者第2列是负阵营领导者 B zeros(4, 2); B(1, 1) 1; % 跟随者1 收到正领导者信息 B(4, 2) -1; % 跟随者4 收到负领导者信息带符号 % 符号拉普拉斯度数取绝对值防止负度出现 D diag(sum(abs(A), 2)); L D - A;这段代码的关键是 L 的构造。普通图里拉普拉斯是度数矩阵减邻接矩阵但符号图里如果直接用 sum(A) 算度数对抗边会贡献负度数导致拉普拉斯矩阵失去半正定性。改成 sum(abs(A)) 后L 才能保证每行和为零这也是结构平衡符号图能收敛的底层原因。构造完 L 之后建议顺手检查一下 L 的秩不为 n-1 就说明符号图不满足连通条件后续仿真必然部分智能体失控。4.2 模糊基函数与分布式包含误差的计算函数主循环之前先封装两个函数一个算模糊基函数一个算分布式包含误差。前者是 3.2 节公式的直接实现function phi fuzzyBasis(e, centers, sigma) % e: 3x1 状态误差向量 % centers: 3x3 每维对应 [-1 0 1] 三个中心 % 输出: 27x1 归一化模糊基函数 nDim 3; m 3; nRule m^nDim; mu ones(1, nRule); idx 1; for i 1:m for j 1:m for k 1:m mu(idx) exp(-(e(1)-centers(1,i))^2/(2*sigma^2)) ... * exp(-(e(2)-centers(2,j))^2/(2*sigma^2)) ... * exp(-(e(3)-centers(3,k))^2/(2*sigma^2)); idx idx 1; end end end phi mu / (sum(mu) 1e-6); end这里在分母里加了 1e-6防止所有激活强度同时趋近零时出现除零异常。这是模糊基函数实现里成本最低、收益最高的一个保护。接下来是局部分包含误差。注意符号图的 sign() 已经在计算里显式出现function e distributedError(x, leaders, A, B, nFollower) % x: 所有智能体状态拼接矩阵列对应智能体 % leaders: 2个领导者的状态 % 返回: 每个跟随者的局部误差3xnFollower e zeros(3, nFollower); for i 1:nFollower e(:, i) 0; for j 1:nFollower if A(i, j) ~ 0 e(:, i) e(:, i) abs(A(i,j)) * (x(:, i) - sign(A(i,j)) * x(:, j)); end end % 领导者连接 for l 1:size(leaders, 2) if B(i, l) ~ 0 e(:, i) e(:, i) abs(B(i,l)) * (x(:, i) - sign(B(i,l)) * leaders(:, l)); end end end end这段代码里abs() 取权重大小、sign() 决定“拉向自己”还是“拉向反向”两者组合正好对应二分包含控制里“模值进入凸包、符号决定阵营”的语义。4.3 主仿真循环状态更新、actor-critic 更新与探索噪声控制器主体是三层结构分布式误差 → 模糊基函数 → actor 生成控制。主循环如下% 初始化系统状态与权重 x randn(3, 4) * 0.1; % 跟随者三阶状态初值小随机 leaders [0.5*ones(1, 2); 0*ones(1, 2); 0*ones(1, 2)]; % 正负阵营领导者 Wc randn(27, 1) * 0.1; % critic 权重 Wa randn(27, 1) * 0.1; % actor 权重 alpha_c 0.05; alpha_a 0.01; % actor-critic 学习率 gamma 0.95; % 折扣因子 dt 0.01; T 2000; % 仿真步长与步数 noiseAmp0 0.5; tau 200; % 探索噪声初始幅值与衰减时间常数 Q eye(3); R 0.1; % 代价权重 for k 1:T % 1) 分布式误差 e distributedError(x, leaders, A, B, 4); % 2) 模糊基函数 phi zeros(27, 4); for i 1:4 phi(:, i) fuzzyBasis(e(:, i), centers, 0.5); end % 3) 控制输入 u Wa * phi; % 1x4 % 4) 探索噪声指数衰减 noise noiseAmp0 * exp(-k / tau) * randn(1, 4); u u noise; % 5) 三阶积分器链状态更新x1x2, x2x3, x3u for i 1:4 x(1, i) x(1, i) dt * x(2, i); x(2, i) x(2, i) dt * x(3, i); x(3, i) x(3, i) dt * (u(i) 0.1 * sin(x(1, i)) 0.05 * randn()); end % 6) critic 更新计算贝尔曼残差 e_next distributedError(x, leaders, A, B, 4); phi_next zeros(27, 4); for i 1:4 phi_next(:, i) fuzzyBasis(e_next(:, i), centers, 0.5); end for i 1:4 reward - (e(:, i) * Q * e(:, i) R * u(i)^2); V_now Wc * phi(:, i); V_next Wc * phi_next(:, i); delta reward gamma * V_next - V_now; Wc Wc alpha_c * delta * phi(:, i); Wa Wa alpha_a * phi(:, i) * delta * u(i) / (abs(u(i)) 1e-3); end % 记录误差范数用于后处理 errHist(k) mean(vecnorm(e, 2, 1)); end主循环里的系统动力学被刻意写成了三阶积分器链加一个 sin 扰动项。sin 项就是未知非线性 fi代码里你不需要知道它的精确形式只需要知道它会真实作用在系统上模糊强化学习会在逼近过程中把它“吸收”进值函数里。如果你想换其他非线性直接改这一行即可控制器主体不用动。4.4 三个必调参数的经验范围这段代码能跑通但能不能收敛取决于参数。我整理了自己常用的参数范围和失效表现参数常用范围作用失效表现critic 学习率 αc0.05 ~ 0.1值函数收敛速度太大振荡、太小收敛慢actor 学习率 αa0.005 ~ 0.02策略更新速度太大系统发散太小策略不更新探索噪声初始幅值 noiseAmp00.3 ~ 1.0持续激励强度太小落入平凡解太大干扰收敛折扣因子 γ0.9 ~ 0.99未来代价权重太小只看眼前最优性不足一个经验法则αa 永远比 αc 小一个数量级。critic 更新得快一点没关系actor 更新太快会让控制输入剧烈变化系统动力学在噪声和策略之间来回弹最终连误差范数都画不出平滑下降的曲线。5. 跑仿真最容易翻车的五个现场二分包含控制避坑记录5.1 一跑就 NaN梯度爆炸还是模糊基函数分母为零现象第二章的主循环运行 50 步以后状态直接出现 NaN误差曲线断崖式消失。原因分两种。第一种是模糊基函数分母接近零我 4.2 节里加了 1e-6 保护后基本能挡掉第二种更常见——学习率过大Wc 或 Wa 在几个大误差样本上被反复加大权重快速膨胀下一次前向传播的输出直接爆掉。解决先把 αc 和 αa 同时缩小 10 倍确认不出现 NaN 后再慢慢放大。另外给权重加一个裁剪每次更新后执行Wc max(min(Wc, 10), -10)防止单步灾难性更新。这个裁剪不影响收敛只负责兜底。5.2 状态全员收敛到零探索噪声失效导致平凡解现象跟随者的状态没有进入领导者凸包的“二分区间”而是全部归零误差范数曲线一路降到零看起来很“完美”但三条状态曲线全部贴合零线。原因这是二分包含控制最容易骗过眼睛的失败模式。探索噪声衰减过快或初始幅值太小系统在早期没有得到足够激励actor 的权重一直停在初始小随机数附近输出的控制输入接近零。非线性系统被一个近零控制推着走自然呈现出“全零收敛”。解决把噪声初始幅值提高到 0.8时间常数 tau 增大到 500让噪声至少覆盖前 1500 步。观察误差范数曲线如果在 200 步内就光滑归零基本可以判断是平凡解而不是真收敛。5.3 控制输入高频抖振符号突变与噪声没有解耦现象控制输入曲线在收敛后仍然像锯齿一样剧烈震荡但系统状态已经进入凸包区间误差范数不再变化。原因这里不是抖振控制里的符号函数问题而是探索噪声在后期仍然存在且没有和策略解耦。噪声幅值虽然指数衰减但如果衰减时间常数太大后期可能仍有 0.1 量级的扰动叠加在控制输入上反映在 u 的曲线里就是高频锯齿。解决把噪声衰减公式改成两段式前 60% 步数为探索阶段后 40% 步数噪声直接置零。这样做的代价是收敛后策略不再自适应但好处是控制曲线干净论文图好看且不影响最终验证。5.4 运行速度越来越慢模糊规则数组合爆炸现象系统维度从 2 阶升到 3 阶时单步仿真时间增加了一个数量级2000 步要跑十几分钟。原因模糊基函数的规则数是按状态维度指数增长的。3 个状态、每维 3 个中心是 27 条规则4 个状态就变成 81 条5 个状态变成 243 条。主循环里每个规则要算一次高斯函数还要做归一化计算量直接爆炸。解决对高阶系统不要对全部状态直接构造模糊基函数。常见的做法是先对状态做降维只把包含误差 ei 中的前两个主要分量通常是位置误差和速度误差送入模糊系统高阶项由动力学积分器自然处理。规则数保持在 9 ~ 27 之间仿真速度立刻回到正常水平。5.5 结果和“二分包含”对不上符号图不是结构平衡的现象部分跟随者状态明显停留在凸包一侧另一部分在仿真时间内始终没有进入两个领导者之间的区间看上去像是控制器没调好。原因符号图不满足结构平衡条件。我 2.1 节里强调过结构平衡是二分包含控制适定的前提。如果拓扑中存在三个节点构成的环环上符号乘积是负的那么整个图被分成两个阵营的假设不成立控制协议里的 sign() 作用会自相矛盾部分智能体永远在互相拉扯。解决在生成邻接矩阵后显式校验结构平衡对每个三角环检查 sign(a_ij)·sign(a_jk)·sign(a_ki) 是否为 1。更简单的做法是直接用“二分图构造法”先给每个节点手工指定阵营 1 或 -1边符号等于两个节点阵营号的乘积。这样生成的符号图天然结构平衡不会再出现这个坑。6. 验证控制器做得好不好三个指标与一个参数整定顺序仿真能跑只是第一步要让别人信服你的控制器真的实现了“分布式最优二分包含控制”至少需要三个量化指标。第一个是包含误差范数errHist 曲线要下降到领导者凸包边界之内并且长期保持在区间内不能只下降一瞬间又逃逸出去。第二个是能量消耗在相同初值和相同拓扑下把你的模糊强化学习控制器和普通包含控制协议对比统计 Σ uᵀRu如果最优控制器的累计代价没有更低那“最优”两个字站不住脚。第三个是阵营一致性把每个跟随者的最终状态除以符号阵营标记看它们是否各自聚到对应阵营领导者的邻域验证二分性质确实生效而不只是凸包收敛。参数整定顺序我踩过很多次坑后固定成一套先固定 critic 学习率 0.05、折扣因子 0.95只调探索噪声初始幅值直到误差范数曲线能稳定下降且不归零然后固定噪声参数调 actor 学习率从 0.005 起步看控制曲线是否平滑最后再回来微调 γ 和噪声衰减时间常数。这个顺序的逻辑是先保证“能学”再保证“学得好”最后再优化“最优性”。我自己的教训是永远不要在第一次仿真时就追求最优参数。先把系统跑崩一次看它往哪个方向崩再去调参反而比一上来就套一组论文参数更省时间。这篇笔记里的代码骨架和参数范围足够你在三天内把第一个完整结果跑出来剩下的就是按照自己的系统去校准了。希望帮到你。本文还有配套的精品资源点击获取
返回列表