☰
多智能体Q-Learning多无人机协同路径规划与防撞MATLAB仿真全解析
2026/10/27 17:38:22 网站建设 项目流程

简介:基于多智能体强化学习框架的仿真程序,面向多无人机协同路径规划与避障场景;每架无人机被视为独立智能体,在三维栅格环境中通过状态—动作—奖励的试错交互自主优化飞行策略,逐步学会避开障碍并与其他无人机保持安全距离,最终协同飞抵各自目标点。资源适合对强化学习、多智能体系统仿真及算法落地感兴趣的科研人员与工程师,尤其适合无人系统路径规划方向的学习者。压缩包共4个文件,其中3个为MATLAB源程序(.m),1个为文本说明(.txt),整体仅6KB,结构紧凑;源程序包含主程序、绘制函数与索引转换工具,并含中文注释,便于快速消化算法逻辑并运行复现。目前已有93人学习下载。资源另附视频操作链接,以录屏形式演示程序运行与操作流程,能直观呈现Q-learning更新过程与三维仿真效果,帮助降低上手难度、缩短复现时间。

1. 多智能体Q-Learning能处理多无人机协同路径规划与防撞的哪个难题

多无人机协同路径规划,本质上是多个智能体在共享空域里各自规划一条从起点到目标点的轨迹,同时还要保证机间不碰撞、路径尽量短、遇到禁飞区能及时避开。这个问题的难点不在单架无人机的路径最短,而在多架无人机之间的耦合:一架无人机选的路会影响另一架的可行空间,机间距离过近会直接触发危险甚至碰撞。把这个场景做成MATLAB仿真,最常见的做法是离散化栅格地图,用强化学习让每架无人机学自己的策略,其中多智能体Q-Learning就是把Q-Learning从单机扩展到多机协同的经典方案,能直观展示策略学习、收敛曲线和避障全过程。适合正在做课程设计、毕业设计,或者想快速把协同避撞仿真跑出结果的研究生和工程师。这篇笔记的目标是让你不只看懂原理,还能照着改写出自己的可运行仿真。

2. 把协同路径规划改写成多智能体MDP:状态、动作和奖励别拍脑袋

2.1 为什么这个场景选Q-Learning而不是深度强化学习

对于栅格化的无人机路径规划,状态空间通常有限且离散:无人机位置是栅格坐标,动作也是有限离散集。Q-Learning用Q表存储每个“状态-动作”的价值,更新公式透明、参数简单、中间过程可以直接打印出来检查。深度强化学习(DQN、PPO这类算法)擅长连续状态、图像输入和连续动作,但代价是训练数据需求大、超参多,出了问题很难定位是网络结构的问题还是奖励设计的问题。在“多无人机协同路径规划+防撞”这个可以用栅格离散化的任务里,Q-Learning的收敛过程可视化程度更高,也更容易在MATLAB里直接读表排查。

这不是说深度强化学习不好。而是对这种中等地图、规则明确的协同规划任务,Q-Learning先跑通的概率更大、调试成本更低。加上多智能体协同本身会引入联合状态和联合动作,维度随无人机数量成倍增长,高维度下用深度强化学习反而更容易让仿真陷入“训练半天不收敛”的局面。我一般建议先把Q-Learning版本做扎实,把状态定义和奖励函数验证可靠,如果后面地图变大、状态连续化,再迁移到深度强化学习框架不迟。

对比维度Q-Learning深度强化学习
状态表示离散栅格编号或离散化坐标连续状态、图像或高维特征
收敛调试可直接查看Q表,逐格分析依赖网络结构,黑匣子程度高
多机扩展联合状态空间爆炸较快更容易处理连续观测
适用场景小地图、动作离散、规则明确大范围、连续动作、视觉输入

2.2 多智能体Q-Learning路径规划MDP建模的三个核心设计

把协同路径规划放进Q-Learning,第一步是把问题改写成马尔可夫决策过程(MDP),也就是定义清楚状态、动作、奖励,这三个设计共同决定收敛速度和仿真效果。

