MATLAB实现空间博弈追逃:微分博弈建模与纳什均衡求解
2026/9/12 16:47:16 网站建设 项目流程

简介:本资源是一套面向研究生阶段毕业设计的MATLAB空间博弈追逃仿真系统,聚焦多智能体动态对抗建模与轨迹优化问题,适用于控制理论、博弈论、机器人路径规划等方向的学习与课题实践。压缩包共74个文件,含30个核心MATLAB源码(.m)、19个数据与参数配置文件(.mat)、13个说明与注释文本(.txt)、8个可视化结果图(.fig)及1份结构清晰的README文档,整体26.93MB,代码经本地编译验证可直接运行。已有138人学习下载,项目难度适中,内容通过助教审定,覆盖梯形轨迹规划、可操作度分析、追逃博弈单步/积分求解(OneGameByDt.m / OneGameByInt.m)、最优控制输入计算(GetBestUe.m / GetBestUp.m)等关键模块,并提供solutionTest.m等测试脚本与仿真结果验证逻辑,便于读者理解博弈策略实现机制、复现仿真流程并拓展算法改进。

1. 这不是普通追逃仿真:用 MATLAB 实现空间博弈追逃,本质是多智能体动态零和博弈建模与轨迹优化问题

研究生毕设里出现“空间博弈追逃”,绝非简单画两条曲线互相靠近。它直指一类典型连续空间、异步决策、信息不完全、目标冲突的多智能体对抗场景——追捕者要最小化捕获时间或距离,逃逸者要最大化生存时间或逃脱概率,双方策略实时耦合,状态演化由微分方程驱动。这类问题在无人系统协同、网络安全攻防推演、机器人围捕算法验证中已是高频研究载体。MATLAB 成为此类毕设首选,并非仅因绘图方便,而是其Optimization Toolbox 提供成熟的非线性规划求解器(如 fmincon)、Global Optimization Toolbox 支持遗传/粒子群等启发式搜索、Simulink 可构建闭环反馈控制结构、以及 Symbolic Math Toolbox 能直接推导 Hamilton-Jacobi-Bellman 方程近似解。本项目压缩包中的.m文件,大概率包含状态方程定义、博弈均衡求解主循环、轨迹可视化脚本三类核心模块。适合已掌握 MATLAB 基础语法、了解常微分方程数值解(ode45)、对博弈论纳什均衡有初步认知的研二学生快速上手复现并拓展。

2.1 空间博弈追逃的数学建模:从微分博弈到离散化策略空间

空间博弈追逃的本质是微分博弈(Differential Game),其标准形式为:

$$ \begin{cases} \dot{\mathbf{x}}(t) = \mathbf{f}(\mathbf{x}(t), \mathbf{u}_p(t), \mathbf{u}_e(t)) \ J_p = \int_0^{t_f} L_p(\mathbf{x}, \mathbf{u}_p, \mathbf{u}_e) dt + \Phi_p(\mathbf{x}(t_f)) \ J_e = \int_0^{t_f} L_e(\mathbf{x}, \mathbf{u}_p, \mathbf{u}_e) dt + \Phi_e(\mathbf{x}(t_f)) \end{cases} $$

其中 $\mathbf{x} \in \mathbb{R}^n$ 是联合状态向量(如追逃双方位置、速度、角度),$\mathbf{u}_p, \mathbf{u}_e$ 分别为追捕者与逃逸者的控制输入(加速度、转向角速率等),$J_p, J_e$ 是双方代价函数。在零和设定下,$J_e = -J_p$,此时存在鞍点策略 $(\mathbf{u}_p^, \mathbf{u}_e^)$ 满足:

$$ J_p(\mathbf{u}_p^, \mathbf{u}_e) \leq J_p(\mathbf{u}_p^, \mathbf{u}_e^) \leq J_p(\mathbf{u}_p, \mathbf{u}_e^) $$

提示:实际毕设中极少直接求解 HJB 偏微分方程。更可行路径是将连续时间博弈离散化为多阶段博弈(Multi-stage Game),每阶段时长 $\Delta t$,状态更新采用欧拉法或 ode45 数值积分,控制变量在每个阶段内视为分段常数。这大幅降低计算复杂度,且便于嵌入 MATLAB 的优化框架。

常见状态空间简化模型如下(二维平面,无动力学约束):

% 定义状态向量 x = [xp; yp; xe; ye],即追捕者(xp,yp)、逃逸者(xe,ye) function dxdt = pursuitEvasionODE(t, x, up, ue, vmax_p, vmax_e) % up, ue 为当前控制输入(方向角,弧度制) dxdt = zeros(4,1); dxdt(1) = vmax_p * cos(up); % 追捕者 x 方向速度 dxdt(2) = vmax_p * sin(up); % 追捕者 y 方向速度 dxdt(3) = vmax_e * cos(ue); % 逃逸者 x 方向速度 dxdt(4) = vmax_e * sin(ue); % 逃逸者 y 方向速度 end

