恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Matlab实现Q-learning迷宫路径规划:从原理到代码实战

  • 首页
  • 资讯中心
  • /
  • Matlab实现Q-learning迷宫路径规划:从原理到代码实战

相关资讯

电动推杆是用梯形丝杆还是滚珠丝杆?一文看懂 2026/10/16 8:47:47
图片边缘到底怎么提取?用华为云码道开发 OpenCV Canny 参数可视化工具 2026/10/16 8:47:47
Capture CIS 17.4 ORCAD Capture CIS 原理图跑DRC错误 2026/10/16 8:47:47

最新资讯

贴吧私信助手v1.0实战:Python自动回复与Cookie会话管理
AI Agent卖铲人指南:从工具链到基础设施的蓝海机会
ChatGPT桌面端不显示最新模型的解决办法
具身智能泛化验证:从Figure的56%看机器人真实成功率评测体系
CAN 总线高层协议与 CAN FD
BrowserSkill:基于Chrome DevTools协议的命令行浏览器自动化框架

今日推荐

Java八种基本类型深度解析:从内存布局到实战选型
基础:常用快捷键——IDEA、VS Code、PyCharm 与 Linux 终端效率速查
解决ultraedit下verilog .v文件中文注释乱码:把编码配置改到TaoToken辅助排查

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Matlab实现Q-learning迷宫路径规划:从原理到代码实战