状态:常见做法是取“无人机当前栅格坐标 + 目标点坐标 + 任务阶段”。在多智能体场景里,如果几架无人机共享环境,状态里只放本机位置和目标是不够的,还需要包含其他无人机的位置或相对方位,否则智能体感知不到彼此,协同避撞无从谈起。但直接拼接所有无人机坐标会让状态空间随数量指数增长,所以需要取舍。比如20×20栅格地图,5架无人机,全量坐标拼接的状态数是400的5次方量级,完全跑不动。务实做法是状态只取“本机坐标 + 本机目标相对方位 + 最近他机的相对方向分8区”,这样Q表维度能压到一个可接受的范围。

动作:路径规划中常用离散动作集,例如上、下、左、右、悬停,需要更平滑轨迹时再加四个斜向共8方向。4方向动作集简洁、计算快、更新稳;8方向路径更好看,但状态-动作对数量翻倍,收敛更慢。我习惯先把4方向跑通,再换8方向对比轨迹差异,这样能快速发现问题。

奖励:这是整个仿真最容易出幺蛾子的地方。基础奖励包括到达目标的正奖励、每走一步的负惩罚(鼓励短路径)、碰撞或进入禁飞区的强负惩罚。为了鼓励协同,还可以加入“靠近目标但绕开他人”的引导信号。如果奖励系数不在同一数量级,学习过程会异常缓慢,甚至学到保守绕圈策略。所有奖励值和符号要保持一致逻辑,不要出现“碰撞惩罚-1000、到达奖励+100”这种悬殊配比。

2.3 奖励塑形的可调参数与推荐初始值

下面这组参数是我在20×20栅格地图里最常用的初始配置,能把多机协同路径规划跑出基本合理的轨迹。注意地图大小改变时,步数上限和距离阈值要按比例重调。

参数推荐值说明
到达目标奖励+100终局正奖励,数量级锚点
每走一步惩罚-0.1鼓励短路径,防止绕圈
机间距离低于安全阈值-50碰撞或危险接近的强惩罚
进入障碍物或禁飞区-100并强制结束当前回合
靠近目标引导+0.5可选,缓解稀疏奖励
折扣因子gamma0.9~0.99越接近1越看重远期收益
学习率alpha0.1~0.3太大振荡,太小收敛慢
回合最大步数最短路长度×1.5~2截断绕圈行为,加速训练

还有一个容易忽略的点:回合数上限。如果一回合太长,探索阶段无人机到处乱撞,累计负奖励过大,会淹没“接近目标”的正信号。建议把回合最大步数设为最短路径长度的1.5到2倍,这样能自动截断来回绕圈的无效行为,也让Q表更快聚焦到有效策略。奖励参数不是一次调好的,先按上表跑通,再看每条轨迹判断是该加强惩罚还是削弱引导。

3. 多无人机Q-Learning的MATLAB仿真框架:从单智能体Q表到协同更新

3.1 单无人机Q-Learning的最小可跑骨架

多机版本能成立的前提是单机逻辑正确。下面给出一个最小可运行的MATLAB骨架,包含状态离散、动作选择、边界检查和Q值更新,所有关键位置都写了中文注释。

% UAV_Q_learning_single.m 单无人机Q-Learning路径规划最小骨架 map = zeros(20, 20); % 栅格地图:0=可通行,1=障碍物 start = [1, 1]; % 起点栅格坐标(行,列) goal = [18, 18]; % 目标点栅格坐标 actionSet = [0 1; 1 0; 0 -1; -1 0]; % 4方向:上、右、下、左 nA = size(actionSet, 1); [nS_row, nS_col] = size(map); Q = zeros(nS_row * nS_col, nA); % Q表:每个栅格对应一行Q值 alpha = 0.1; % 学习率 gamma = 0.9; % 折扣因子 epsilon = 0.3; % 初始探索率 epochs = 200; % 训练回合数 maxSteps = 40; % 每回合最大步数 for ep = 1:epochs state = start; steps = 0; while ~isequal(state, goal) && steps < maxSteps steps = steps + 1; % epsilon-greedy动作选择 if rand < epsilon a = randi(nA); % 随机探索 else [~, a] = max(Q(sub2ind([nS_row, nS_col], state(1), state(2)), :)); end newState = state + actionSet(a, :); % 边界与障碍判断 if newState(1) < 1 || newState(1) > nS_row || ... newState(2) < 1 || newState(2) > nS_col reward = -10; % 撞边界 newState = state; % 留在原地 elseif map(newState(1), newState(2)) == 1 reward = -10; % 撞障碍物 newState = state; elseif isequal(newState, goal) reward = 100; % 到达目标 else reward = -0.1; % 每步小惩罚 end % Q-Learning更新公式 idxOld = sub2ind([nS_row, nS_col], state(1), state(2)); idxNew = sub2ind([nS_row, nS_col], newState(1), newState(2)); oldQ = Q(idxOld, a); maxQnext = max(Q(idxNew, :)); Q(idxOld, a) = oldQ + alpha * (reward + gamma * maxQnext - oldQ); state = newState; end end

