基于Q-Learning的多无人机协同路径规划与防撞Matlab仿真实现 简介本资源面向强化学习与无人机协同控制方向的高校研究者、自动化/人工智能方向研究生及工程实践者提供一套基于多智能体Q-Learning的三维多无人机协同路径规划与防撞仿真方案。资源采用MATLAB 2024b实现通过独立Q-Learning算法使每架无人机作为自主智能体在三维栅格环境中完成探索—学习—优化闭环有效解决动态避障、多机冲突消解与全局目标趋近等核心问题。压缩包共4个文件3个核心M函数1个操作指引文本总大小仅6KB结构精炼主程序tops.m统筹调度draw_quad.m可视化飞行轨迹与碰撞检测sub2idx.m负责空间索引映射配套txt文件提供视频观看链接与关键路径说明。资源已附全程中文注释、分步讲解视频及详细操作提示特别强调当前文件夹路径设置等易错细节显著降低复现门槛。目前已有90人学习下载适合快速掌握多智能体强化学习在无人系统中的落地建模与仿真验证方法。 多无人机协同路径规划这几年一直是无人机应用领域的热门方向不管是物流配送、编队巡检还是区域搜索单机执行任务的模式已经很难满足复杂场景的需求。但多机协同有一个绕不开的痛点机与机之间怎么协调既要完成各自的目标还得防止互相撞上。我在实际项目中尝试过不少规划算法比如A*、RRT这类传统路径搜索也试过人工势场法但遇到动态环境或者多机并发的情况效果都不太理想。后来转向强化学习这条路线用多智能体Q-Learning在Matlab里跑通了一套协同路径规划与防撞仿真整体效果比预期好很多。这篇文章就把整个方案的建模思路、代码实现和调试过程中踩过的坑完整拆解一遍给正在做相关课题或者项目的朋友一个可以直接参考的样本。这套仿真适合三类人一是刚入门强化学习、想在Matlab里验证算法的学生二是做无人机编队或集群项目的工程师需要快速原型验证三是在研究多智能体协同决策但被联合状态空间爆炸、奖励稀疏等问题困扰的研究者。整个方案不依赖深度学习工具箱纯脚本实现Matlab R2020及以上的版本都能跑代码里中文注释齐全配了操作和讲解视频跟着敲一遍就能把原理和实现串起来。1. 模型整体设计与核心思路拆解1.1 为什么要用Q-Learning做多无人机路径规划先聊一个问题传统路径规划算法在单机场景下表现很好为什么多机协同就难做核心原因在于“多机之间相互影响”。A*规划出来的路径只对自己负责当两架飞机的路径在时间和空间上发生重叠就需要动态调整而这种调整会带来连锁反应一架飞机绕行可能把另一架的路径又挡住了。传统做法通常分两层先全局规划再局部避碰。全局层用A*或者蚁群算法生成粗略航迹局部层用人工势场法或速度障碍法做实时防撞。这种组合策略可行但存在两个问题第一全局规划没有把潜在冲突建模进去生成的路径往往容易触发冲突第二局部避碰是反应式的只能处理眼前的情况不具备前瞻性。Q-Learning解决这个问题的思路完全不同。它不依赖环境模型直接在交互中学习状态到动作的映射。对多无人机场景来说每架飞机都是一个独立学习的智能体可以通过奖惩信号同时学习“如何到达目标”和“如何避免碰撞”这两个目标。更关键的是Q-Learning天然支持离线训练、在线部署所有避碰经验都在训练阶段通过试错积累下来到实际运行的时候计算量只有查表而已实时性很好。选择Q-Learning而不是Deep Q NetworkDQN也是有考虑的。无人机数量在3到5架、栅格环境在20×20以内时离散状态空间的规模还在可控范围内Q表就能装下。DQN的神经网络虽然能处理连续状态但调试成本高收敛不稳定在没有GPU加速的Matlab环境里训练周期很长。Q-Learning代码简单、收敛过程透明每一步更新都可以把Q值拉出来看排查问题非常直观。1.2 协同与防撞的建模思路多无人机协同路径规划要解决的问题可以分解为三个子任务目标导航、环境避障、机间防撞。目标导航就是让每架飞机从起点飞到指定目标点环境避障是绕开地图上的静态障碍机间防撞要求任意两架飞机之间的距离不能低于安全阈值。在Q-Learning框架下这三个子任务不是分开建模的而是统一塞进奖励函数里。每架无人机在每个时间步执行一个动作后环境返回一个综合奖励值这个奖励同时反映目标进展、障碍危险和机间距离三个因素。这样做的好处是智能体在训练中会自己权衡绕路多走几步但更安全还是直线过去但风险更高Q-Learning会通过长期累积回报找到最优折中。但我需要提醒一点把多目标都压进一个奖励函数最初的版本很容易出现顾此失彼的问题。比如我最早做的时候把碰撞惩罚设得太高结果智能体倾向于原地不动或者绕远路导致到达率很低。后来把奖励函数分成了稀疏奖励和密集奖励两部分稀疏奖励给出大额正负反馈到达目标100、碰撞-200密集奖励给出渐进引导再逐步调整权重系数才达到理想效果。这个调参过程在后面的章节详细展开。1.3 整体仿真框架设计整个仿真框架分成四个模块环境模块、无人机模块、训练模块、可视化模块。环境模块负责维护栅格地图、障碍物位置、无人机状态和防撞判断逻辑无人机模块封装每架飞机的状态和Q表或者共享Q表训练模块执行episode循环驱动所有无人机依次选择动作并更新Q值可视化模块在训练完成后回放飞行轨迹、绘制收敛曲线。模块拆分的原则是解耦。最开始我把所有逻辑都写在一个脚本里改一处参数就要从头跑一遍调试效率很低。后来按照上面的结构拆分每个模块是一个独立的函数文件环境状态、奖励计算、Q表更新都可以单独调试配合disp打印中间变量定位问题快很多。这里还有个设计细节多智能体Q-Learning有两种实现方式一种是所有无人机共享一张Q表一种是每架无人机维护自己的Q表。我两种都试过。共享Q表的好处是训练数据共享收敛速度快但如果无人机的起点、目标点差异很大共享Q表反而会互相干扰。独立Q表更灵活每架飞机学到自己的策略代价是训练时间翻倍。最终方案是“共享环境感知独立Q表”每个无人机有独立的Q表但状态空间里包含与最近无人机的相对距离这样防撞信息就能传递到每架飞机的决策中。2. 环境建模与强化学习要素设计2.1 状态空间设计与离散化策略状态空间设计直接决定Q表的大小和训练能否收敛。连续空间下无人机的位置是连续的但Q-Learning需要离散状态所以第一步就是把环境栅格化。我用的地图是20×20的栅格每个栅格边长代表实际空间中的10米无人机只能位于栅格中心每个时间步移动一个栅格。单机状态至少包括三项当前栅格坐标x, y、目标栅格坐标gx, gy、相对目标的方向。但多机场景下还必须加入防撞相关的状态否则智能体根本感知不到其他无人机的存在也就不可能学会防撞。我加入了两个额外维度与最近障碍物的距离等级、与最近无人机的距离等级。距离等级是个关键设计。直接用数值距离会导致状态空间过大比如20×20地图上两架无人机的相对距离可能取值几十种乘起来组合爆炸。我把它划分为5个等级0表示距离在安全阈值以上1表示接近警告区2表示危险接近3表示即将碰撞4表示已经碰撞。这样组合出来的状态空间数量级是20×20自身位置×20×20目标位置×5障碍距离等级×5机间距离等级大约40万左右。这个规模在内存和训练时间上都能接受。状态空间还有一个优化技巧把目标相对位置而不是绝对目标坐标放进状态。也就是状态中记录“目标在我上方还是右方”这类方位信息。这样Q表可以在不同目标点之间泛化否则换一个目标点位置整个Q表就失效了还得重新训练。这个思路有点类似机器人导航里的相对坐标系建模实测下来泛化能力提升明显。2.2 动作空间定义动作空间我选择离散动作集合包含六个动作前进、左转45度、右转45度、左转90度、右转90度、原地悬停。之所以不加入后退动作是因为无人机实战中极少后退飞行而且后退动作会显著增加动作空间降低学习效率。每个动作会导致无人机朝当前航向角方向移动一个栅格。前进就是保持当前方向不变左转45度就是航向角在当前基础上加45度然后移动原地悬停则位置不变。这里注意航向角取值的周期性角度在0到360之间循环比如当前航向350度左转45度后应该变为35度而不是395度。动作设计还有个坑如果你只在部分角度上允许转向比如只允许左转90度飞机会走出非常“生硬”的折线轨迹在仿真里看着还行但映射到真实无人机动力学上根本飞不出来。45度转向配合栅格移动轨迹相对平滑后续如果要接飞控误差也在可控范围内。2.3 奖励函数设计要点奖励函数是这套系统的灵魂也是我调得最久的部分。最终版本的结构如下到达目标点100撞到静态障碍物或另一架无人机-200每时间步的燃油消耗惩罚-1与障碍物距离进入警告区距离等级3或4-10与另一架无人机距离进入警告区-15成功避开一次潜在碰撞上一时刻距离近这一时刻距离变远20先说“到达目标100”和“碰撞-200”这对稀疏奖励。数值差距要拉开否则智能体会倾向于冒险穿越危险区。100和200的差距在多次迭代后能引导智能体形成“宁可绕路也不碰撞”的保守策略。但如果只有稀疏奖励训练初期的随机探索根本找不到路所以必须加密集奖励。障碍物警告区和无人机警告区的奖励不一样分别是-10和-15。原因在于撞到无人机和撞到障碍物本质上是不同性质的错误障碍物是静态的只需要学习避开固定位置而其他无人机是动态的需要预判对方的动作。潜在碰撞避开的20奖励是为了强化智能体“提前规避”的行为。这个奖励是稀疏的但如果某一时刻无人机距离很近下一时刻主动拉开就立即给奖励这其实是把“避撞”这个序列行为拆成单步可学习的信号。还有一个容易被忽视的点奖励函数的尺度要对齐。如果你把100和-200设置在Q-Learning框架下初始Q值都是0那么智能体前几步会偏向不移动因为移动就有-1的惩罚不移动等于0。所以我把初始Q值设为一个保守正值或者在episode开始时把悬停动作的Q值压到最低保证探索阶段智能体更愿意动起来。3. 多智能体Q-Learning算法实现细节3.1 单智能体与多智能体Q-Learning的差异标准Q-Learning的更新公式为Q(s,a) Q(s,a) alpha * (r gamma * max_a Q(s,a) - Q(s,a))单智能体场景下环境是稳定的转移概率只取决于智能体自身的动作。多智能体场景下问题变得复杂每架无人机的Q值更新依赖环境反馈而环境又受其他无人机动作的影响。这就带来一个非平稳问题——对一架无人机来说环境不是固定的别的无人机也在动转移概率一直在变。学术界有一种做法叫联合动作Q-Learning把所有无人机的动作组合在一起构成联合动作空间这样环境重新变成稳定的但动作空间的维度呈指数增长。4架无人机、每架6个动作联合动作空间就是6^41296个Q表规模直接爆炸在栅格环境里根本存不下。我的方案采用独立Q-LearningIQL也就是每架无人机把自己Q表的更新看作单智能体问题但状态空间中加入其他无人机的位置信息。这个方案从理论上说不能保证收敛到全局最优解但在工程实践中效果不差代码也简单。为了缓解非平稳问题我做了两个处理一是多架无人机轮流更新不要同时更新这样每架无人机在每个时间步面临的局面是确定的二是把学习率alpha调小一点最初用0.1后来降到0.05让Q值更新更平滑不容易被其他无人机的策略变化带偏。3.2 Q表结构、更新规则与参数设置具体到Matlab实现Q表是一个多维矩阵或者结构体数组。我用的结构是Q_tables是一个元胞数组数组长度等于无人机数量每个元胞存放一架无人机的Q表。Q表的维度是位置x数量 × 位置y数量 × 目标相对方向数量 × 障碍距离等级数量 × 机间距离等级数量 × 动作数量。直接建一个六维的全零矩阵是最直观的做法但Matlab里高维矩阵占用内存大而且索引容易写错。我的做法是先把多维状态压缩成一个状态索引然后Q表只维护一个二维矩阵状态索引 × 动作数量。压缩函数把每个状态维度映射到线性索引上这个技巧在处理大状态空间时非常实用内存占用也小。参数设置方面经过多轮实验最终确定的数值如下学习率alpha0.05折扣因子gamma0.9初始探索率epsilon1.0探索率衰减系数0.995每个episode衰减一次最小探索率0.05训练episode数5000每个episode最大步数200折扣因子0.9意味着智能体更看重近期的回报。如果有远期目标gamma可以调大到0.95到0.99。探索率从1.0快速衰减到0.05训练的早期阶段充分探索环境后期则利用学到的经验。5000个episode在20×20地图上大约跑20到30分钟取决于电脑配置收敛曲线在3000个episode左右基本平稳。3.3 探索与利用平衡探索与利用的平衡是强化学习面试必问的问题也是实际训练中最影响效果的因素。我用的epsilon-greedy策略每一步以概率epsilon选择一个随机动作否则选择当前Q值最大的动作。训练初期epsilon大智能体疯狂尝试各种路径包括大量撞墙、撞机的失败经验随着epsilon衰减智能体逐渐减少随机动作开始利用已经学到的经验。我踩过的一个坑是epsilon衰减太快智能体还没有充分探索就进入利用阶段策略固化在一个很差的状态衰减太慢则训练很久都在瞎逛浪费计算资源。0.995的衰减系数意味着5000个episode后epsilon约等于0.05这个节奏在20×20地图上刚好够用。还有一种做法是epsilon不按episode衰减而是按步数衰减。我实际对比下来按episode衰减更直观因为你可以在每个episode结束后查看平均回报判断是否还需要更多探索。另外我建议在训练过程中动态打印当前epsilon、平均Q值和episode回报看起来更直观。4. Matlab仿真实操与代码实现4.1 仿真环境搭建与变量定义先把环境参数和无人机初始状态定义清楚。这里要讲一下场景设定地图20×20起点和目标点随机设置但保证两者的最短路径距离大于10个栅格否则路径规划没有意义。障碍物可以预设也可以随机生成我采用50%概率随机生成障碍物然后检查起点和目标点不在障碍物上同时检查起点到目标点存在可行通路。核心参数初始化的代码框架如下% 环境参数 map_size 20; % 地图边长栅格数 obstacle_ratio 0.3; % 障碍物比例 num_uavs 3; % 无人机数量 actions [0 45 -45 90 -90 0]; % 航向角变化量度最后一个为悬停 num_actions length(actions); % 学习参数 alpha 0.05; % 学习率 gamma 0.9; % 折扣因子 epsilon_init 1.0; % 初始探索率 epsilon_min 0.05; % 最小探索率 epsilon_decay 0.995; % 探索率衰减系数 % 奖励参数 reward_goal 100; % 到达目标点奖励 reward_collision -200; % 碰撞惩罚 reward_step -1; % 每步消耗 reward_obs_warn -10; % 进入障碍警告区 reward_uav_warn -15; % 进入机间警告区 reward_avoid 20; % 成功避让奖励 % 距离阈值 collision_dist 1; % 碰撞距离栅格数 warn_dist_obs 2; % 障碍警告距离 warn_dist_uav 2; % 机间警告距离地图用二维矩阵表示1代表障碍0代表可行区域。无人机的状态用结构体数组表示每个结构体包含位置、目标、当前航向角和Q表。用结构体数组在Matlab里操作灵活但要小心深拷贝问题在循环里修改状态后要显式赋值回结构体数组。4.2 训练主循环与Q值更新实现训练主循环的逻辑是对每个episode重置所有无人机到起点然后循环直到所有无人机都到达目标、发生碰撞、或者达到最大步数。每一步逐架无人机按epsilon-greedy策略选择动作执行动作计算奖励更新Q值然后进入下一架无人机。核心训练段的伪代码转化为Matlab大致如下for ep 1:num_episodes % 重置无人机状态 for i 1:num_uavs uavs(i).pos starts(i, :); uavs(i).heading randi([0 3]) * 90; % 朝向东/南/西/北 uavs(i).done false; uavs(i).path starts(i, :); end epsilon max(epsilon_min, epsilon_init * (epsilon_decay ^ ep)); for step 1:max_steps % 计算每架无人机当前的状态索引和可用奖励信息 for i 1:num_uavs if uavs(i).done continue; end % 构造状态: [相对目标方向, 障碍距离等级, 机间距离等级] state compute_state(uavs, i, map, goal); state_idx encode_state(state); % epsilon-greedy选动作 if rand epsilon action_idx randi(num_actions); else [~, action_idx] max(q_tables{i}(state_idx, :)); end % 执行动作返回新位置 next_state move_uav(uavs(i), actions(action_idx), map); new_state compute_state(uavs, i, map, goal); new_state_idx encode_state(new_state); % 计算奖励 reward compute_reward(uavs, i, next_state, new_state, map); % Q值更新 q_tables{i}(state_idx, action_idx) ... q_tables{i}(state_idx, action_idx) ... alpha * (reward gamma * max(q_tables{i}(new_state_idx, :)) - ... q_tables{i}(state_idx, action_idx)); end % 检查是否所有无人机都完成了 if all([uavs.done]) break; end end % 记录本episode的总奖励和到达率 ep_reward(ep) sum([uavs.episode_reward]); ep_reach(ep) sum([uavs.reached]) / num_uavs; end这里有个重要细节执行动作后要立即用新的位置重新计算状态。因为多智能体场景中其他无人机的动作也可能在同一轮更新了位置直接影响当前无人机的机间距离等级。我建议在每轮更新时先计算所有无人机的动作再统一执行位置更新这样避免“我先动、你还没动”的先后顺序偏差。move_uav函数实现航向角变化和栅格位置更新需要处理边界和障碍物判断如果下一步位置超出地图边界或落在障碍物上那么无人机位置不变但会得到碰撞惩罚。这种实现等价于“撞墙罚站”训练初期很常见后面的episode中会逐渐消失。4.3 防撞逻辑实现防撞逻辑贯穿在compute_state和compute_reward两个函数中。compute_state计算无人机i与最近无人机的距离映射到距离等级compute_reward根据这个距离等级给出惩罚或者避让奖励。距离等级的计算方式我把所有其他无人机的位置对比一遍取最小欧氏距离然后按距离阈值划分等级。距离小于1个栅格就认为是碰撞小于2个栅格是危险接近小于3个栅格是警告区超过3个栅格是安全距离。这里注意栅格坐标的欧氏距离是连续值但状态里要用离散等级所以映射函数要注意边界取值。防撞逻辑的代码核心如下function warn_level get_uav_warn_level(uavs, i, map) d_min inf; for j 1:length(uavs) if j i || uavs(j).done continue; end d norm(uavs(i).pos - uavs(j).pos); if d d_min d_min d; end end if d_min collision_dist warn_level 4; % 碰撞 elseif d_min warn_dist_uav warn_level 3; % 危险接近 elseif d_min warn_dist_uav 1 warn_level 2; % 警告区 else warn_level 0; % 安全 end end在实际仿真中我还遇到过一种情况两架无人机在栅格地图上“擦肩而过”即它们在相邻栅格之间移动没有进入碰撞距离但欧氏距离小于安全阈值。这种情况需要把防撞判断的阈值放大到2.5个栅格及以上才能有效预防擦碰。我把这个经验补充进了避让逻辑即使不碰撞只要距离小于安全距离就进入警告区并给予负奖励促使智能体学会保持安全距离。4.4 结果可视化与性能评估训练完成后可视化是检验算法效果的重要手段。我做了三张图和一段轨迹回放。第一张图是每个episode的总奖励曲线第二张是到达率曲线第三张是最终路径图用不同颜色画出每架无人机的轨迹标出起点、目标点和障碍物。轨迹回放用animatedline逐帧画可以在GUI界面里看到无人机一步步移动的过程配合讲解视频效果更好。% 结果可视化 figure; subplot(1,2,1); plot(1:num_episodes, smoothdata(ep_reward, gaussian, 50)); xlabel(Episode); ylabel(Total Reward); title(训练奖励收敛曲线); subplot(1,2,2); plot(1:num_episodes, smoothdata(ep_reach, gaussian, 50)); xlabel(Episode); ylabel(到达率); title(到达率曲线); % 轨迹可视化 figure; imagesc(map); colormap(gray); hold on; for i 1:num_uavs plot(uavs(i).path(:,1), uavs(i).path(:,2), LineWidth, 2); plot(starts(i,1), starts(i,2), go, MarkerSize, 10); plot(goals(i,1), goals(i,2), r*, MarkerSize, 15); end legend(轨迹, 起点, 目标点);性能评估指标我推荐三个平均路径长度、平均到达时间、碰撞率。这三个指标综合反映系统的效率和安全性。平均路径长度可以从保存的path数据计算碰撞率统计训练过程中所有episode里发生碰撞的次数除以总episode数平均到达时间是到达目标点所消耗的步数。好的结果应该在到达率高于90%的同时碰撞率低于5%路径长度不超过最短可行路径的1.5倍。如果路径太长说明奖励函数里的步数惩罚权重不够可以增大reward_step的绝对值。5. 常见问题与调试心得5.1 Q表不收敛的表现与定位这是一个必须重点说的问题因为10个人里有8个人第一次跑这个仿真都会遇到不收敛的情况。不收敛的表现有几种奖励曲线一直在波动、没有上升趋势Q值无限增长路径随机乱走没有规律可循。我的排查经验是先确认代码中Q值更新的时序是否正确再检查状态编码是否唯一。状态编码出现问题很隐蔽不同状态映射到同一个编号会让Q表里不同策略互相覆盖学习过程自然无法收敛。可以通过在compute_state函数里加断点打印一组状态值编码出来人工验证两个不同状态是否得到不同编号。奖励函数设计不合理也会导致不收敛。如果稀疏奖励占主导而密集奖励太弱智能体在训练初期收到的非零奖励很少Q表更新主要靠每次的-1消耗惩罚学不到有效信息。解决方法是先无无人机干扰、单机环境下测试Q值是否收敛如果单机都不收敛肯定是状态空间或者奖励函数有问题单机收敛后再加入第二架无人机逐步排查多机干扰带来的问题。5.2 稀疏奖励导致的探索困难前面提到过稀疏奖励会让智能体很难找到目标。20×20的栅格地图上从左上角到右下角的曼哈顿距离接近40格每步有6个动作可选随机搜索到目标的概率极低。如果奖励只有“到达100”和“碰撞-200”智能体基本学不会。我的解决方案是加入“引导梯度”。在每个episode开始后的前几步如果智能体朝向目标方向移动就给予小额的2奖励如果远离目标方向不吃除了-1之外的惩罚。这相当于给智能体一个粗略的方向提示让它在早期训练中更快发现目标。等到达率提升后再逐步减小这个引导奖励的权重让智能体依赖更精细的Q值选择路径。更进一步的技巧分阶段训练。先让所有无人机从固定起点飞到固定目标点训练到收敛再随机化起点和目标点先单机训练再增加第二架、第三架无人机。这种课程学习Curriculum Learning的思路在强化学习里非常有效能显著缩短训练时间。5.3 多智能体冲突协调的失衡问题多机场景下经常出现一种情况两架无人机在狭窄通道里互相堵住谁都不让谁。单独看每架飞机的策略都是合理的——它想走过去但对面有另一架飞机它学到的策略可能是“等对方让路”结果对方也这么想就死锁了。这种死锁问题在独立Q-Learning框架下难以彻底避免因为每架无人机独立决策感知不到对方的意图。我尝试过两个缓解办法一是增加“悬停”动作的权重当检测到危险接近时悬停的Q值会被增加给两架飞机更多决策时间二是引入优先级机制编号靠前的无人机优先通过靠后的无人机需要避让这通过在奖励函数中对不同无人机设置不对等的避让惩罚实现。优先级机制在仿真中效果不错虽然牺牲了一部分公平性但整体系统效率提升明显。如果场景中无人机数量增加到5架以上独立Q-Learning的协调问题会进一步放大。这时可以考虑引入通信机制让无人机之间交换预期路径或者用集中训练、分散执行的框架如QMIX但这些内容已经超出本文的范围可以作为后续深入的方向。5.4 参数调优经验总结最后把调参经验系统整理一下方便大家参考。学习率alpha0.05到0.1区间通常都能收敛。如果环境复杂用更小的alpha0.01更稳但训练时间会变长。折扣因子gamma一般取0.9。如果目标点离起点远可以取0.95以上让远期奖励权重更高。探索率epsilon一定要从高值开始但衰减速度要适中。不要一开始就设0.1那等于放弃了探索。最小探索率0.05既能保证一定随机性防止局部最优又不会让训练后期策略太乱。奖励值设定奖励绝对数值大小没有绝对标准关键是相对关系。碰撞惩罚-200要比到达奖励100负方向更远才能形成强避碰约束。栅格地图大小20×20对于演示和验证刚好但也意味着路径细节比较粗糙。如果要模拟更精细的环境可以加大到40×40但Q表会膨胀4倍需要更多训练episode。另外训练过程中可以保存“目前发现的最好策略”也就是每一百个episode后测试一次当前策略的到达率和碰撞率如果优于历史最优就把Q表保存下来。即使最终训练过程有波动也有一个可用的中间版本不至于全盘重来。这套代码在Matlab里跑一次完整训练的耗时和电脑配置密切相关。我用的是一台带i7处理器和16GB内存的笔记本3架无人机、20×20地图5000个episode大约需要20分钟。如果感觉训练太慢可以先缩小地图到12×12、减少episode数量到1000跑通流程确认算法逻辑无误后再做完整训练。这种从简到繁的调试顺序能节省大量时间。做这套仿真的过程中我最深的体会是多智能体强化学习的核心难点不在算法本身而在环境和奖励的设计。环境设计决定了智能体拿到的信息够不够做正确决策奖励设计决定了训练方向和最终策略质量。这篇博客里分享的奖励函数和状态编码方案是我在多次失败后总结出来的可行方案里面有很多细节只有亲手调过才能体会。如果你在实际运行中遇到问题欢迎在评论区贴出你的报错信息和参数配置我会尽量帮你看。也希望这篇博客能帮你少走一些弯路把精力集中在更有价值的研究方向上。本文还有配套的精品资源点击获取