该函数需配合ode45调用,例如:

% 初始状态:追捕者在 (0,0),逃逸者在 (10,5),最大速度均为 1.5 x0 = [0; 0; 10; 5]; vmax_p = 1.5; vmax_e = 1.5; tspan = [0 20]; % 仿真总时长 options = odeset('RelTol',1e-6,'AbsTol',1e-8); % 假设双方采用固定策略:追捕者始终朝向逃逸者当前位置,逃逸者垂直于连线方向逃跑 [t, x] = ode45(@(t,x) pursuitEvasionODE(t,x, atan2(x(4)-x(2),x(3)-x(1)), ... atan2(x(4)-x(2),x(3)-x(1)) + pi/2), tspan, x0, options);

此代码片段展示了最简策略下的状态演化,但未体现博弈性——双方策略未相互响应。真正博弈需在每个时间步重新求解最优响应。

2.2 MATLAB 中实现纳什均衡求解:基于优化工具箱的双层嵌套优化框架

在离散化时间步 $k=0,1,\dots,K$ 下,将追逃问题建模为双层优化问题(Bilevel Optimization):外层优化追捕者策略 $\mathbf{U}p = [u{p,0},\dots,u_{p,K}]$,内层对每个 $\mathbf{U}_p$ 求解逃逸者最优响应 $\mathbf{U}_e^(\mathbf{U}_p)$,使得追捕者总代价 $J_p(\mathbf{U}_p, \mathbf{U}_e^(\mathbf{U}_p))$ 最小。MATLAB 不提供原生双层求解器,但可通过fmincon嵌套调用实现:

% 主函数:求解追捕者最优开环策略 function [Up_opt, Je_opt] = solvePursuitNash(x0, K, dt, vmax_p, vmax_e) % 初始化追捕者策略变量(K+1 个控制角) Up0 = linspace(0, 2*pi, K+1); % 定义非线性约束:确保状态不越界(如边界矩形 [-20,20]x[-20,20]) nonlcon = @(Up) nlc_pursuitEvasion(Up, x0, K, dt, vmax_p, vmax_e); % 调用 fmincon 最小化追捕者代价 options = optimoptions('fmincon','Algorithm','interior-point',... 'Display','iter','MaxFunctionEvaluations',5000,'MaxIterations',1000); [Up_opt, fval, exitflag, output] = fmincon(@obj_pursuit, Up0, [],[],[],[],... -inf(1,K+1), 2*pi*ones(1,K+1), nonlcon, options); % 用最优 Up 计算对应 Je [~, ~, Je_opt] = simulateGame(x0, Up_opt, K, dt, vmax_p, vmax_e); end % 目标函数:追捕者总代价(此处为最终距离平方) function Jp = obj_pursuit(Up, x0, K, dt, vmax_p, vmax_e) [~, ~, Je] = simulateGame(x0, Up, K, dt, vmax_p, vmax_e); Jp = Je; % 零和博弈,Jp = -Je,故最小化 Je 即最大化 Jp end % 模拟单次博弈:给定 Up,求解逃逸者最优响应 Ue* 并返回 Je function [x_traj, Up_traj, Ue_traj, Je] = simulateGame(x0, Up, K, dt, vmax_p, vmax_e) x = x0; Ue = zeros(1,K+1); for k = 1:K % 对当前 Up(k),求解 Ue(k) 使 Je 最大(即 Jp 最小) % 此处用 fminsearch 求局部极大(因 Je 是逃逸者收益) Ue0 = pi; % 初始猜测 Ue_opt = fminsearch(@(ue) -je_singleStep(x, Up(k), ue, dt, vmax_p, vmax_e), Ue0); Ue(k) = Ue_opt; % 更新状态 x = rk4_step(x, Up(k), Ue_opt, dt, vmax_p, vmax_e); % 四阶龙格库塔 end Je = norm(x(1:2) - x(3:4))^2; % 终端距离平方作为 Je end

注意:rk4_step函数需自行实现四阶龙格库塔法,比 ode45 更可控且避免嵌套求解器冲突;je_singleStep应返回单步后对 Je 的贡献(如距离变化率)。此框架虽计算量大,但清晰体现了博弈的“你中有我、我中有你”逻辑,是毕设答辩中展示理论深度的关键。

2.3 关键参数物理意义与典型取值范围(附可复现参数表)

参数设置直接影响仿真合理性与收敛性。下表列出空间博弈追逃中必须显式声明且影响结果显著的 7 个核心参数,及其在学术论文与毕设中的常见取值区间(基于 IEEE Transactions on Cybernetics 近三年相关论文统计):