这段代码里,sub2ind把二维栅格坐标转换成一维索引,Q表按“栅格总数×动作数”分配,queries时又快又直观。动作集定义成行列增量,符合MATLAB矩阵坐标习惯。撞边界或撞障碍物时把无人机留在原地并给负奖励,状态始终保持合法,Q表不会出现无效索引。Q值更新公式对应贝尔曼方程:新估计等于旧值加上学习率乘以(即时奖励加折扣后的下一状态最大Q值减旧值)。alpha控制新旧信息权重,太大更新振荡,太小学得慢;gamma越接近1越看重远期收益,路径规划任务建议0.9到0.99。

3.2 单机扩展成多机:各自Q表还是共享Q表

多无人机协同中有一条重要分岔路:每架无人机维护自己的Q表,还是多机共享一张Q表。

共享Q表意味着所有无人机都在同一个“状态-动作”价值表里学习,优点是收敛快、样本利用率高,缺点是学出来的是“平均最优”策略,无法体现不同无人机的差异化任务。各持Q表则能保留个体差异,但每架无人机都要从头探索,训练总时间随数量线性增长。常见的折衷办法是:类型相同、任务可互换的无人机共享一张Q表,用状态里的“本机编号”或“目标编号”区分各自任务;需要任务差异化时,给每架单独Q表,但把其他无人机轨迹视为环境动态。

这里需要注意一个细节:共享Q表时,如果所有无人机都往同一个目标点挤,防撞惩罚会把该区域的Q值全部拉低,结果谁也不敢靠近目标。所以在共享Q表方案里,目标点分配比Q表结构更关键,尽量让各无人机目标点分散开,或者在地图层面把目标点周围的安全间隔预留出来。

3.3 主仿真循环的多机骨架:顺序决策与防撞检查

下面给出5架无人机各自持有一张Q表的主循环骨架,包含多机顺序决策、机间距离检测和碰撞回退逻辑。这是整个仿真的核心框架,后面所有避坑和调参都围绕这个循环展开。

% UAV_Q_learning_multi.m 多机Q-Learning主循环骨架 nUAV = 5; startUAV = [1 1; 1 5; 5 1; 8 8; 12 3]; % 每行一架无人机起点 goalUAV = [18 18; 18 14; 14 18; 16 10; 17 17]; % 目标点 collisionTh = 1; % 机间安全距离阈值(栅格单位) states = startUAV; % 当前位置矩阵 Q = cell(nUAV, 1); for i = 1:nUAV Q{i} = zeros(nS_row * nS_col, nA); end epsilon = 0.3; for ep = 1:300 states = startUAV; done = false(nUAV, 1); steps = 0; while ~all(done) && steps < maxSteps steps = steps + 1; for i = 1:nUAV if done(i), continue; end % 选择本机动作 idxS = sub2ind([nS_row, nS_col], states(i,1), states(i,2)); if rand < epsilon a = randi(nA); else [~, a] = max(Q{i}(idxS, :)); end newPos = states(i,:) + actionSet(a,:); % 边界和障碍检查 if newPos(1)<1 || newPos(1)>nS_row || newPos(2)<1 || newPos(2)>nS_col reward = -10; newPos = states(i,:); elseif map(newPos(1), newPos(2)) == 1 reward = -10; newPos = states(i,:); else % 机间防撞检查 collisionPenalty = 0; for j = 1:nUAV if i == j || done(j), continue; end if norm(newPos - states(j,:)) <= collisionTh collisionPenalty = -50; newPos = states(i,:); % 回退原地 break; end end % 到达或常规步数惩罚 if isequal(newPos, goalUAV(i,:)) reward = 100; elseif collisionPenalty < 0 reward = collisionPenalty; else reward = -0.1; end end % Q表更新 idxOld = sub2ind([nS_row, nS_col], states(i,1), states(i,2)); idxNew = sub2ind([nS_row, nS_col], newPos(1), newPos(2)); oldQ = Q{i}(idxOld, a); maxQnext = max(Q{i}(idxNew, :)); Q{i}(idxOld, a) = oldQ + alpha * (reward + gamma * maxQnext - oldQ); states(i,:) = newPos; if isequal(newPos, goalUAV(i,:)) done(i) = true; end end end epsilon = max(0.05, epsilon * 0.995); % 探索率随回合衰减 end

