资讯动态

基于ε-纳什均衡的航天器末端追逃博弈仿真与理论分析

发布时间:2026/10/17 3:21:29 来源:尧图企业网站定制
最近在整理追逃博弈相关的复现笔记翻手里的项目记录时这篇“基于 ε- 纳什均衡的航天器末端追逃博弈仿真与理论分析”被我从一堆材料里单独挑出来写原因是它把微分博弈、数值优化和均衡理论三个方向压在了同一个小项目里。标题里的“ε- 纳什均衡”比普通纳什均衡多了一个小尾巴但处理起来的复杂度完全是另一个量级它意味着在无法求精确闭环鞍点的前提下还要给出一个可量化的近似平衡解并且用 Matlab 把整条链路完整跑通。这篇文章按我复现时的真实顺序来写。先讲末端追逃博弈为什么需要 ε- 纳什均衡再交代动力学模型、收益函数和控制策略的设定然后重点展开我最终采用的求解框架交替最优响应生成策略池在策略池上构造零和支付矩阵求混合纳什均衡最后用偏离检验量化 ε。后面是 Matlab 代码的模块拆解和参数配置以及结果分析和几个我印象深刻的坑。适合正在做追逃博弈、微分博弈、多智能体对策或者跟博弈沾边的最优控制仿真的读者新手也能从里面找到可以直接照抄的部分。1. 末端追逃博弈为什么需要 ε- 纳什均衡1.1 末端追逃的博弈结构两个玩家、一个终端时刻航天器末端追逃博弈的问题可以这样描述一个追踪器要在给定或未给定的终端时刻内把某个脱靶量指标压到最小一个逃逸器要做的事情刚好相反它要让追踪器尽量达不到目标。这种问题最容易想到的做法是给追踪器单独设计一条最优控制律让它在某一性能指标下逼近目标。但单边最优控制忽略了一个关键事实双方的控制输入同时进入同一个状态方程你在设计自己的最优策略时对方的策略也在变。这种强耦合特性决定它本质上是一个微分博弈问题不是两个独立最优控制问题的叠加。在我复现的设定里博弈有两个玩家、一个固定的终端时刻 T、一组状态方程和双方的收益函数。双方在博弈开始时都能获得对方的初始状态并且能观测对方的控制方向信息结构是对称的。这种对称信息设定让问题可以往闭环鞍点的方向分析也为后面数值求解提供了方便。末端场景和全轨道博弈的区别在于双方关注的窗口很短状态空间被限制在追踪器和逃逸器邻近区域所以模型可以大幅简化而不必处理整个轨道面的复杂约束。把问题写成博弈之后理论上最漂亮的解法是求解哈密顿-雅可比-艾萨克斯HJI方程方程的解给出双方的最优反馈策略。但 HJI 方程是一个带边界条件的偏微分方程状态维度稍微上去数值求解就非常困难。工程里更常见的做法是把它离散化、参数化然后用数值迭代求一个近似均衡。而“近似”到什么程度、怎么度量这就引出了 ε- 纳什均衡。1.2 精确纳什均衡的求解瓶颈与 ε 松弛的实际含义精确纳什均衡的定义大家都熟悉没有任何一个玩家能通过单方面改变自己的策略来严格提高收益。在有限矩阵博弈里混合策略纳什均衡的存在性有经典定理保证。但换成连续状态、连续控制的微分博弈事情就复杂得多均衡的存在性、唯一性都要看具体模型更不要说数值求解。退一步说就算理论上存在精确鞍点数值方法也很难恰好找到它。数值解到处都有离散误差、收敛误差直接说“我找到了精确纳什均衡”在数学上站不住脚。ε- 纳什均衡正好填补这个空缺它对每个玩家的单方面偏离设定一个收益增量上限 ε只要偏离收益不超过 ε就可以把当前策略对当作可用的近似均衡。我在复现时对 ε 的理解是它是从理论解到数值解之间那道测量尺。模型简化误差、控制离散误差、优化不完全收敛都会贡献到 ε 里。与其纠结求一个理论上的严格鞍点不如把精力放在怎么把 ε 压到可接受的范围并且让这个过程可复现、可检验。这也是标题里特意写“ε- 纳什均衡”而不是泛泛写“纳什均衡”的原因——后者是一个声明的目标前者是一个可计算、可验证的工程判据。后面我采用的算法本质上就是在不断压低 ε 的同时给出一个双方都认可的混合策略。2. 动力学模型与收益函数的设定一切仿真的地基2.1 相对运动方程与状态归一化仿真要从模型开始模型选型直接决定后续算法的复杂度和结果的物理意义。我采用的是二维平面内的相对运动模型状态向量取 $x[r_x, r_y, v_x, v_y]^T$$r$ 是追踪器相对逃逸器的位置矢量$v$ 是相对速度。控制输入为追踪器推力加速度 $a_p$ 和逃逸器推力加速度 $a_e$都受幅值上限约束。这个约束对应航天器推进系统的实际限制也是博弈中双方机动能力差异的主要来源。相对运动方程在近圆轨道假设下可以写成状态空间形式 $\dot{x} A x B_p a_p B_e a_e$其中状态矩阵 $A$ 由轨道角速度决定具体形式对应经典的 Clohessy-Wiltshire 方程。之所以敢用线性化模型是因为末端博弈窗口短、相对距离变化有限非线性效应被控制在较小范围。直接把完整轨道摄动模型丢给后面的迭代求解器计算代价会高出一个量级而收益精度并不会有本质提升。这个取舍在复现类项目里非常重要先跑通主线需要时再逐步加复杂度。虽然用的是线性模型我还是保留了状态归一化这一步。把所有长度量纲按参考距离 $L_{ref}$ 缩放速度按 $L_{ref}/T$ 缩放这样状态矩阵和收益函数的数值都落在合适区间避免后续优化算法在病态尺度上挣扎。很多初学者忽略这一步结果就是同样的代码在不同机器上跑出完全不同的收敛行为。2.2 收益函数、推力约束与零和假设收益函数是追逃博弈里最需要谨慎的地方因为它直接定义了双方在博弈里到底在争什么。我采用的收益函数由两部分组成终端脱靶量和路径控制能量。表达式可以写成$$ J \frac{|r(T)|^2}{L_{ref}^2} \int_0^T \left( \alpha_p |a_p(t)|^2 - \alpha_e |a_e(t)|^2 \right) \frac{dt}{E_{ref}} $$追踪者要最小化 $J$逃逸者要最大化 $J$也就是双方在一个纯竞争的目标上博弈收益之和为零所以叫零和博弈。控制能量项前面一正一负物理意义很直接逃逸者烧燃料是想让脱靶量变大追踪者烧燃料是想让脱靶量变小谁的代价权重更高均衡走势就会偏向另一方。推力约束我用了最简单的幅值形式$|a_p| \le a_{p,max}$$|a_e| \le a_{e,max}$。实际代码里每一段的推力幅值取满油门只有方向是变量。这样策略空间就退化成方向角序列物理上对应末端博弈双方都愿意全力机动换取收益的场景。不做推力大小控制主要是为了简化策略搜索先把博弈交互的主干跑通。一个极其容易翻车的地方是收益函数的量纲。脱靶量的量纲是米或千米控制能量积分的量纲是 $(m/s^2)^2 \cdot s$直接相加会让某一项完全主导收益函数。我在第一阶段就吃了这个亏后面专门有一节讲。处理办法是把脱靶量除以 $L_{ref}^2$控制能量除以参考能量值让两项在数值上处于同一量级再通过系数 $\alpha$ 调节实际权重。2.3 控制策略的表示方式微分博弈里策略理论上是一个从状态到控制的映射也就是反馈策略。但数值实现里直接表示一个任意反馈函数非常困难。我采用了最接近工程实践的做法把控制策略表示成与时间相关的有限参数序列。具体来说把 $[0,T]$ 分成 $N_t$ 段每一段内推力方向保持恒定相当于零阶保持。于是每个玩家的策略就是一个长度为 $N_t$ 的方向角序列 $(\theta_1, \dots, \theta_{N_t})$。整个策略空间从无限维连续函数空间降成了有限维参数空间可以被常规优化算法搜索。初始状态是唯一的给定双方的完整方向角序列后整条轨迹就可以通过数值积分确定收益也就可以唯一计算。有人可能会问为什么不用神经网络做反馈策略。我在前期对比过神经网络策略虽然更接近闭环但每次收益评估都要跑前向传播训练和最优响应更新的成本很高在 Matlab 里调试也麻烦。参数化方向角序列可解释性强每条策略就是一组随时间变化的机动指令画出来一目了然。严格来说这是开环策略但在信息对称、博弈时间短的末端场景里开环策略已经能保留大部分博弈特征。想要真正闭环可以在得到均衡后加一个扰动反馈补偿这是后话。3. 数值求解算法策略池、最优响应与混合纳什均衡3.1 为什么不能直接在连续策略空间上求均衡如果把连续方向角直接扔给求解器理论上可以做联立最优控制但它给出的一般是开环纳什均衡而且还面临多局部最优。更直接的问题是在连续策略空间上验证“玩家没有单方面偏离动机”需要全局搜索这本身就是一个不可行的问题。如果把方向角离散成 $N_c$ 个候选值每个玩家可能的纯策略数量是 $N_c^{N_t}$。哪怕 $N_t8$、$N_c16$单方策略数也到 $4.3 \times 10^9$ 的量级根本无法构造完整双矩阵博弈。这就是为什么需要策略池方法——与其枚举整个空间不如用迭代过程主动找出那些真正在对抗中起作用的少量纯策略再在这小规模的集合上求均衡。这个思路的来源其实很朴素博弈双方在对抗中最关心的不是全部可能动作而是对方可能打过来的关键动作。策略池就是把这种“关键动作”捕捉下来的容器。后续的偏离检验再负责回答“池子外面的动作会不会带来更大收益”这样就形成了一个由内到外都站得住的求解闭环。3.2 交替最优响应生成策略池我的策略池生成算法是一个交替迭代过程每一轮都让一个玩家针对对手的当前混合策略做最优响应。流程是这样的初始化逃逸者的混合策略比如在随机生成的几个策略上均匀分布。固定逃逸者的混合策略在追踪者的策略空间里搜索期望收益最小的最优响应把找到的纯策略加入策略池。固定追踪者的混合策略在逃逸者的策略空间里搜索期望收益最大的最优响应把找到的纯策略加入策略池。重复第 2、3 步直到新的最优响应已经出现在策略池里或者带来的收益改进小于阈值。这里“期望收益”是指对对手混合策略中所有纯策略做概率加权的平均收益。追踪者的目标函数是 $\min_{\theta_p} E_{\theta_e \sim \sigma_e}[J(\theta_p, \theta_e)]$逃逸者的目标函数是 $\max_{\theta_e} E_{\theta_p \sim \sigma_p}[J(\theta_p, \theta_e)]$。我在代码里专门写了一个函数处理这个后面会贴出来。最优响应的搜索需要在连续参数空间里做优化我用的组合是粗网格加局部模式搜索。粗网格负责把搜索空间均匀扫一遍锁定有希望的区域局部搜索负责在最优格子附近精化方向角序列。因为每轮最优响应只要求“比当前策略好”而不是非要做全局最优所以即使局部搜索找到的不是全局最优只要它能改进收益迭代就能继续推进。多次迭代后策略池会自然地积累出双方互相针对的高价值策略。3.3 在策略池上线性规划求混合纳什均衡策略池稳定之后把池内双方纯策略两两组合做轨迹仿真可以得到一个零和支付矩阵。设追踪者是行玩家、逃逸者是列玩家$A$ 就是追踪者的收益矩阵$A_{ij}$ 表示追踪者使用策略 $i$、逃逸者使用策略 $j$ 时追踪者的收益逃逸者对应收益就是 $-A_{ij}$。在零和博弈里求混合纳什均衡可以转为线性规划。追踪者的目标是选择一个概率分布 $p$最小化在最坏情况下的期望收益即$$ \min_{p, v} ; v \quad \text{s.t.} ; A^T p \le v \mathbf{1}, ; \sum_i p_i 1, ; p \ge 0 $$约束的含义是无论逃逸者选择哪个纯策略追踪者的期望收益都不超过 $v$追踪者要最小化这个上界。对偶问题里同时能得到逃逸者的均衡策略 $q$。这个线性规划规模很小用 Matlab 的linprog函数几毫秒就能解完。求解前要对支付矩阵做一步很关键的处理数值归一化。如果 $A$ 的元素量级差异很大linprog的数值稳定性会变差。我的做法是先把 $A$ 整体减去某个基准值比如所有元素的均值求解完成后再把目标值加上基准值。这样变换不会改变均衡策略本身但显著改善了求解器的表现。跑参数扫描时这个细节能避免很多莫名其妙的报错。3.4 ε值的量化估计均衡解算出来之后必须回答一个问题它在多大程度上是 ε- 纳什均衡我的估计分两层。第一层是池内偏离检验。对均衡混合策略下的每个玩家遍历策略池里所有纯策略计算单方面切换到某个纯策略后收益的最大增量两个玩家各自的最大增量取大者就是关于“受限策略空间”的 ε。这个数字通常很小但不能直接当最终 ε因为它没有覆盖池外策略。第二层是池外偏离检验。在完整策略空间里随机采样一批纯策略比如几百个对每个采样策略计算它相对当前混合均衡的偏离收益取最大增量作为池外 ε。最终估计 ε 取两者较大值。严格来说随机采样只能给出 ε 的一个统计下界不等于严格的数学上界但工程上这个量已经足够判断当前解是否落在可接受的近似范围内。ε 估计是整个算法的验收环节没有这一步前面所有迭代都只是“看起来收敛”。我后来做参数扫描时全靠这个 ε 指标来判断不同 $N_t$、不同策略池容量下结果是否可靠这就是量化判据带来的好处。4. Matlab 代码怎么搭模块拆解与核心函数实现4.1 顶层主循环从参数配置到结果输出代码组织我分成三层参数配置层、仿真核心层、均衡求解层。顶层主脚本按顺序做六件事加载参数、初始化策略池、循环更新策略池、构造支付矩阵、线性规划求混合均衡、偏离检验估计 ε 并绘图。我习惯把所有参数收进一个结构体params不散落在脚本各处。追逃博弈涉及的参数太多推力上限、终端时刻、离散段数、收益权重、参考尺度、迭代次数任何一个改漏了都可能导致结果完全不同。集中管理之后参数扫描只需要改结构体字段跑完一轮再改下一轮不容易出错。主循环的框架如下params load_params(); pool_p init_pool(params, pursuer); pool_e init_pool(params, evader); mixed_p uniform_mixed(pool_p); mixed_e uniform_mixed(pool_e); for iter 1:params.max_iter [best_p, gain_p] best_response(pursuer, mixed_e, params); if gain_p params.gain_tol pool_p add_strategy(pool_p, best_p); end [best_e, gain_e] best_response(evader, mixed_p, params); if gain_e params.gain_tol pool_e add_strategy(pool_e, best_e); end mixed_p equilibrium_on_pool(pool_p, pool_e, params, pursuer); mixed_e equilibrium_on_pool(pool_p, pool_e, params, evader); if check_stopping_criteria(pool_p, pool_e, mixed_p, mixed_e, params) break; end end每轮结束都在当前策略池上重新解一次混合均衡用来指导下一轮最优响应避免最优响应始终追着一个过时的混合策略跑。收敛条件我同时看两项本轮是否有新策略加入以及池内 ε 是否小于阈值。两个条件都稳定了才退出防止只拿单一指标判断造成误收敛。4.2 轨迹传播与收益评估函数轨迹传播是整个仿真的底层核心。给定双方的方向角序列和初始状态从 0 积分到 T返回终端状态和控制能量function [xT, control_cost] propagate_trajectory(x0, theta_p, theta_e, params) Nt params.Nt; dt params.T / Nt; x x0; control_cost 0.0; for k 1:Nt ap params.a_p_max * [cos(theta_p(k)); sin(theta_p(k))]; ae params.a_e_max * [cos(theta_e(k)); sin(theta_e(k))]; xdot params.A * x params.B_p * ap params.B_e * ae; x x xdot * dt; control_cost control_cost ... (params.alpha_p * norm(ap)^2 - params.alpha_e * norm(ae)^2) * dt; end xT x; end这里我用显式欧拉而不是ode45原因只有一个速度和可重复性。策略搜索阶段要评估成千上万次收益ode45开销太大而且变步长会给收益带来微小噪声让优化器误判方向。显式欧拉配合足够小的步长策略排序的准确性完全够用。最终展示阶段可以再用高精积分器重新仿真验证。收益函数就是基于轨迹传播的一层包装function J compute_payoff(theta_p, theta_e, params) x0 params.x0; [xT, cost] propagate_trajectory(x0, theta_p, theta_e, params); miss xT(1)^2 xT(2)^2; J miss / params.L_ref^2 cost / params.energy_ref; end看这个函数就知道量纲归一化有多重要。如果不除L_ref^2和energy_refmiss 的数值会把 cost 完全淹没后面所有博弈结论都会偏掉。4.3 最优响应求解的工程化写法期望收益函数是最优响应求解和 ε 检验共用的基础模块。输入对手的混合策略和己方某个纯策略返回期望收益function avgJ expected_payoff_mixed(mixed_opp, own_theta, params, player) probs mixed_opp.probs; thetas mixed_opp.thetas; avgJ 0.0; for i 1:length(probs) if player 1 % pursuer minimizes avgJ avgJ probs(i) * compute_payoff(own_theta, thetas{i}, params); else % evader maximizes avgJ avgJ probs(i) * compute_payoff(thetas{i}, own_theta, params); end end end外层优化直接用 Matlab 的patternsearch比较省事目标函数把方向角序列投影到 $[0, 2\pi)$ 区间。一个提速关键策略搜索阶段大量重复评估同一对纯策略我做了个收益缓存表以双方策略的整数索引为键算过一次就存起来。这个缓存把总计算时间降了大约七成尤其在偏离检验随机采样几百个策略时收益非常明显。提示策略池里的策略在加入前要做一次去重。直接用轨迹收益的差值判重不靠谱建议给每个方向角序列计算哈希或者分配整数索引列表里去重后再作为缓存键值。这是缓存方案能提速的前提也是避免策略池膨胀的关键。4.4 一组实测有效的参数配置下面这组参数在我复现时效果不错可以直接抄去当起点。换成别的场景后记得先扫参数区间。参数数值说明终端时刻 T20 s给双方留出有效机动窗口初始相对位置[500, 300] m追踪器相对逃逸器有侧向偏差初始相对速度[-15, 5] m/s有一定相对接近速度追踪器推力上限 $a_{p,max}$2.0 m/s²机动能力稍弱于逃逸器逃逸器推力上限 $a_{e,max}$2.2 m/s²制造不完全占优的对抗时间离散段数 $N_t$12精度和计算量折中方向角离散数 $N_c$24粗搜索用的候选方向参考距离 $L_{ref}$1000 m脱靶量归一化基准参考能量 $E_{ref}$20控制能量归一化基准收益权重 $\alpha_p, \alpha_e$0.02控制能量在收益中占比策略池容量上限各 60平衡计算量和覆盖面池外采样数300偏离检验样本数这里特意让逃逸器推力略大是为了制造一个双方都不完全占优的对抗场景。如果逃逸器推力明显小最优响应会变成直线逃逸博弈没有悬念如果追踪器推力太大追踪器可以一杆子压到底同样没意思。好的仿真参数应该让均衡出现在“双方都有牌可打”的位置。5. 仿真结果轨迹形态、策略演化与 ε 收敛5.1 典型末端博弈轨迹的形态观察把均衡混合策略按概率加权再把双方主要的纯策略轨迹画出来可以看到很典型的追逃形态。追踪者不会从一开始就朝逃逸器当前位置直线冲而是先切到侧向占据有利视线角度等到距离接近末端再逐步把脱靶量压小。逃逸者则会在追踪者切入方向的反侧做规避机动末端附近往往还有一次小幅方向反转来应对追踪者的收尾。这个“先侧向、后收尾”的形态在追逃博弈文献里反复出现。当它出现在自己的仿真里基本可以判断模型和求解链路是自洽的。如果轨迹形态完全反直觉比如追踪者全程直线追、逃逸者全程不动那大概率不是算法问题而是收益函数或参数设置把博弈压死了。5.2 混合策略概率的演化与均衡特征我重点看了策略池里概率分布的特征。在零和博弈、双方推力接近的情况下均衡混合策略通常不是均匀分布而是集中在少数几个骨架策略上其余策略概率几乎为零。意思是对抗中真正起作用的只有那么几个典型打法策略池假设是靠谱的。不过有一个现象要注意当策略池里出现大量相似策略只是角度序列略微不同时混合概率会在它们之间抖动看起来像没收敛。我处理的办法是对策略做聚类把相似程度很高的策略合并成类用类内均值代表整个类再去掉冗余策略。聚类之后策略池的稳定性和均衡的解释性都明显变好。5.3 ε 收敛曲线与离散粒度敏感性记录每轮迭代后的池内 ε能得到一条下降曲线。我复现的典型过程是初始候选策略质量差第一轮池内 ε 的值大约在接近 1 的量级归一化收益后面随迭代快速下降十几轮后稳定在 0.03 左右。换算回物理量相当于偏离带来的等效脱靶量增量在几十米量级对末端博弈的工程验证来说可以接受。离散粒度的影响我也做了敏感性测试。$N_t$ 从 8 加到 16 时ε 明显下降但计算时间涨了近一个量级继续往上加ε 下降速度变缓说明主要误差来源已经从时间离散转移到了最优响应的局部收敛上。对于这个场景$N_t$ 取 12 左右是性价比最好的点。这里给其他复现者一个建议不要盲目追求细分先用粗配置找出敏感参数再针对性加密。6. 复现中的坑与解决方案6.1 收益函数量纲不一致导致的假均衡第一次跑出来结果让我很困惑逃逸器几乎不做机动追踪器却一直修正方向。查到最后原因是脱靶量量级在几百米平方后约 $10^5$控制能量项却只有 10 的量级收益几乎就是脱靶量本身控制能量权重形同虚设。这种博弈退化成纯几何追击问题均衡形态当然和理论预期对不上。解决方式就是前面不厌其烦强调的归一化。我建议所有复现者看到“收益函数某项永远主导”时先别怀疑算法回头检查量纲和权重设置。把脱靶量除以 $L_{ref}^2$、控制能量除以 $E_{ref}$ 之后再通过 α 系数手动调节两个目标的实际占比问题立刻消失。6.2 策略池过小会把局部最优误判为均衡有一次迭代到第 15 轮池内偏离检验 ε 已经很小我以为收敛了。结果把策略池容量从 10 直接加到 40 重算ε 马上跳回 0.2 以上。原因很简单池子太小时最优响应搜索没有充分探索到对手可能使用的新策略池内均衡只是在一个很小的候选空间里自洽换到更大的空间就不成立了。这个坑的教训是ε 检验必须和策略池容量联动。做敏感性测试时至少要让池子容量翻一倍再看 ε 是否保持稳定不能只盯着当前池子里的数字。我后来把策略池上限固定在 40 到 60 个再往上增加时 ε 改善有限但计算时间明显上升。6.3 终端时刻与推力上限的匹配问题T 太短或推力上限比例失衡会产生很奇怪的“均衡”。比如 T 取 5 s、逃逸器推力只有追踪器一半时逃逸器的最优响应永远是直线逃逸追踪器也几乎不机动因为无论怎么努力脱靶量都救不回来。这种场景不是算法错了是参数本身把博弈压进了“无解”区域求解器只是在无解区域找到一个唯一解。我的建议是先做一轮参数粗扫找出双方能产生有效对抗的区间。可以扫描 T 和推力比这两个关键量看最后得到的 ε 和轨迹形态是否合理。只有先让博弈“有戏”后面精细求解才有意义。6.4 轨迹积分步长带来的收益噪声变步长积分器在这里是个隐藏麻烦。我开始用ode45评估收益发现同一组策略对在不同次评估中收益会差几个百分点差异全部来自数值积分误差。收益评估带噪声会让优化器和 ε 检验都不稳定甚至出现同一策略反复评估结果忽高忽低的情况。后来统一成固定步长欧拉积分并保证步长足够小后收益曲线立刻变光滑。固定步长精度上吃点亏但对优化来说可重复性更重要。如果坚持要用高精度积分器至少要做一次容差扫描确认收益对积分容差不敏感再放进去用。如果还要继续往下做我最想先做的是把三维相对运动、多个逃逸器这类扩展加进去但那条路已经超出这个项目本身了。眼下这套流程已经把最麻烦的“理论均衡到数值均衡”这段路跑通后面的扩展至少有了一个可以对照的基线。最后再啰嗦一句做完之后一定要留好随机种子和参数版本追逃博弈这类项目跑出一个漂亮结果很容易但要在别人机器上复现同样结果拼的就是这些记录。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