资讯详情 Matlab强化学习二维地图源码解析:Q-learning栅格寻路实战
📅 2026/10/28 14:15:01
简介这份MATLAB强化学习源码包面向正在入门强化学习或希望结合MATLAB实战的读者以经典二维迷宫为环境演示智能体如何通过试错交互寻找从起点到终点的最优路径完整契合“状态、动作、奖励、策略”的核心思想。压缩包共3个文件均为.m脚本体积仅2KB三个脚本分别对应主流程控制、动作选择与环境反馈短小精悍非常适合逐行拆解与二次修改。目前已有218人学习下载。配套代码虽精简却覆盖了Q-learning类算法从初始化、探索到更新的完整闭环读者可以清晰看到智能体如何在死胡同中获得负奖励并逐步调整策略在此基础上修改迷宫布局或奖励函数还能进一步尝试SARSA、DQN等不同强化学习方法从而深入理解算法在动态环境中寻找最优解的过程。1. 拿到一套 matlab 源代码强化学习算法二维地图我建议你先这么玩说真的第一次见到“matlab源代码强化学习算法二维地图.rar”这个压缩包的人多半是卡在了课程设计或者入行强化学习的第一步上想在二维栅格地图里让一个智能体自己学会找路翻遍全网找到一套 Matlab 写的强化学习源码解压开却不知道先看哪个文件、哪些参数要动、为什么训练了半天智能体还在原地打转。这个 rar 包对应的正是这类需求——用 Matlab 原生代码实现经典的强化学习算法通常是 Q-learning 或 SARSA跑在一个用二维数组表示的格子地图上智能体靠试错学会从起点走到终点。适合的人群很明确刚接触强化学习的本科生、要交图像处理或智能算法大作业的在读生、以及想快速验证“换个地图还能不能收敛”的算法爱好者。这篇文章我按自己把类似源码跑通、改透、踩完坑的顺序来讲保证你照着做能复现而且知道每一步在干什么。2. 拆开压缩包二维地图强化学习源码的构成、算法选型与三个核心设计2.1 rar 里大概率躺着的文件划分主脚本、环境函数、智能体核心与画图工具先用 7-Zip 或 WinRAR 解压。注意 rar 文件用 7-Zip 解压通常没问题但如果你双击发现文件列表是乱码先别急着删包把系统区域设置里的“Beta 版: 使用 Unicode UTF-8 提供全球语言支持”勾上重新解压一次这条路我走通过。解压后典型的结构是一个 main 或 demo 开头的脚本点开就能跑、一个定义地图和转移逻辑的函数文件比如 gridworld.m、一个实现智能体决策和更新的核心函数比如 qlearning.m、一个负责画轨迹和收敛曲线的绘图脚本。有的包会把地图直接写在 main 里用一个大矩阵表示例如用 0 代表可通行、1 代表障碍物、2 代表终点这也是最常见的地图编码方式。我建议的阅读顺序不是按文件名而是按数据流走先打开地图定义处搞明白智能体从哪个格子出发、终点在哪、障碍物怎么标再打开 reward 计算处看每走一步会拿到什么数值最后再读更新公式处确认它是 Q-learning 还是 SARSA。原因很直接强化学习源码最容易改坏的地方不是算法核心而是地图维度与状态编号对不上地图看懂了后面报错你一眼就能定位。2.2 为什么二维栅格地图上首推 Q-learning而不是深度强化学习二维地图这个场景其实是最适合“表格型强化学习”的经典问题。地图如果是 10×10状态空间就是 100 个格子动作空间是上下左右四个方向一张 Q 表 100×4 就能装下全部状态-动作对的价值估计。这种规模下用 DQN 这类深度强化学习算法反而会出现典型的“杀鸡用牛刀”问题深度网络需要大量样本拟合训练一轮要跑几千步而表格型 Q-learning 几十轮就能收敛到一条可用路径。不少初学者看热搜词“深度强化学习算法”很火就想把代码改成神经网络版本我劝你先别。二维地图状态少、转移规则明确Q-learning 既快又可解释训练完直接把 Q 表打印出来每个格子往哪走一目了然排错成本远低于神经网络。从原理上讲Q-learning 更新的是“在状态 s 下执行动作 a 的长期回报期望”更新公式是Q(s, a) Q(s, a) α [ R γ max_a Q(s, a) - Q(s, a) ]其中 α 是学习率γ 是折扣因子s 是执行动作后的下一个状态。因为目标策略用的是 max_a Q(s, a)所以 Q-learning 属于离策略算法它学的是“最优策略”哪怕当前探索时走了一步烂棋更新目标依然指向当前状态下最优的动作。SARSA 则不同目标改成 Q(s, a)跟着当前策略走。二维地图里两者都能用但 Q-learning 由于更新更激进通常收敛更快因此大多数此类源码包里实现的都是 Q-learning。2.3 状态空间、动作空间、奖励函数改这三处就等于换了张地图这套代码能不能迁移到自己的地图上关键就在这三个设计。状态空间每个网格是一个状态。代码里常见做法是把二维下标转成一维编号即 state sub2ind([rows, cols], r, c)或者反过来用 [r, c] ind2sub([rows, cols], state)。这里最容易出错的是 Matlab 的索引从 1 开始Python 转过来的同学经常在这里栽跟头后面避坑章节我会展开讲。动作空间固定为 4 个整数通常编码为 1上、2下、3左、4右或者用向量表示 dirs [-1, 0; 1, 0; 0, -1; 0, 1] 分别对应行减一、行加一、列减一、列加一。注意行坐标对应的是矩阵的行号也就是说“上”等价于行号减 1不是屏幕上的 y 轴减少。奖励函数常见设计是到达终点给 50 或 100撞障碍物罚 -10正常走一步给 -1。这个“每步 -1”看起来不起眼却是让智能体学会走最短路径的关键如果每一步没有代价智能体在空旷区域会兜圈子到达终点设了每步 -1它才会设法用最少的步数到达。奖励的数值相对比例比绝对值更重要。我一般会让终点奖励明显大于最坏路径的总步数惩罚否则智能体可能倾向于“绕过”终点附近的高惩罚区域。3. 在 Matlab 里把二维地图强化学习跑通的完整步骤与参数调法3.1 环境准备装哪个版本、需要哪些工具箱、解压后路径怎么组织先说版本。这套代码只要是 R2020b 或更新的版本都能直接跑不需要追着 “matlab 2026b” 这种新版本跑。它没用到强化学习工具箱Reinforcement Learning Toolbox的特有函数纯手写的 Q-learning 只依赖基础矩阵运算。下载安装时注意安装路径不要带中文和空格比如别装在 D:\编程软件\Matlab 这种路径下这会让 rar 解压出来的中文路径脚本读取出错。开个玩笑这是玄学但我确实见过因为路径带空格导致 load 函数找不到文件的。装完后确认一下 MATLAB 当前目录pwd已经切到解压后的目录再运行主脚本不然会报“未定义函数或变量”。常见做法是脚本运行前统一加一段路径处理代码避免手动切目录% 自动切换到源码所在目录 scriptPath fileparts(mfilename(fullpath)); cd(scriptPath); % 若需要保存训练结果建一个输出目录 if ~exist(output, dir) mkdir(output); end这段代码的作用是无论你在哪个目录运行脚本都会先跳到源码自身所在的目录同时确保输出目录存在。参数说明mfilename(fullpath) 返回当前脚本的绝对路径fileparts 只取目录部分cd 切换当前目录。如果你用实时脚本 .mlx 文件这段逻辑也能用但要注意 .mlx 里 mfilename 行为略有不同更稳妥的做法是直接用“设置当前文件夹”按钮切过去。3.2 网格地图的表达把二维数组变成智能体能读的状态图地图这一步我建议单独写成一个函数不要直接塞在主脚本里。原因是后续你要做多地图对比实验地图函数独立出来只需要改返回值主脚本完全不用动。经典写法如下function [map, startIdx, goalIdx] initMap() % 定义二维栅格地图: 0可通行, 1障碍物, 2终点, 3起点 map [ 0 0 0 0 0; 0 1 1 0 0; 0 0 0 1 0; 0 1 0 0 0; 0 0 0 2 0 ]; % 找到起点和终点的线性索引 startIdx find(map 3); goalIdx find(map 2); end这段代码的逻辑用一个小规模 5×5 地图演示第 2 行第 2、3 列和第 3 行第 4 列、第 4 行第 2 列是障碍物终点标为 2起点标为 3。find(map 3) 返回起点在矩阵中的线性索引Matlab 的线性索引按列优先排列即从左到右、从上到下依次编号第 1 列第 1 行是 1第 1 列第 2 行是 2以此类推。这一步是整个代码里最值得你亲手改的地方把 map 矩阵换成你自己的地图程序的其他部分不需要动强化学习算法会自动适应新的状态转移。3.3 Q-table 初始化与训练主循环核心代码逐段拆解训练主循环是整套源码的心脏。我按最经典的实现方式拆成三段给你看。第一段是初始化参数和 Q 表% 训练超参数 alpha 0.1; % 学习率更新步长 gamma 0.9; % 折扣因子未来奖励的衰减 epsilon 0.9; % 初始探索概率 epsilonMin 0.1; % 探索概率下限 epsilonDecay 0.995; % 每轮衰减系数 episodes 500; % 训练轮数 maxSteps 200; % 单轮最大步数防止死循环 % Q表: 行状态数, 列4个动作 numStates numel(map); Q zeros(numStates, 4);逻辑说明Q 表初始化为全零是因为我们对每个状态-动作的价值一无所知从零开始迭代。alpha 取 0.1 是保守值更新平稳但收敛偏慢如果你发现收敛太慢可以逐步调到 0.3。gamma 取 0.9 意味着智能体更看重长期回报适合路径规划这种需要往前看多步的任务。第二段是训练主循环里的状态转移与回报计算% 动作定义: 1上, 2下, 3左, 4右 dirs [-1, 0; 1, 0; 0, -1; 0, 1]; for ep 1:episodes state startIdx; totalReward 0; for step 1:maxSteps % epsilon-greedy: 以epsilon概率随机探索 if rand epsilon action randi(4); else [~, action] max(Q(state, :)); end % 计算下一个状态的下标 [r, c] ind2sub(size(map), state); nr r dirs(action, 1); nc c dirs(action, 2); % 边界处理: 出界视为撞墙罚分并保持原地 if nr 1 || nr size(map, 1) || nc 1 || nc size(map, 2) reward -10; nextState state; else nextIdx sub2ind(size(map), nr, nc); if map(nextIdx) 1 reward -10; % 撞障碍物 nextState state; elseif map(nextIdx) 2 reward 50; % 到达终点 nextState nextIdx; else reward -1; % 正常走一步 nextState nextIdx; end end % Q-learning 更新公式 bestNext max(Q(nextState, :)); Q(state, action) Q(state, action) alpha * (reward gamma * bestNext - Q(state, action)); state nextState; totalReward totalReward reward; if state goalIdx break; end end % 每轮结束衰减探索率 epsilon max(epsilonMin, epsilon * epsilonDecay); end这段代码的逻辑重点有两个。其一边界处理用的是“保持原地并罚分”策略智能体撞墙时位置不变但 Q 值会被拉低经过多轮学习它自然学会避开边界动作。其二Q-learning 的更新公式中 bestNext 是下一个状态下所有动作的最大 Q 值这是离策略算法的核心体现。参数建议epsilon 从 0.9 开始衰减到 0.1 是比较标准的做法前几十轮充分探索后期更多利用已学策略。如果你发现智能体后期路径稳定但开始兜圈子把 epsilonMin 调低到 0.05 试试。3.4 训练完怎么看效果策略可视化的最简单实现训练完毕后把 Q 表里每个状态的最优动作画成箭头图是最直观的验证手段。这也是这类 rar 包通常自带的画图函数如果你手里那份没有照下面写一份也不难% 可视化最优策略: 每个网格画一个箭头指向最优动作 figure; hold on; for s 1:numStates [r, c] ind2sub(size(map), s); if map(s) 1 continue; % 障碍物不画 end [~, act] max(Q(s, :)); % 箭头方向和长度 switch act case 1, dr -0.3; dc 0; case 2, dr 0.3; dc 0; case 3, dr 0; dc -0.3; case 4, dr 0; dc 0.3; end quiver(c, r, dc, dr, MaxHeadSize, 0.3); text(c, r, num2str(s), FontSize, 6, HorizontalAlignment, center); end逻辑说明quiver 画箭头参数分别是 x 坐标列、y 坐标行、x 方向分量和 y 方向分量。因为 Matlab 图像坐标的 y 轴向上而行号向下这里没有做坐标翻转所以画出来的箭头视觉上可能与地图的上下方向相反请以数值结果为准。这个细节也算是这套代码最常见的“看着别扭但没毛病”的坑了。4. 二维地图强化学习运行中的 6 个常见坑现象、原因与解决4.1 训练不收敛总奖励在波动现象跑了 500 轮累计奖励曲线还是像心电图一样来回跳智能体偶尔到终点、偶尔又迷路。原因最常见的是奖励函数设计不匹配。如果每步 -1 的惩罚太重比如终点奖励只有 10而走到终点的最短路径也要 20 步智能体累计能拿到的负奖励远大于终点的正奖励它学到的“最优策略”反而可能是走到某个角落停下来。这属于奖励密度的核心问题。解决把终点奖励提到 100或者把每步惩罚改成 -0.1让“到达终点”这件事在数值上明显优于“原地待着”。我一般建议终点奖励 最短路径步数 × 每步惩罚的绝对值留出 2 到 3 倍裕量。4.2 智能体学会了走弯路现象训练收敛后智能体能从起点到终点但走的是明显更长的路径甚至在地图里画了一个大弧线。原因epsilon 探索率衰减太快智能体还没学会最短路径就进入了低探索模式把一条早期偶然发现的可达路径固化了。这是典型的探索-利用失衡。解决把 epsilonDecay 从 0.995 改成 0.999让探索期更长或者把训练轮数从 500 加到 1000。另一个技巧是记录每一轮到达终点时的步数如果 200 轮之后步数还在下降说明还没学透不要急着停。4.3 Matlab 索引从 1 开始导致的坐标错位现象智能体行动方向与预期相反地图上看起来“往上走”实际在往下。原因很多从 Python 转过来的同学默认了 0 起始索引直接把行号减 1 当作向上但在 Matlab 里第 1 行在最上面减 1 就会变成第 0 行Matlab 会报错或者把 0 当作逻辑索引导致异常行为。即便代码逻辑没错ind2sub 和 sub2ind 的列优先顺序也容易让人混淆。解决统一用 dirs [-1, 0; 1, 0; 0, -1; 0, 1] 这个方向表让动作和数据解耦。改动作编号时只动这个表中间的一行其余逻辑全部不动。另外调试时多用 disp([r, c, nr, nc]) 打印坐标变化肉眼确认移动方向正确再继续。4.4 终点被障碍物围死智能体永远学不会现象地图本身就没有通路智能体无论如何探索都到不了终点训练曲线一路向下。原因这类 rar 包自带的地图经过验证但你自己改地图时很容易画出“终点被障碍物完全包围”的不可达布局。强化学习只能学到地图里存在的通路map 函数返回什么它就学什么。解决改完地图先跑一段连通性检查用广度优先搜索扫一遍确认起点和终点连通。不要偷懒跳过这一步我在这里翻过车改完地图跑了一整晚没收敛才发现终点的上下左右全是 1。4.5 训练极慢每轮都要跑满 200 步现象episodes 500每轮 maxSteps 200大部分轮次都跑满步数训练耗时很长。原因初期的纯随机探索时智能体只能靠运气碰终点尤其在地图比较大比如 30×30的时候盲探索找到终点的概率极低大部分轮次都在到处乱撞直到步数上限。解决用“奖励塑形”加速初期学习。比如智能体每次靠近终点一个格子就多给一点正向奖励或者在地图上预置一条从起点到终点的引导路径奖励。注意塑形奖励在 Q-learning 中需要谨慎设计因为 Q-learning 对奖励函数的变换不保证学习到最优策略但单纯用它加快前期的“碰运气”阶段是没问题的。4.6 rar 包解压出错或源代码报编码错误现象解压时提示文件损坏或者代码注释出现乱码脚本能跑但中文注释全是问号。原因rar 压缩包在网络上传播时经过多次转存文件头可能破损部分压缩包内的代码文件编码是 GBK被现代 Matlab 按 UTF-8 读取就会乱码。解决解压失败时先换工具7-Zip 比 WinRAR 更能容忍损坏的 rar 包必要时尝试用 7-Zip 的“强制恢复”模式。编码乱码不影响运行但要改代码的话建议用记事本另存为 UTF-8 编码再交给 Matlab。备份原文件这招是后悔药。5. 从能跑到会用把源码改造成自己的二维地图实验台跑通之后这套源码真正的价值才显现出来。我建议你做三件事把“能跑”变成“能用来验证算法观点”。第一件事是随机地图生成器。把 initMap 函数里的固定地图替换成按随机种子生成的地图例如每次用 rand(rows, cols) 0.2 生成 20% 障碍密度的随机地形并调用一次 BFS 确认连通。这样你可以一次跑 50 张地图统计平均收敛轮数和平均路径长度这份数据写进课程设计报告里非常扎实比单张地图的截图有说服力得多。第二件事是换算法对比。把 Q-learning 的更新公式改成 SARSA即把 Q(state, action) 的更新目标从 max(Q(nextState, :)) 改成 Q(nextState, nextAction)其中 nextAction 按当前策略含 epsilon 探索选出。只需要改两行代码你就能拿到同一张地图上两种算法的收敛速度对比。这是很常见的实验需求自己做一遍比看十篇综述都管用。第三件事是训练过程的动态可视化。如果你不想等到训练完才看结果可以在每轮结束后用 refreshdata 更新智能体当前位置的散点图配一个 pause(0.01)就能看到智能体逐步改进路径的动画。这个动画用来答辩演示效果很好但注意训练轮数多时它会显著拖慢速度跑实验时建议关掉出结果时再打开。最后说一个经验调试这类源码时先把地图缩到 4×4训练轮数减到 50跑通后再逐步放大。小地图上很容易确认 Q 表每个值是否符合直觉一旦放大后出问题再回头用小地图复现比对。这是我自己反复验证过最省时间的做法希望帮到你。本文还有配套的精品资源点击获取