这个循环里有一个容易被忽略的细节:更新是顺序决策,编号小的无人机先动,编号大的无人机在“当前时刻的新状态”下做防撞判断,相当于隐式引入了决策优先级。如果希望更接近真实的多机同时运动,就需要把“所有无人机先算好新位置,再统一检查距离、统一更新”改成同步更新模式,否则仿真结果会比现实乐观。回退原地这个操作也有讲究:在训练初期,回退会迫使无人机学到“碰撞导致行动无效”,但训练后期可能出现大量原地不动,这时需要调小collisionTh或者改成向安全邻域随机挪动一格。

3.4 状态里要不要包含其他无人机位置:协同感知的务实做法

如果无人机之间没有通信,只能依靠相对距离和方向避免碰撞,那么状态里应当包含与本机最近的其他无人机的相对方位、距离等级。包含全部无人机位置会导致状态维度爆炸;只取最近一架,再结合各自对目标点的独立规划,在20×20级别的栅格地图里通常够用。但只用“最近一架”信息有一个风险:当两架无人机同时向同一目标点移动、第三架从侧向逼近时,只考虑最近一架可能漏判。所以环境层面的防撞检查必须始终保留,作为兜底约束,不能让状态定义单独承担安全责任。

这种设计思路在文献里常被解释为部分可观察MDP(POMDP),不过MATLAB仿真时不必把POMDP的数学框架全引进来,只要在状态编码里带上“本机坐标+目标方向+最近他机相对方位”,Q表维度就可控,训练也能稳定。

4. 防撞落法:把距离、禁飞区与编队约束写进奖励

4.1 机间防撞判定:阈值距离和分级惩罚

机间防撞是这次仿真的核心看点。判定方式分两种:精确判定(同一时刻坐标完全重叠)和缓冲区判定(距离小于阈值即触发惩罚)。真实飞行里无人机有体积、有安全间隔,不可能要求完全重叠才算碰撞,所以仿真里用阈值判定更合理。

下面是我在多个栅格地图里复用过的防撞检查函数,输入本机新位置、他机当前位置和安全距离阈值,输出是否碰撞和附加惩罚值。

function [collision, rewardPenalty] = checkUAVCollision(posNew, posOther, collisionTh) % 机间防撞判定函数 % 输入:posNew本机新位置,posOther他机当前位置,collisionTh安全距离阈值 dist = norm(posNew - posOther); % 栅格坐标下的欧氏距离 if dist <= collisionTh collision = true; if dist == 0 rewardPenalty = -100; % 完全重叠,最严重 elseif dist <= 0.5 rewardPenalty = -60; % 高度接近 else rewardPenalty = -40; % 进入危险缓冲区 end else collision = false; rewardPenalty = 0; end end

需要说明的是,norm在坐标差为0时给出0,相邻栅格距离为1,collisionTh=0.8可以捕获“相邻栅格”的碰撞,collisionTh=1.5则会把斜对角临近也纳入危险范围。这个参数与地图栅格物理尺度强相关,不能照抄。如果仿真里一格代表实际10米,安全距离要求20米,collisionTh就应该设2.0;如果一格代表50米,阈值逻辑完全不同。惩罚分级能避免Q值在“安全”和“碰撞”之间剧烈跳变,让智能体在靠近但未重叠时也收到渐进信号,比一棒子打死更容易收敛。