参数名符号物理含义典型取值范围MATLAB 设置示例说明
追捕者最大速度vmax_p单位时间最大位移0.8 ~ 3.0 m/svmax_p = 1.8;vmax_p < vmax_e,纯追捕不可行,需引入探测半径或合作追捕
逃逸者最大速度vmax_e同上1.0 ~ 4.0 m/svmax_e = 2.2;速度比vmax_e/vmax_p > 1是检验策略鲁棒性的关键压力测试点
仿真步长dt离散化时间粒度0.05 ~ 0.2 sdt = 0.1;过大会导致数值不稳定;过小则计算耗时剧增,ode45自适应步长更优
捕获半径r_catch距离小于该值判定捕获0.3 ~ 1.5 mr_catch = 0.5;决定终止条件norm(xp-xe) <= r_catch,影响总时长统计
控制更新频率K总控制决策次数50 ~ 300K = 120;对应总时长T = K*dt,需保证T足够覆盖典型捕获过程
初始距离d_init追逃初始欧氏距离5.0 ~ 20.0 mx0 = [0;0; d_init*cos(theta); d_init*sin(theta)];方向角theta应随机采样以验证策略泛化性
状态约束边界x_min,x_max工作空间范围[-15,-15]to[15,15]lb = [-15;-15;-15;-15]; ub = [15;15;15;15];nonlcon中强制x ∈ [lb,ub],避免轨迹发散

这些参数必须写入主脚本开头的注释块,并在simulateGame函数中作为输入传递,而非硬编码在子函数内。这是代码可复现性与可比性的基本要求。

3. 从仿真到可视化:用 MATLAB 绘制动态博弈轨迹与策略热力图

3.1 动态轨迹动画:animatedlinedrawnow limitrate的高效组合

静态图无法体现博弈的实时对抗性。MATLAB 中生成流畅动画的核心是避免重复创建图形对象,而使用animatedline累积数据点,并通过drawnow limitrate控制刷新帧率:

% 创建图形窗口与坐标轴 figure('Name','空间博弈追逃动态仿真','NumberTitle','off'); ax = axes('XLim',[-20 20],'YLim',[-20 20],'Box','on','Color','w'); hold(ax,'on'); % 初始化 animatedline 对象 h_pursuer = animatedline('Color','r','LineWidth',2,'Marker','o','MarkerSize',8); h_evader = animatedline('Color','b','LineWidth',2,'Marker','s','MarkerSize',8); h_path_p = animatedline('Color',[0.8 0.2 0.2],'LineStyle','--','LineWidth',1); h_path_e = animatedline('Color',[0.2 0.2 0.8],'LineStyle','--','LineWidth',1); % 设置标题与图例 title(ax,'空间博弈追逃动态仿真 (t = 0.00s)','FontSize',14,'FontWeight','bold'); xlabel(ax,'X 坐标 (m)'); ylabel(ax,'Y 坐标 (m)'); legend([h_pursuer h_evader],'追捕者','逃逸者','Location','northeastoutside'); % 主动画循环 for k = 1:length(t) % 添加新点(使用 addpoints 而非 plot,效率提升 5 倍以上) addpoints(h_pursuer, x(k,1), x(k,2)); addpoints(h_evader, x(k,3), x(k,4)); addpoints(h_path_p, x(1:k,1), x(1:k,2)); addpoints(h_path_e, x(1:k,3), x(1:k,4)); % 更新标题显示当前时间 title(ax,sprintf('空间博弈追逃动态仿真 (t = %.2fs)',t(k)),'FontSize',14,'FontWeight','bold'); % 高效刷新,limitrate 防止卡顿 drawnow limitrate; % 可选:添加捕获判定标记 if norm(x(k,1:2)-x(k,3:4)) <= r_catch text(ax,x(k,1),x(k,2)+1,'● CAPTURE!','Color','k','FontSize',12,'FontWeight','bold'); break; end end

提示:drawnow limitratedrawnow快 3~5 倍,尤其在高分辨率屏幕下;addpointsplot累加数据快一个数量级。若需导出 GIF,可在循环末尾添加frame = getframe(gcf); writeVideo(vid,frame);

3.2 策略空间热力图:用contourf可视化纳什均衡区域

单纯看轨迹不够,需分析策略分布。对追捕者控制角 $u_p$ 和逃逸者控制角 $u_e$ 构成的二维策略空间,计算网格点上的代价函数 $J_p(u_p,u_e)$,再用contourf绘制等高线:

