不完全信息Epsilon纳什均衡在航天器追逃博弈中的Matlab复现与实现要点
这个标题我盯着看了好一会儿说实话第一次看到「不完全信息Epsilon纳什均衡」「航天器末端追逃博弈」「EKF参数估计」这一串词的时候第一反应是这论文得有多绕。但真正动手复现之后我发现它其实是把三个非常经典的问题拧在了一起——追逃博弈的建模、不完全信息下的状态/参数估计、以及近似纳什均衡的数值求解。每一块单拎出来都不算新鲜难点在于怎么把它们塞进一个闭环仿真框架里还能跑出有意义的结果。这篇文章我就从复现者的视角把这个项目从建模到Matlab实现再到调试踩坑的完整链路聊一遍。不保证能让你完全脱离论文源码独立复现毕竟有些细节真的只能靠猜但至少能帮你把标题里那些抽象概念落地成可运行的代码逻辑。1.1 到底是Epsilon均衡还是完全均衡先说说标题里最扎眼的这个概念。纳什均衡在微分博弈里很常见但航天器追逃这种场景你几乎求不出严格的解析均衡。原因很直白状态维度高、控制约束复杂、终端条件非线性再加上不完全信息想要证明某个策略组合满足严格的均衡条件数学上非常苛刻。所以论文采用了一个工程上非常务实的妥协——Epsilon均衡。说白了我不要求策略组合是最优到零误差的均衡我只要求任何一方偏离当前策略所能获得的收益改进不超过一个事先给定的阈值epsilon。这个阈值直接决定了均衡求解的难度epsilon取0.001和取0.1完全是两种计算量级。我在复现时最深的体会是epsilon不是越小越好。取太小数值求解器会无限逼近严格均衡迭代步数爆炸而且对EKF的参数估计误差极敏感取太大策略就失去了博弈意义。论文里给了一个相对折中的建议区间我实际跑下来觉得取0.01到0.05之间比较合理既能保证收敛又不会让策略明显劣化。1.2 不完全信息在追逃场景里指的是什么很多入门玩家第一次听到不完全信息就发怵以为是自己没看懂题目条件。其实在追逃博弈的场景里不完全信息往往体现在几个非常具体的方面追踪器对逃逸器的真实机动能力比如最大可用过载只有一个大致区间估计战斗部或追踪器对目标当前精确位置存在测量噪声不是想当然的全知全能对方是否存在某种隐藏的制导策略切换意图需要通过在线观测去推测。这直接引出了EKF的用武之地——你不是直接去解一个完美的全信息博弈而是先通过滤波把对方的关键参数从噪声观测中抠出来然后用估计出的参数去更新博弈模型再求解epsilon纳什均衡。这就是自适应博弈四个字的核心含义。1.3 复现之前必须想清楚的主线在动手写第一行代码之前我建议你先在纸上画一遍信息流动力学模型 → 观测数据 → EKF参数估计 → 博弈模型更新 → epsilon均衡求解 → 制导指令输出 → 动力学模型闭环。整个项目80%的难度都在这条链路的衔接上单看任何一个模块都不难。2. 末端追逃博弈的数学建模先把状态和控制空间定义清楚2.1 相对运动模型我最终选了哪一版航天器末端追逃本质上是在一个相对运动坐标系里解决问题。我复现时没有直接上复杂的非线性轨道方程而是采用了工程上最常见的相对运动描述状态向量取视线坐标系下或惯性系下的相对位置和相对速度控制量是追踪器/逃逸器的加速度矢量。一个典型的状态表示为x [dx, dy, dvx, dvy] % 二维平面下的相对位置与相对速度 u_t [ax_t, ay_t] % 追踪器控制加速度 u_e [ax_e, ay_e] % 逃逸器控制加速度动力学方程就是标准的双积分器结构叠加控制项dx_dot dvx dvx_dot u_t_x - u_e_x % 若采用相对加速度表示这里有个容易踩的坑论文里的控制量到底是绝对加速度还是相对加速度直接影响后面所有推导。我一开始按绝对加速度建模求解出来轨迹始终差一口气后来发现原文其实是在追踪器的本体坐标系下写的相对形式。这种一字之差在复现期刊代码时极其致命。2.2 支付函数代价函数怎么设定才打得住追逃博弈的支付函数通常围绕终端脱靶量来设计。追踪器的目标是让终端相对距离最小化逃逸器则是最大化这个距离。典型的一种取法是把目标拆成两部分J (r_terminal^2 / R_max^2) (控制能量惩罚项)控制能量惩罚项的权重怎么取直接决定博弈策略是保守拦截还是激进冲撞。我在复现时花了很长时间调这个权重。因为如果惩罚权重太小EKF估计对方参数稍有偏差追踪器就会解出一个过激的机动指令导致燃料剧烈消耗而惩罚权重太大又会让追踪器过于保守末端脱靶量下不去。经验值方面我建议先按控制能量的归一化权重在0.1到1.0之间做几组快速开环仿真看终端脱靶量和燃料消耗的Pareto趋势再定。2.3 策略空间的离散化策略连续博弈在数值上很难直接求解工程上普遍的做法是做策略离散化或参数化。我采用的方法是把追踪器和逃逸器的控制指令都参数化为分段常值或分段线性函数在一个滚动时域窗口内只优化未来N个节点的控制值。N的选取很关键。N太小策略退化成了即时反馈博弈深度不够N太大求解维度爆炸单个步长的计算时间难以接受。我的折中方案是取N5到8配合一个3到5秒的预测时域在精度和实时性之间找到一个比较舒适的平衡点。3. EKF参数估计模块把看不见的对方从噪声里捞出来3.1 为什么用EKF而不是更花哨的滤波器现在做状态估计很多人一上来就上UKF、粒子滤波觉得EKF过时了。但在这个场景里EKF其实是最合适的。首先EKF只要求对非线性函数做一阶泰勒展开计算量小速度快。对于末端追逃这种动辄需要几十赫兹控制频率的场景UKF或粒子滤波的计算负担可能让整个闭环仿真跑不动。我用UKF做过对照实验在同样的观测噪声水平下UKF的估计精度确实比EKF稍好但计算耗时大约是EKF的4到6倍。对于期刊复现级别的仿真EKF的精度完全够用而且更容易收敛。其次是EKF的线性化误差在末端追逃场景里可控。因为当你把时间步长设置得足够小仿真频率100Hz以上相邻两步之间的状态变化很小一阶线性化带来的截断误差不会累积到你无法接受的程度。这是一个典型的够用就好没必要为了炫技引入不确定性更大的滤波框架。3.2 滤波器的状态设计不止估位置还得估参数EKF在项目中的角色非常特殊它不只是估状态更重要的是估对方的动力学参数。我把它设计成了联合估计的形式状态向量变成x_filter [dx, dy, dvx, dvy, a_e_max, tau_e]其中a_e_max代表逃逸器的最大机动能力估计值tau_e代表逃逸器机动响应的时间常数估计值。这两个参数对方不会告诉你只能靠观测数据和运动趋势去反推。测量方程则取自你仿真里定义的传感器模型末端追逃场景通常假设追踪器可以测量相对距离和视线角速率。这里有一个细节测量噪声的方差矩阵R必须跟论文设置的传感器精度一致否则EKF会过度信任观测导致估计值剧烈跳动而R设得太大参数估计又收敛太慢。我在复现时用论文里的传感器噪声参数作为初值再根据调试结果微调了一个数量级。EKF核心更新流程在Matlab里其实就那么几行% 预测 x_pred f(x_est, u_est); P_pred F * P_est * F Q; % 更新 K P_pred * H / (H * P_pred * H R); x_est x_pred K * (z - h(x_pred)); P_est (I - K * H) * P_pred;关键是F和H的雅可比矩阵推导一定要做对尤其是状态向量里包含a_e_max这种不直接出现在动力学方程的参数时很多人在F矩阵里直接填0结果就是参数估计完全不更新。我当时在这个坑上卡了整整两天最后手推了一遍雅可比才定位到问题。3.3 自适应机制到底体现在哪里自适应体现在两个层面。第一层是EKF的参数在线更新——每一拍你都用最新观测去修正对对方的估计这样即使在博弈过程中对方突然改变机动策略你也能在后半段追回来。第二层是博弈模型每拍都拿最新的参数估计值去更新支付函数和控制约束边界而不是一锤子买卖定死一个模型。这才是自适应博弈的完整含义。很多复现者只做到第一层觉得EKF在跑就行了结果博弈策略没有随参数估计变化仿真出来的控制指令看起来像开环这就不对了。4. Epsilon纳什均衡的数值求解与验证4.1 为什么数值求均衡这么难先看均衡的定义。在追逃博弈里一个策略组合(u_t^, u_e^)是纳什均衡意味着给定对方选择u_e^*追踪器的任何其他策略u_t都不能让它得到更优的支付值反过来对逃逸器也一样。在连续策略空间里做这件事数学上等价于求解一个双人最优控制问题的耦合固定点。普通情况下靠动态规划或哈密顿-雅可比-贝尔曼方程去解计算复杂度几乎不可接受。所以论文转向了数值逼近路线把连续博弈离散化成一个有限维的优化问题然后借助迭代求解器去逼近均衡点。4.2 我采用的迭代求解框架我复现时采用的是一个分层迭代的思路每一层都不复杂但合起来能有效逼近epsilon均衡用上一拍保存的策略作为初始猜测固定追踪器策略求解逃逸器的最优反应一个带约束的最优控制子问题固定逃逸器策略求解追踪器的最优反应检查新旧策略的支付差距是否小于epsilon如果满足则判定为epsilon均衡否则更新策略继续迭代。在这个框架下每个子问题用Matlab的fmincon或patternsearch都能解决。但我实测下来fmincon在处理强非线性目标函数时容易陷入局部最优导致两方策略来回振荡。后来我改用了一种更稳的套路先用遗传算法或patternsearch做一个粗略的全局搜索拿到一个不错的初值再用fmincon做局部精修。这个流程虽然多花了一点时间但收敛成功率高很多。4.3 怎么验证你求出来的确实是epsilon均衡这是复现中最容易被忽略的一步。很多同学仿真跑完画一条脱靶量曲线就觉得自己完事了。但论文里明确给出了验证条件建议你也照做J_t(u_t_est, u_e_est) min_{u_t} J_t(u_t, u_e_est) epsilon J_e(u_t_est, u_e_est) min_{u_e} J_e(u_t_est, u_e) epsilon也就是说你要分别固定对方的策略让本方在允许的控制集内做一次独立的支付最小化看看你当前策略的支付值比最优值大多少。这个差值就是实际epsilon。如果你算出来实际epsilon跑到0.5甚至更大那说明你所谓求出的均衡策略根本不成立仿真结论就没有意义。我在项目中专门写了一个verification函数每次迭代结束后调用它把实际epsilon打印出来。跑了大量场景之后发现这个数值通常在0.008到0.04之间波动和设定的阈值基本吻合这才算真正复现出了标题里那个Epsilon的含义。5. Matlab代码实现的关键细节与踩坑实录5.1 代码架构我为什么把项目拆成五个模块期刊复现项目最忌讳的是把所有功能写在一个大main脚本里。我刚着手的时候就是这么干的结果每次调一个参数整段代码重新跑一遍输出十几条曲线根本分不清谁影响谁。后来我重构成了五个独立模块dynamics_model.m相对运动动力学只负责状态推进不关心博弈和滤波ekf_estimator.mEKF联合估计模块输入观测序列输出状态和参数估计值game_solver.mepsilon均衡迭代求解器接收当前估计参数输出双方控制指令simulation_loop.m主循环按固定时间步长依次调用上述模块记录完整仿真数据postprocess_plot.m数据处理与可视化生成相对轨迹、脱靶量曲线、参数估计曲线、实际epsilon曲线。这个结构最大的好处是你可以单独调试任何一个模块。比如你想确认EKF有没有正常工作就把game_solver模块固定成纯比例制导单独跑EKF看参数估计曲线是否收敛到真实值。等滤波没问题了再开启博弈求解器做全闭环。5.2 最容易出错的几个实现细节第一个是坐标系混用。末端追逃博弈里追踪器和逃逸器的状态经常被写在不同坐标系下。你必须在代码里显式标注每个变量所在的坐标系否则一旦把某个量从惯性系直接减到相对系结果就全乱套。我在代码里给变量命名时加了前缀rel_和abs_看起来蠢但非常管用。第二个是时间步长与滤波器更新频率的匹配。我的主仿真频率设到200Hz但EKF不必每拍都做一次更新因为观测频率可能没那么高。如果EKF更新频率和仿真频率不匹配测量噪声协方差就要相应缩放。我最初偷懒直接全用同样的频率导致EKF对高频噪声过度响应参数估计曲线抖得厉害。后来把EKF的更新周期设为仿真周期的5倍效果立刻好转。第三个是控制指令的饱和与约束。论文里可能给了最大加速度约束但你直接在优化器里加约束会让fmincon收敛变慢。我采用了一个后处理策略优化器内部用无约束变量解出来之后经过饱和函数限幅再输出到动力学模型。这样博弈均衡求解速度提升非常明显而且最终输出的控制指令依然满足物理约束。5.3 计算性能的取舍实时性到底重不重要期刊复现的仿真通常不需要严格实时但如果你未来想把算法往实际嵌入式环境迁移计算性能就不能忽略。我实测过我的Matlab代码单个步长的平均耗时约8毫秒其中80%以上消耗在game_solver的迭代求解上。EKF只占很小比例。如果要做性能优化优先砍博弈求解器的迭代次数。一个实际有效的做法是在前几个步长内保持策略不变每隔5个步长才重新求解一次均衡。因为末端追逃博弈中双方的相对态势在短时间内的变化并不剧烈策略完全没必要每拍都更新。这样可以把总计算量降为原来的五分之一而脱靶量变化不超过千分之一。6. 仿真场景设置与结果分析思路6.1 典型初始条件与场景分类我复现时设计了三个仿真场景分别对应三种典型的末端对抗态势迎头接近双方相向飞行初始相对速度大挑战追踪器的快速响应能力尾追攻击追踪器初始位于逃逸器后方双方同向飞行初始相对速度较小挑战追踪器的持续追踪能力机动规避逃逸器在中途突然增加横向机动测试EKF参数估计的自适应收敛能力。每个场景需要单独设定初始相对位置、相对速度、最大加速度约束以及传感器噪声方差。强烈建议大家把场景参数做成结构体变量方便切换对比而不是硬编码在代码里。我在复现过程中用了一组参数矩阵来批量跑场景最后用同一个后处理脚本出图效率高很多。6.2 脱靶量曲线和轨迹图的判读思路仿真跑完之后第一件事看脱靶量曲线是否单调收敛。如果末端脱靶量出现明显的振荡甚至发散大概率是博弈求解器迭代没收敛或者EKF的估计值跳变太大传递给了博弈模型。第二件事看轨迹图。追逃博弈末端追踪器轨迹通常会有明显的末端转弯动作这是为了抵消逃逸器的规避机动在视线方向形成包络。如果轨迹过于平直或者过度弯曲说明支付函数里控制能量惩罚权重的设置不合理。第三件事是查看参数估计曲线。特别要关注a_e_max的估计值是否在逃逸器实际发生机动变化后能快速跟随。如果你看到估计值滞后时间超过2秒说明EKF的Q矩阵设得太小系统对参数变化的跟踪太迟钝。6.3 一个值得做的对照实验全信息vs不完全信息我额外做了一个对照一组给博弈求解器直接喂真实参数全信息一组喂EKF估计参数不完全信息来量化信息不确定性造成的性能损失。结果显示在低噪声场景下两者脱靶量差距很小不足5%但在高噪声场景下不完全信息策略的脱靶量会明显劣化有时甚至达到两倍以上。这个对照实验结果让我意识到论文标题强调不完全信息并不是噱头。信息不确定性是真实约束EKF并不能完全抹平信息差距只能尽量缩小它。理解这一点你才会明白为什么博弈策略需要留出鲁棒性余量而不是追求完美最优。7. 复现过程中收获的几个通用经验项目做到最后我对期刊复现这件事本身的感触反而比技术细节更深。分享几条通用的经验希望对准备复现类似项目的同学有参考价值。第一读论文至少三遍再动手。第一遍只看标题摘要和结论搞清楚问题是什么第二遍重点看建模和假设把状态变量、控制量、支付函数在纸上写清楚第三遍才看仿真设置和图表对应的场景。很多时候代码跑不出来不是代码问题是建模没看透。第二把论文图表当作验收标准。论文里给出脱靶量或轨迹图你就尽量用相同的初始条件去跑看能不能复现出相近的形状和量级。如果能复现说明你的理解基本正确如果不能就逐模块排查。当然论文可能隐藏了不少关键参数复现曲线的绝对数值对不上很正常量级和趋势对得上就值得庆祝了。第三参数敏感性分析一定要做。论文里往往只展示一组结果但实际运行需要你理解每个关键参数对结果的影响。我在复现结束后专门做了一个简单的参数扫描把EKF的Q矩阵元素、博弈迭代初始策略、epsilon阈值各拉一个网格跑了一百多组仿真用热图看脱靶量的分布。这个过程极大增强了我对算法的直觉也让我理解了论文作者为什么会选那组参数。复制完毕