4.2 禁飞区与静态障碍物的建模:先膨胀再标记

静态障碍物和禁飞区在栅格地图里就是一组值为1的格点。但有个落地细节:如果只标记障碍物本身占据的那一格,轨迹贴着障碍边缘通过时仿真里合法,真实飞行中却很可能因为无人机体积或气流翻车。所以一般先把障碍物按安全距离做膨胀,再写入地图,MATLAB里用imdilate对二值矩阵做形态学膨胀即可。

% 障碍物地图膨胀示例 obstacleMap = zeros(20,20); obstacleMap(5:7, 10:12) = 1; % 假设中间有一个矩形障碍 se = strel('square', 3); % 3x3结构元素,向外膨胀一圈 safeMap = imdilate(obstacleMap > 0, se); % 膨胀后的禁飞区

膨胀半径的选择同样要考虑栅格物理尺度。另外,如果禁飞区是动态的,可以把safeMap改成随时间变化的变量,每次计算奖励前重新检查。但动态禁飞区会显著增加训练难度,运行时要保持回合内地图一致:不能在一个回合中改地图改到一半,否则Q表收敛目标一直在漂移,奖励曲线会不停震荡。

4.3 为什么光靠碰撞惩罚不够:协同探索的奖励引导

实验里经常观察到这样一个现象:碰撞惩罚-100、到达+100,训练一段时间后无人机确实会避撞,但会出现有的无人机绕着目标转圈就是不敢落地的僵局。原因是碰撞惩罚过大,靠近目标可能经过其他无人机的安全区域,探索阶段踩雷次数太多,Q值里“接近目标”的路径价值被压低,智能体学会了保守策略。

可行的应对有几个:给成功到达设置终局奖励,把碰撞惩罚控制在不超过“绕路代价+终局奖励”的数量级;加入势场引导,若新位置比上一位置更接近本机目标、且不产生近距离冲突,给予小的正向奖励;或者改变探索策略,在回合后半段自动降低epsilon,促使无人机利用已学策略走回正轨。

我常用的组合是“靠近目标+0.5/步”的引导奖励配合碰撞惩罚-50。这三者数值配平后,Q表通常能收敛出可观察的稳定轨迹。具体数值要按地图尺寸和最短路长度重新标定,不要跨地图照搬参数。

5. 多无人机Q-Learning仿真避坑手册:收敛慢、维度爆炸、奖励震荡

5.1 现象:训练300轮后路径仍然不是最短,甚至原地转圈

原因分析:奖励参数里每步-0.1的权重太低,探索阶段绕路和碰撞的负面影响被“到达+100”的终局奖励覆盖,智能体没有足够强的“少走冤枉路”信号,Q表里多条等价值路径并存,行为随机性偏高。

解决:把每步负惩罚提高到-0.5到-1之间,再把回合最大步数设成最短路长度的1.2到1.5倍。同时检查折扣因子gamma是否太低,gamma=0.5这种取值会让远期到达奖励的现值严重缩水,无人机只盯着眼前一步,自然不走长路。把gamma提到0.9以上,路径倾向会明显改善。

5.2 现象:状态空间爆炸,Q表维度大到MATLAB内存吃紧

原因分析:多无人机状态全部拼接,每增加一架无人机,状态数按网格数乘方增长。20×20地图,5架无人机全量坐标拼接,状态数是400的5次方量级,任何机器都扛不住。

解决:不要裸拼坐标。改用“本机坐标+本机目标方向+最近他机相对方位”的组合,每个智能体一张小Q表,状态维度立即降到可控范围。或者多机共享一张Q表,但状态里加“本机编号”和“目标编号”两个维度,也能显著压缩总体内存占用。第三种做法是把其他无人机直接视为动态障碍物写进奖励,状态里完全不编码它们,靠防撞惩罚驱动避让行为,但对随机初始位置较多的场景鲁棒性偏差,不推荐作为首选。

5.3 现象:累积奖励曲线不断震荡,调小alpha也不见好

原因分析:奖励数量级严重不平衡。碰撞惩罚-1000、到达奖励+100这种配比会让Q值更新出现数量级缺口,任何靠近碰撞边缘的探索都会把Q值瞬间拉低,而到达信号迟迟不来,表现出来就是曲线上下剧烈跳动。

