1. 项目概述:当机器人走进迷宫
去年调试车间里那台总撞墙的移动机器人,让我意识到传统路径规划在未知环境中的局限性。直到把Q-learning算法引入项目,机器人才真正学会了"思考"。这次我们就用Matlab复现这个让机器人自主探索迷宫的过程。
Q-learning作为强化学习的经典算法,其核心思想是让智能体(这里指机器人)通过与环境交互来学习最优策略。在迷宫环境中,机器人需要从起点出发,避开障碍物找到通往终点的最短路径。整个过程不需要预先建立环境地图,而是通过不断试错来积累经验。
2. 核心原理拆解
2.1 Q-learning算法框架
Q-learning的核心是Q表(Q-table),它是一个状态-动作价值矩阵。对于迷宫问题:
- 状态(State):机器人所在迷宫的网格坐标(x,y)
- 动作(Action):上、下、左、右四个移动方向
- 奖励(Reward):到达终点+100,撞墙-10,普通移动-1
算法通过以下公式更新Q值:
Q(s,a) = Q(s,a) + α * [r + γ * max(Q(s',a')) - Q(s,a)]其中α是学习率(0<α≤1),γ是折扣因子(0≤γ<1)。
关键技巧:设置γ=0.9能让机器人更关注长期回报,α=0.1可平衡新旧知识的权重
2.2 迷宫环境建模
在Matlab中我们用矩阵表示迷宫:
maze = [1 1 1 1 1 1; 1 0 0 0 0 1; 1 1 1 0 1 1; 1 0 0 0 0 1; 1 1 1 1 1 1];其中1代表墙壁,0代表可行走区域。起点设为(2,2),终点(4,5)。
3. Matlab实现详解
3.1 初始化设置
% 参数设置 alpha = 0.1; % 学习率 gamma = 0.9; % 折扣因子 epsilon = 0.3; % 探索概率 episodes = 500; % 训练轮数 % 初始化Q表 Q = zeros(size(maze,1), size(maze,2), 4); % [行,列,动作] actions = ['上','下','左','右'];3.2 训练过程核心代码
for ep = 1:episodes state = [2,2]; % 每轮从起点开始 while ~isequal(state, [4,5]) % 未到达终点时循环 % ε-greedy策略选择动作 if rand() < epsilon action = randi(4); % 随机探索 else [~, action] = max(Q(state(1),state(2),:)); % 利用已有知识 end % 执行动作 new_state = state; switch action case 1 % 上 new_state(1) = new_state(1)-1; case 2 % 下 new_state(1) = new_state(1)+1; case 3 % 左 new_state(2) = new_state(2)-1; case 4 % 右 new_state(2) = new_state(2)+1; end % 边界和障碍检查 if new_state(1)<1 || new_state(1)>size(maze,1) || ... new_state(2)<1 || new_state(2)>size(maze,2) || ... maze(new_state(1), new_state(2)) == 1 reward = -10; new_state = state; % 保持原位置 elseif isequal(new_state, [4,5]) % 到达终点 reward = 100; else reward = -1; % 普通移动成本 end % Q值更新 Q(state(1),state(2),action) = Q(state(1),state(2),action) + ... alpha * (reward + gamma * max(Q(new_state(1),new_state(2),:)) - ... Q(state(1),state(2),action)); state = new_state; end end3.3 路径可视化
训练完成后,用以下代码展示学习结果:
path = [2,2]; state = [2,2]; while ~isequal(state, [4,5]) [~, action] = max(Q(state(1),state(2),:)); switch action case 1, state = [state(1)-1,state(2)]; case 2, state = [state(1)+1,state(2)]; case 3, state = [state(1),state(2)-1]; case 4, state = [state(1),state(2)+1]; end path = [path; state]; end % 绘制迷宫和路径 figure; imagesc(maze); colormap([1 1 1; 0 0 0]); % 白为通路,黑为墙 hold on; plot(path(:,2), path(:,1), 'r.-', 'LineWidth', 2, 'MarkerSize', 20); title('Q-learning路径规划结果');4. 调参经验与问题排查
4.1 参数优化指南
| 参数 | 推荐范围 | 影响效果 | 调试建议 |
|---|---|---|---|
| α(alpha) | 0.01-0.2 | 值越大学习速度越快但越不稳定 | 从0.1开始,观察收敛情况调整 |
| γ(gamma) | 0.8-0.99 | 值越大机器人越考虑长期回报 | 复杂迷宫建议0.9以上 |
| ε(epsilon) | 0.1-0.3 | 值越大探索性越强 | 后期可逐渐降低促进策略收敛 |
4.2 常见问题解决方案
机器人原地打转
- 现象:在某个区域反复来回移动
- 解决:增加移动惩罚(如将普通移动reward从-1改为-2)
无法收敛到最优路径
- 检查迷宫是否可解(起点终点是否连通)
- 适当增加训练轮数(episodes)
- 尝试动态调整ε(训练后期减小探索概率)
Q值爆炸式增长
- 降低学习率α
- 检查reward设置是否合理(避免绝对值过大)
5. 进阶优化方向
5.1 状态空间压缩
对于大型迷宫,Q表可能过大导致内存问题。可考虑:
- 将连续位置离散化
- 使用神经网络替代Q表(DQN)
5.2 动态环境适应
修改奖励函数实时响应环境变化:
if maze(new_state(1), new_state(2)) == 2 % 动态障碍物 reward = -20; % 更高惩罚 maze(new_state(1), new_state(2)) = 1; % 更新为固定障碍 end5.3 多机器人协同
扩展为多智能体系统时需注意:
- 共享Q表时要考虑冲突避免
- 可设计通信机制交换路径信息
我在实际项目中发现,当迷宫尺寸超过20×20时,传统Q-learning的效率会显著下降。这时可以考虑结合A*等启发式算法进行分层规划,或者转向深度强化学习方法。不过对于大多数教育演示和简单应用场景,这个基础实现已经能很好地展示强化学习的核心思想。