发布时间:2026/10/16 8:52:48
Matlab实现Q-learning迷宫路径规划:从原理到代码实战 1. 项目思路拆解为什么用Q-learning解迷宫迷宫路径规划这件事听起来像是个数据结构问题用最普通的深度优先、广度优先甚至A*算法都能解决。但当你把场景切换到“机器人”上问题性质就变了机器人事先并不知道完整地图它只能感知当前位置然后试探性地走一步、观察结果、再决定下一步。这种“走一步看一步”的场景正是强化学习发挥作用的舞台。Q-learning在这个项目里的定位不是去替代A*这类全局规划算法而是解决“在未知环境中通过试错学会策略”的问题。机器人被放进一个网格迷宫起点固定终点固定墙壁分布提前设定好但机器人自己不知道全貌。它唯一能做的就是不断尝试撞墙了得到一个负反馈到达终点得到一个正反馈。经过大量回合的训练机器人会把每个状态下每个动作的长期收益“学到”Q表里最终拿到一张能指引它从起点走到终点的行动地图。从教学和工程验证的角度看这个项目最大的价值在于它用最简单的离散状态和离散动作把强化学习的核心链条完整跑通了一遍。状态空间、动作空间、奖励函数、Q表更新、探索策略、训练收敛、结果可视化一个不缺。而且Matlab的矩阵操作和绘图能力天然适合这类网格环境的快速搭建和直观演示不需要像Python那样额外装一堆可视化库。对于刚接触强化学习、又习惯Matlab环境的人来说这是一条非常平滑的上手路径。我见过不少人一上来就啃深度强化学习读论文、抄代码结果被各种网络结构、经验回放、目标网络折磨得够呛回头连Q-learning的基本原理都说不清楚。其实DQN那一整套复杂机制本质上都是在解决Q-learning在高维连续状态下的瓶颈。先把离散版的Q-learning吃透后面看任何强化学习算法都会轻松很多。2. 迷宫环境设计与状态动作建模做这个项目第一步不是写算法而是把迷宫这个“环境”定义清楚。环境定义得越准确后续代码越省事训练效果也越可控。2.1 地图的网格化表示我习惯用数值矩阵来表示迷宫地图。0表示可通行空地1表示墙壁2表示终点起点通常设定为(1,1)也就是矩阵左上角。以经典的10×10网格为例% 地图定义0空地 1墙壁 2终点 map [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0; 0, 1, 0, 1, 1, 1, 1, 1, 0, 0; 0, 1, 0, 0, 0, 0, 1, 0, 0, 0; 0, 0, 0, 1, 1, 0, 1, 0, 1, 0; 0, 1, 0, 0, 0, 0, 0, 0, 1, 0; 0, 1, 0, 1, 1, 1, 1, 0, 1, 0; 0, 1, 0, 0, 0, 0, 0, 0, 1, 0; 0, 1, 1, 1, 0, 1, 1, 0, 1, 0; 0, 0, 0, 0, 0, 0, 1, 0, 0, 0; 0, 1, 0, 1, 0, 1, 1, 0, 2, 0; ];这种表示方式有两个好处第一矩阵是Matlab的原生数据类型索引、判断、绘图都极其方便第二地图的修改成本极低想换个迷宫结构改几个数字就行算法代码一行不用动。2.2 状态空间与坐标编码在这个项目里每一个网格单元就是一个状态。10×10的地图理论上状态空间是100个。但实际有效状态要扣除墙壁占据的格子因为机器人不可能站在墙里。状态空间的规模直接决定Q表的大小这也是Q-learning只能用于小规模离散环境的原因——状态一多Q表就爆炸。我在代码里习惯直接用线性索引作为状态编号也就是把二维坐标通过sub2ind转换成1到N的一维数字。这么做的好处是Q表的行索引变得干干净净行号就是状态编号免去了维护坐标映射表的麻烦。需要反查坐标时用ind2sub转回来即可。% 将二维坐标转为线性索引 state_idx sub2ind([rows, cols], row, col); % 将线性索引转回二维坐标 [row, col] ind2sub([rows, cols], state_idx);2.3 动作空间与边界处理机器人的动作空间就四个上、下、左、右。我习惯用数字1到4表示方便在Q表列索引里直接使用。这四个动作对应到坐标上的变化就是一个简单的方向向量表% 动作定义1上 2下 3左 4右 actions 4; direction [-1, 0; % 上 1, 0; % 下 0, -1; % 左 0, 1]; % 右动作设计里最容易翻车的地方是边界和墙壁处理。机器人如果在地图边缘还想往地图外走或者撞上了墙壁格子这该怎么算我在项目中采用的策略是撞墙和越界都视为“非法移动”机器人位置保持不变同时给一个负奖励。这里有一个常见的认知误区——很多人以为撞墙后机器人应该留在原位但实际上“撞墙后代理状态不转移”和“撞墙后代理被弹回”是两种不同的设定对学习效果的影响完全不同。我测试下来的经验是撞墙后保持原位更合理因为这样Q表里“在墙边状态选择撞墙动作”的Q值会稳定地走低机器人会逐渐学会避免这种选择。如果采用弹回机制反而会造成状态转移的混乱拖慢收敛速度。2.4 奖励函数设计收敛速度的关键奖励函数是强化学习项目里最值得花心思的地方我把它单独拿出来细说。基于这个迷宫场景一个基础的奖励设定是到达终点100撞墙或越界-10正常移动-1到达终点给大正奖励这个不用解释。撞墙给负反馈是为了让机器人学会避开墙壁。那正常移动为什么也要给负奖励这里藏着一个细节如果不给“每走一步”设置代价机器人可能会在迷宫里绕远路甚至原地打转反正只要能到终点就是100路径长无所谓。加上每步-1的惩罚后Q-learning就会自动在“到达终点的奖励”和“路径长度的消耗”之间做权衡最终学到的策略自然倾向于最短路径。这个设计思路其实就是让“距离”成为隐式的优化目标。如果只想验证“能到终点”可以把步数惩罚设成-0.1甚至0收敛会更快但如果想让路径也有实用价值步数惩罚不能省。我在实际项目里试过步数惩罚从0降到-1最终路径长度有明显缩短。3. Q-learning算法核心公式推导与参数选择3.1 Q值迭代公式的本质理解Q-learning的核心就是一张Q表和一个更新公式。Q表的行是状态列是动作表中的数值表示“在状态s下执行动作a未来能获得的累计奖励期望”。一旦这张表训练好了决策就变得极其简单看当前状态对应行里哪个动作的Q值最大就执行哪个动作。Q值的更新公式如下Q(s,a) ← Q(s,a) α * [R γ * max(Q(s,a)) - Q(s,a)]这个公式看着复杂拆开就清楚多了。R是执行动作后获得的即时奖励γ * max(Q(s,a))是“未来收益的最大估计”R γ * max(Q(s,a))就是当前动作的真实价值目标。Q(s,a)是当前估计值两者做差就是“估计误差”。乘以学习率 α 之后把误差修正回原来的估计值里。可以这么类比Q-learning的学习过程像一个人反复走同一条路第一次走错了一个路口吃了亏回来后他会修正自己对这个路口的判断下次再到这个路口时他就知道该选哪边了。回合越多修正越精确最后每个路口的判断都稳定下来这就是Q表收敛的过程。max(Q(s,a))这个取最大值的操作就是Q-learning被称为“离线策略”算法的原因。它更新当前状态时用的不是机器人实际执行的下一步动作而是后续状态里理论上最优的那个动作。这意味着机器人即使偶尔“犯傻”走了差路线回头看时依然会按照“如果当时走最优路线会怎样”的逻辑进行修正。这一点保证了Q-learning在探索和利用之间能够保持平衡。3.2 学习率α、折扣因子γ与探索率ε三个核心参数的选取直接影响训练效果我分别说一下我的调参经验。学习率 α控制每次更新的修正幅度取值0到1。α越大新信息对Q值的修正越激进α越小Q值变化越平缓越稳定。迷宫这种确定性环境同样的状态动作组合一定产生同样的结果α可以稍微取大一点0.1到0.5之间都比较合适。我常用0.5收敛速度比较理想。如果环境是随机的比如动作执行有概率失败那α需要调小到0.1甚至更低防止Q值震荡。折扣因子 γ控制未来奖励的权重取值0到1。γ越接近1机器人越看重远期回报γ越小机器人越短视。迷宫场景下γ取0.9是个比较标准的选择。有点要注意的是γ取1在无限步长的任务里可能导致Q值不收敛所以即使想强调远期收益也不要取到1。探索率 ε控制机器人做随机探索的概率。这是整个训练过程中最需要动态调节的参数。训练初期ε应该设大比如0.8到1.0让机器人大胆尝试各种路径训练后期ε应该变小让机器人更多利用已经学到的好策略。我采用的方法是随训练回合数线性衰减epsilon max(0.01, 1 - episode / max_episode * 0.99);这样训练一开始探索率接近1机器人几乎全在乱逛随着回合数增加探索率逐渐降到0.01此时机器人的行为接近完全“贪心”——只走Q值最高的路线。这个衰减策略基本可以无脑用效果非常稳定。3.3 Q表初始化策略Q表初始化为全零是最常见的做法。原因很简单初始时机器人对所有状态动作组合的价值一无所知先用0当作“中立”的起点。但也有一种做法是把Q表初始化为较小的正值比如全部设为0.01。这样做的好处是机器人初期会更倾向于探索因为无论选哪个动作Q值都一样一旦某个动作被尝试并得到正奖励它的Q值就会比其他未探索的动作稍微高一点。也就是说小正数初始化天然带有乐观探索的味道。相比之下如果Q表初始化为负数机器人会倾向于“什么都不做”因为这比探索带来的负反馈风险更小这会严重影响训练初期的探索效率。我还是推荐全零初始化简单可靠。实际测试下来在迷宫这种小规模环境里初始化方式的差异对最终收敛结果影响很小真正的关键在于奖励函数和探索策略。4. Matlab代码架构与核心模块实现代码的总体结构分四个模块环境初始化、动作选择、Q表更新、训练主循环。拆成这样每块功能独立调试起来非常舒服。4.1 环境初始化与Q表创建% 环境参数 rows size(map, 1); cols size(map, 2); start_state 1; % 起点即(1,1)的线性索引 goal_state find(map 2); % 找到终点的线性索引 % 可通行状态数 walkable find(map ~ 1); n_states length(walkable); % 实际有效状态数 % Q表初始化为零 Q zeros(n_states, 4); % 训练参数 alpha 0.5; % 学习率 gamma 0.9; % 折扣因子 max_episode 500; % 最大训练回合数 max_step 200; % 单回合最大步数防止死循环这里有个细节Q表的行数用的是“可通行状态数”而不是总的网格数。这样做能省一点内存但更重要的是保证了状态索引的有效性。实现上需要建一个从线性索引到Q表行号的映射表state_mapping zeros(rows * cols, 1); for k 1:length(walkable) state_mapping(walkable(k)) k; end这个映射表的作用是机器人当前所在位置的线性索引通过它转换成Q表的行号取Q值、更新Q值都在这个行号上进行。终点虽然在地图上标记为2但它同时也是可通行状态所以在映射表里同样占有一个行号。4.2 动作选择ε-greedy策略function action choose_action(Q, state, epsilon, actions) if rand epsilon % 随机探索 action randi(actions); else % 利用最优策略 [~, action] max(Q(state, :)); end end这段逻辑很简单但有一个细节值得注意max(Q(state, :))在Q值相同的时候默认返回第一个最大值的索引。这意味着如果某个状态下所有动作的Q值都是0机器人会一直倾向于选择动作1上。这会让探索变得不充分。改进的方法是在Q值并列最大时随机选择一个function action choose_action(Q, state, epsilon, actions) if rand epsilon action randi(actions); else max_q max(Q(state, :)); best_actions find(Q(state, :) max_q); action best_actions(randi(length(best_actions))); end end这个改进非常重要。在训练初期Q表大部分值都是0如果直接取第一个最大值机器人会忽略其他同样未知的动作导致某些路径从来没被探索过。我见过不少人在这个细节上翻车训练出来的路径总是绕着某一条走换条更短的路径也发现不了很典型的问题。4.3 状态转移与环境交互这一步是环境中最容易出bug的地方需要同时处理越界、撞墙和到达终点三种情况function [next_state, reward, done] step(map, state, action, rows, cols) [row, col] ind2sub([rows, cols], state); direction [-1, 0; 1, 0; 0, -1; 0, 1]; new_row row direction(action, 1); new_col col direction(action, 2); % 越界检查 if new_row 1 || new_row rows || new_col 1 || new_col cols next_state state; reward -10; done 0; return; end % 墙壁检查 if map(new_row, new_col) 1 next_state state; reward -10; done 0; return; end % 正常移动 next_state sub2ind([rows, cols], new_row, new_col); % 终点检查 if map(new_row, new_col) 2 reward 100; done 1; else reward -1; done 0; end end这里有一个比较隐蔽的问题终点格子在地图上的值是2但在状态映射表里它也是一个有效状态。当机器人到达终点后回合结束不需要再对这个状态做任何Q值更新。所以在主循环里终点的处理逻辑要写清楚done为1时只更新当前Q值不进入下一步的状态转移。4.4 完整训练主循环episode_rewards zeros(max_episode, 1); episode_steps zeros(max_episode, 1); for episode 1:max_episode state start_state; epsilon max(0.01, 1 - episode / max_episode * 0.99); total_reward 0; for step 1:max_step q_row state_mapping(state); action choose_action(Q, q_row, epsilon, 4); [next_state, reward, done] step(map, state, action, rows, cols); next_q_row state_mapping(next_state); % Q值更新 if done td_target reward; else td_target reward gamma * max(Q(next_q_row, :)); end Q(q_row, action) Q(q_row, action) alpha * (td_target - Q(q_row, action)); state next_state; total_reward total_reward reward; if done break; end end episode_rewards(episode) total_reward; episode_steps(episode) step; end训练循环的每一回合里机器人从起点出发按照ε-greedy策略选择动作执行动作获得奖励和下一状态然后更新Q值直到到达终点或达到最大步数上限。这里有个需要注意的点实际更新Q值时Q(next_q_row, :)里的next_q_row是通过state_mapping转换来的。终点状态虽然在映射表里有行号但在done1的情况下不会进入这一步所以不会出现越界问题。但假如你在终点状态下继续执行动作就会因为终点行号对应的Q值全是0而导致更新失真。这个顺序逻辑一定要写对。4.5 路径提取与可视化训练结束后从起点开始每一步贪心选择Q值最大的动作记录走过的路径直到到达终点function path get_policy_path(Q, map, state_mapping, start_state, rows, cols) path start_state; state start_state; max_steps rows * cols; for i 1:max_steps q_row state_mapping(state); [~, action] max(Q(q_row, :)); [state, ~, done] step(map, state, action, rows, cols); path [path, state]; if done break; end end end可视化部分我用Matlab的绘图功能把迷宫和路径画出来效果非常直观function plot_path(map, path) [rows, cols] size(map); figure; hold on; % 绘制迷宫网格 for r 1:rows for c 1:cols if map(r, c) 1 rectangle(Position, [c-1, rows-r, 1, 1], FaceColor, [0.3, 0.3, 0.3]); end end end % 绘制路径 for i 1:length(path) - 1 [r1, c1] ind2sub([rows, cols], path(i)); [r2, c2] ind2sub([rows, cols], path(i1)); plot([c1-0.5, c2-0.5], [rows-r10.5, rows-r20.5], r-, LineWidth, 2); end % 标记起点和终点 [sr, sc] ind2sub([rows, cols], path(1)); [gr, gc] ind2sub([rows, cols], find(map 2)); plot(sc-0.5, rows-sr0.5, go, MarkerSize, 12, MarkerFaceColor, g); plot(gc-0.5, rows-gr0.5, bo, MarkerSize, 12, MarkerFaceColor, b); axis equal; xlim([0, cols]); ylim([0, rows]); grid on; end这段代码里有一个坐标转换的细节Matlab绘图时Y轴默认向上而矩阵索引是行号向下增加。所以绘制时需要做转换rows-r0.5就是矩阵坐标转绘图坐标的核心公式。如果你直接拿行号来绘图形会上下颠倒。训练曲线同样重要它能直观反映Q-learning是否收敛figure; subplot(2, 1, 1); plot(1:max_episode, episode_rewards); xlabel(回合数); ylabel(累计奖励); title(每回合累计奖励变化); subplot(2, 1, 2); plot(1:max_episode, episode_steps); xlabel(回合数); ylabel(步数); title(每回合到达终点的步数变化);理想情况下累计奖励曲线会随着回合数增加而上升并趋于稳定步数曲线会下降并收敛到一个最小值附近。如果步数曲线在收敛后还是忽高忽低、跳来跳去说明探索率衰减没到位或者训练回合数不够。5. 训练效果分析与调参实战5.1 收敛过程观察以第2.1节那张10×10地图为例我跑了一组参数实验。训练500回合、α0.5、γ0.9、ε从1衰减到0.01。先说结果机器人大约在80回合左右开始稳定到达终点200回合之后路径基本就不再变化了。前50回合的步数曲线非常震荡动不动就是150步以上甚至一个回合内找不到终点被强制结束。原因很直接——探索率太高机器人经常故意偏离已经发现的好路径。从实验上来说这不是坏事说明机器人确实在“探索”而不是“死记硬背”。50到150回合之间步数开始快速下降从100多步降到40步以内这是Q表逐渐完善的过程。200回合之后步数稳定在22步左右训练完成。从累计奖励曲线看前期的总奖励是负值平均在-50到-100之间。随着策略变好奖励逐步回升为正。最终稳定在70到90之间——到达终点得100分扣除21步的步数惩罚-1/步加上前期偶尔撞墙的负分大致就是这么个数值。5.2 参数对照实验为了让大家看得更清楚参数的作用我做了一个简单的对照测试结果用表格列出来参数组合收敛回合数最终路径长度备注α0.5, γ0.9~200回合22步基准配置稳定收敛α0.1, γ0.9~400回合22步收敛变慢但结果一致α0.9, γ0.9~150回合22步收敛快但偶有震荡α0.5, γ0.5~250回合30步路径明显变长目光短浅α0.5, γ0.99~180回合22步收敛稍快结果稳定这个表格透露了两个重要信息。第一α影响的是收敛速度而不是最终结果取0.5是比较折中的方案。α太大会导致Q值在最优值附近反复震荡尤其是训练后期探索率已经很低的时候步数曲线会呈现出“接近最优但没能完全稳定”的抖动。第二γ对最终路径质量影响很大γ0.5时机器人只看重眼前几步的奖励宁可绕近路也不愿意为了远期的终点奖励多走一段路最终路径比最优路径长了8步。5.3 奖励函数调整对路径质量的影响步数惩罚从-1改成0路径质量会发生明显变化。我用同样的地图和参数跑了一组对照步数惩罚0时机器人在200回合后虽然稳定到达终点但路径长度维持在38步左右比惩罚-1时多了16步。原因也不难理解没有步数惩罚Q-learning的目标函数里没有“路径最短”这个约束它学到的策略只是“能到终点”至于怎么绕路、绕多远根本不管。在某些情况下机器人甚至会学会在终点附近原地打转因为绕圈的过程中偶尔踩到某些状态也会产生正的奖励预期路径变得很“脏”。对比两种设计可以得出一个结论如果在你的任务里路径长度也是评价指标那步数惩罚就必须设置为负值。如果需要路径尽可能短可以把步数惩罚设得更低比如-2或-3效果会更极端。当然也要小心惩罚过大可能导致机器人宁可撞墙也不愿意正常移动奖励函数的尺度需要根据地图规模灵活调整。还有一个小细节撞墙惩罚-10和到达终点100之间存在数量级差异。这个设计是有意的——如果撞墙惩罚和终点奖励差距不够大机器人可能学会“为了探索宁可多撞几次墙”的行为。拉开差距之后撞墙就变成了机器人极力避免的“坏结果”而到达终点才是真正的目标。5.4 探索率衰减曲线的影响探索率衰减策略对训练质量的影响也值得单独说。如果不衰减ε始终固定在0.3机器人即使训练结束后的行为仍然包含30%的随机性。测试路径提取时贪心策略会用生成好的Q表直接选最优动作不会受ε影响。但训练过程中ε不衰减会导致Q表始终不稳定因为机器人一直都在做随机探索Q值不断被各种路径上的反馈拉扯收敛速度会慢很多。衰减速度的选择也有讲究。衰减太快比如前50回合就降到0.01机器人没来得及充分探索容易陷入局部最优后续因为探索率太低也跳不出来。衰减太慢前期浪费大量回合在无意义的随机走动上。我试过从1.0到0.01在200回合内线性衰减效果不错。对于更大的地图可以适当放慢衰减速度让机器人有更充足的探索时间。6. 常见问题与排查实录训练过程中遇到问题是常态这里整理几个高频问题附带我的排查思路和解决办法。6.1 长时间不收敛步数曲线居高不下症状跑了500回合步数依然在100以上浮动甚至经常达到最大步数被强制结束。排查顺序先看奖励函数有没有给到位。如果到达终点的奖励太小比如只有10而撞墙惩罚也是-10机器人会认为撞墙和到达终点“差不多”自然不会积极往终点走。这种情况检查一下是否某一步的奖励符号写反了或者数值数量级差距不够。再看探索率衰减——如果ε固定不衰减机器人永远有20%-30%的概率乱走曲线当然稳定不下来。另外检查一下步数上限是否设置得太小。如果地图从起点到终点的最短路径L22步而最大步数设置成30步那只要机器人稍微绕一点路就会超出限制回合被强制终止Q表完全无法收敛。原则是最大步数至少是路径长度的3倍给足容错空间。6.2 路径不是最短路径症状训练收敛了机器人稳定到达终点但路径一看就有绕路嫌疑。原因基本锁定在步数惩罚上。把每步的惩罚从0改成-1重新训练之后路径会明显缩短。这个改动不需要重新调整其他参数但需要重新跑完整的训练过程因为Q表是逐步迭代出来的旧策略对路径的影响需要回合并累积才能克服。还有一种情况是探索率衰减过快导致机器人过早收敛到一条“还算可以”的路径后面因为探索率太低没机会发现更短路线。这种情况把衰减曲线调平缓一些比如把衰减系数从0.99改成0.95给机器人更多探索时间。6.3 到达终点后无法结束回合症状机器人明明站在终点格子上但回合没有结束还在继续走。问题出在状态转移函数对终点的判断逻辑上。检查step函数里是否在机器人移动到终点格子后就立即返回done1。如果你只判断“当前状态是终点”而没判断“新位置是不是终点”就会出现已经进入终点但回合继续的bug。另外注意起点不能和终点重合否则开局就结束。6.4 Q值出现异常大或异常小的数值症状训练一段时间后Q表里出现极端数值比如上千的Q值或者某个状态所有动作的Q值都变成了很大的负数。排查思路检查奖励是否设置得过大。Q-learning在理论上是有界收敛的只要奖励是有限的、γ小于1Q值不会无限增长。但如果γ设成1且回合内可以无限步长Q值就会不断累加奖励最终涨到无法收敛。另外如果step函数在撞墙时返回的next_state和state是同一个值而奖励又是一个大的正数比如你误把撞墙奖励设成10机器人就会学到在原地反复撞墙刷分Q表自然爆炸。这个问题的排查方法很简单把训练过程中的Q表每隔50回合打印一次观察极端值的发展趋势。如果Q值持续放大而不是收敛就检查γ是否等于1、奖励是否有正反馈循环。7. 后续扩展方向从Q-learning到更复杂的世界这个迷宫项目做完之后我强烈建议你做几个方向的扩展尝试每个方向都有明确的学习价值。第一个是“状态空间变大”。把地图从10×10改成30×30甚至50×50Q表会从几百行增长到几千行。你会发现训练回合数需要指数级增长步数上限也要相应调大。这就是典型的“维度灾难”雏形——你会亲身体会到为什么深度学习要引入神经网络来代替Q表。第二个是“增加动态障碍物”。让一部分墙壁在训练过程中周期性变化状态转移不是完全确定的。这时候需要把α调小、γ调大因为环境带有随机性之后Q值的波动会更剧烈需要更保守的学习率来保持稳定。这个方向可以让你理解“随机环境下的强化学习”和“确定性环境下的强化学习”的差异。第三个是“把Matlab代码移植成Python”。不用NumPy和深度学习库先用基础Python列表实现一遍然后换用NumPy向量化重写一遍最后可以试试用PyTorch实现DQN版本。每一步的迁移都会逼着你更深入地理解数据结构和算法细节这种“从能跑到能解释清楚”的转变价值远超代码本身。我个人在做这个项目时还有一点深刻体会很多初学者会把Q-learning的Q表想象成一个“黑盒”训练完了就直接用。但实际上训练结束后把Q表打印出来仔细看看你会发现它非常直观——每个状态对应一行数字表示在当前位置选择上下左右的长期收益。看Q表能看出很多门道为什么某个状态所有动作都是负值因为它在死胡同里。为什么某个状态某个动作的Q值特别高因为它直指终点。这种对训练产物的“复盘”会让你对强化学习的理解上一个台阶。这个项目可以说是我见过的“性价比”最高的强化学习入门实践之一。代码量不大、原理清晰、可视化效果好、易于调参验证几乎覆盖了强化学习的全部核心概念。如果你正在找第一个强化学习练手项目或者正在做相关的课程设计照着这个思路在Matlab里把代码敲一遍、把参数调几轮、把坑都踩一遍收获会非常实在。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号