% 定义策略网格(分辨率为 100x100) up_grid = linspace(0, 2*pi, 100); ue_grid = linspace(0, 2*pi, 100); [UP, UE] = meshgrid(up_grid, ue_grid); % 预分配代价矩阵 Jp_matrix = zeros(size(UP)); % 计算每个 (up,ue) 组合下的终端距离(简化版,单步预测) for i = 1:size(UP,1) for j = 1:size(UP,2) x_next = rk4_step(x0, UP(i,j), UE(i,j), dt, vmax_p, vmax_e); Jp_matrix(i,j) = norm(x_next(1:2) - x_next(3:4))^2; end end % 绘制热力图 figure('Name','策略空间代价热力图','NumberTitle','off'); contourf(UP, UE, Jp_matrix, 50, 'LineColor','none'); colorbar; xlabel('追捕者控制角 u_p (rad)'); ylabel('逃逸者控制角 u_e (rad)'); title('追捕者代价 J_p(u_p,u_e) 热力图'); caxis([0, max(Jp_matrix(:))]); % 设置颜色映射范围 % 标出纳什均衡点(若已知解析解或数值解) % hold on; plot(up_nash, ue_nash, 'kx', 'MarkerSize',12, 'LineWidth',2);

此图能直观揭示:是否存在纯策略纳什均衡(热力图极小值点)?是否存在混合策略优势区域(平缓低谷区)?这是毕设论文“结果分析”章节的强力配图。

4. 毕设进阶技巧:用 Simulink 构建闭环反馈追逃系统与性能对比实验设计

4.1 从开环优化到闭环控制:Simulink 模型搭建要点

前述fmincon求解的是开环策略(预先计算好所有时刻的控制指令),但真实系统需实时反馈。Simulink 提供天然闭环框架。关键步骤如下:

  1. 创建 State-Space 模块:将状态方程 $\dot{x}=f(x,u_p,u_e)$ 封装为 S-Function 或使用 MATLAB Function 模块;
  2. 添加 Feedback Loop:用 XY Graph 显示实时位置,用 Gain 模块实现比例导引律(PNG):$u_p = \text{atan2}(y_e-y_p, x_e-x_p) + N \cdot \dot{\lambda}$,其中 $\lambda$ 是视线角,$N$ 是导航比(通常 3~5);
  3. 集成优化器:在 MATLAB Function 模块中调用fmincon,但限定只优化未来 $H=5$ 步(模型预测控制 MPC 思想),每步更新一次;
  4. 添加噪声与不确定性:用 Band-Limited White Noise 模块模拟传感器误差,用 Saturation 模块限制控制输出。

注意:Simulink 中fmincon调用需在coder.extrinsic('fmincon')包裹下,否则编译报错;实时性要求高时,建议用quadprog求解线性化后的 MPC 问题。

4.2 设计三组对照实验验证算法鲁棒性(含可执行代码模板)

毕设答辩最易被质疑“你的方法真比别人强?”——必须设计严谨对照实验。推荐以下三组基准对比,每组运行 50 次蒙特卡洛仿真,统计捕获成功率与平均捕获时间:

实验组追捕者策略逃逸者策略MATLAB 实现要点预期结论
Group A(本文方法)基于双层优化的纳什均衡策略同上(最优响应)调用solvePursuitNash基准性能,捕获率应 >85%
Group B(传统比例导引)$u_p = \text{atan2}(y_e-y_p, x_e-x_p)$随机游走(均匀采样 $[0,2\pi]$)ue = 2*pi*rand;检验本文方法对智能逃逸的优越性
Group C(强化学习基线)DQN 策略(调用预训练网络)同 Group Aue = predict(dqn_net, x);若无 RL 经验,可用rlQAgent现成接口
% 批量运行实验的主循环(伪代码,需补全具体策略函数) results = struct('capture_rate',[],'avg_time',[],'std_time',[]); for group_id = 1:3 capture_times = zeros(1,50); for trial = 1:50 x0 = generate_random_init(); % 随机初始位置 [t, x] = run_simulation(x0, group_id); % 根据 group_id 调用不同策略 if is_captured(x, r_catch) capture_times(trial) = t(end); else capture_times(trial) = Inf; % 未捕获记为无穷大 end end results(group_id).capture_rate = sum(isfinite(capture_times))/50; results(group_id).avg_time = mean(capture_times(isfinite(capture_times))); results(group_id).std_time = std(capture_times(isfinite(capture_times))); end % 输出对比表格 fprintf('\n=== 算法性能对比(50次蒙特卡洛)===\n'); fprintf('Group\t捕获率\t平均捕获时间(s)\t时间标准差\n'); for i = 1:3 fprintf('A%d\t%.1f%%\t%.2f\t\t%.2f\n', i, results(i).capture_rate*100, ... results(i).avg_time, results(i).std_time); end

此模板可直接嵌入毕设代码,生成答辩 PPT 中最具说服力的数据表格。记住:没有对照实验的仿真,只是动画演示;有对照实验的仿真,才是科学研究。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询