解决:把所有奖励统一到-100到+100区间,并且让单步行动带来的奖励变化维持在终局奖励的5%左右。比如到达+100,每步惩罚就在-1左右,碰撞惩罚比到达略重但不超过到达奖励的2倍。平衡后观察累积奖励曲线的斜率是否单调上升,再微调具体数值。奖励曲线在同一数量级内波动,Q表的稳定性会明显提升。

5.4 现象:训练结束时仍有个别无人机始终无法到达目标

原因分析:初始位置或目标位置设置不合理。比如某一架无人机的起点被障碍物包围,或者目标点与其他无人机目标过近,任何到达路径都不可避免触发碰撞惩罚,Q值里到达目标的价值被压制到比绕圈还低。

解决:第一步检查地图连通性,可以用flood fill或A*算法为每架无人机算出一条可行路径,确认目标可达。第二步分配目标点时,避免两个目标点距离小于2倍安全阈值。用代价矩阵做最小匹配分配比随机指派可靠得多。如果只是做演示,手动指定一组不冲突的起讫点列表即可,不必引入完整任务分配算法。

5.5 现象:仿真结束导出轨迹后发现两架无人机轨迹穿过同一格

原因分析:防撞判定只在移动后检查“本机新位置vs其他机当前位置”,忽略了对方同时也在移动的情况。例如两机对向而行,各自的新位置单独检查时都合法,但交换位置的过程中会在中途交叉,顺序决策模式无法捕获这种并发冲突。

解决:改为“同步更新+统一验证”。先缓存所有无人机的新位置,再两两检查新位置之间的相对距离,若非法则让编号靠后的无人机回退。如果保留顺序决策的仿真效率,就限制每步移动不超过一格且不使用斜向动作。交叉碰撞是否能被捕获,取决于collisionTh是否大于1,比如collisionTh设为1到2个栅格距离时,对向交换位置也能被判定为危险接近。

6. 从能跑到可信:结果可视化、参数分析与一点扩展方向

一个只能打印奖励曲线的Q-Learning仿真,说服力很弱。正常流程是把训练好的策略单独跑一遍最终测试,画出四张图:栅格轨迹图、每轮累积奖励曲线、防撞距离随步数变化图、最终路径与障碍物相对位置图。轨迹图把障碍物涂黑、目标点标星、每架无人机用不同颜色描出路径,如果多条路径在安全距离内交叉,说明协同策略还没到位。奖励曲线看三个点:是否在150轮内进入稳定区、是否单调上升、方差是否逐渐收窄。防撞距离图用来验证全程机间距离大于阈值,空有奖励曲线涨得好、距离时序却破阈,说明碰撞判定条件有bug。

参数敏感性分析是让仿真结论可信的关键一步。固定地图和目标点,分别把alpha从0.1调到0.3、gamma从0.9调到0.99、epsilon衰减率从0.995调到0.99,记录到达率和平均路径长度。这组实验能直接回答“为什么选这些参数”,也是答辩和项目文档里最有价值的素材。我自己写MATLAB时会把网格尺寸、奖励表、训练回合都放进一个结构体变量,参数扫描只需要一个for循环,完全不用改仿真主体代码。

如果还想往前推进,我推荐两个扩展方向:一是把离散动作换成连续动作,从Q-Learning迁移到DQN或TD3框架,与MATLAB强化学习工具箱对接;二是在多智能体层面做独立Q学习和共享Q表的消融对比,观察哪种协作机制在相同地图和任务下更稳定。做扩展时保留当前Q-Learning版本作为baseline,否则换框架后效果变差,你很难判断是算法问题还是奖励函数在新状态表示下失配。

我个人的习惯是,每次改完奖励或地图,先跑20轮看Q表是否快速出现非零差异。如果20轮里Q表几乎没变化,一定是离散化粒度或奖励尺度出了问题。多无人机协同这个方向,算法本身不算难,难的是状态定义怎么取舍、惩罚怎么配平、防撞检查放在哪个环节。把这些基础工作做扎实,后面的深度强化学习版本才有真正发挥的空间。希望帮到你。

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

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

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

立即咨询