1. 项目概述:当机器人遇上迷宫
第一次看到扫地机器人在客厅里转来转去总撞到茶几腿时,我就对路径规划产生了浓厚兴趣。传统基于地图的导航算法在复杂多变的环境中往往表现笨拙,而Q-learning这类强化学习算法却能让机器像生物一样通过"试错"自主学习。这次我们要实现的迷宫路径规划,正是验证这一理念的经典场景。
在Matlab环境下,我们可以用不到200行代码构建完整的Q-learning训练系统。机器人将被抽象为迷宫网格中的移动智能体,通过反复探索建立状态-动作价值矩阵(Q表),最终找到从起点到终点的最优路径。这个项目特别适合想入门强化学习的工程师,既能理解算法本质,又能获得可视化的训练过程。
2. 核心算法解析
2.1 Q-learning的数学骨架
Q-learning的核心是价值迭代公式:
code复制Q(s,a) ← Q(s,a) + α[r + γmaxQ(s',a') - Q(s,a)]
其中α=0.1的学习率控制着新知识的吸收速度,γ=0.9的折扣因子决定了未来奖励的权重。在Matlab中我们用一个二维数组实现Q表,行代表状态(迷宫位置),列对应动作(上下左右)。
实际调试中发现:当迷宫尺寸超过15×15时,需要将学习率降到0.05以下避免震荡
2.2 迷宫环境的建模技巧
用矩阵表示迷宫时,我习惯采用以下编码:
- 0:可通行路径
- 1:障碍物
- 2:起点
- 3:终点
例如5×5迷宫可以表示为:
matlab复制maze = [2 0 0 1 0;
0 1 0 1 0;
0 1 0 0 0;
0 0 0 1 1;
0 1 0 0 3];
这种表示法既方便可视化,又能直接用矩阵坐标作为状态输入。
3. Matlab实现详解
3.1 初始化参数设置
matlab复制% 基本参数
EPISODES = 1000; % 训练轮次
ALPHA = 0.1; % 学习率
GAMMA = 0.9; % 折扣因子
EPSILON = 0.3; % 探索概率
% Q表初始化
Q = zeros(maze_size(1)*maze_size(2), 4); % 状态数×动作数
这里将二维位置坐标线性化处理,例如(2,3)位置对应状态索引=(行号-1)*列数+列号。
3.2 核心训练循环
matlab复制for episode = 1:EPISODES
state = start_pos;
while ~isequal(state, goal_pos)
% ε-greedy策略选择动作
if rand < EPSILON
action = randi(4); % 随机探索
else
[~, action] = max(Q(state_idx,:)); % 利用已有知识
end
% 执行动作获得新状态和奖励
[new_state, reward, done] = step(state, action);
% Q值更新
Q(state_idx, action) = Q(state_idx, action) + ...
ALPHA * (reward + GAMMA * max(Q(new_idx,:)) - Q(state_idx,action));
state = new_state;
end
end
3.3 可视化实现技巧
用imagesc函数动态显示训练过程:
matlab复制h = imagesc(maze);
set(h, 'AlphaData', ~maze); % 使障碍物不透明
hold on;
plot(robot_pos(2), robot_pos(1), 'ro', 'MarkerSize', 10);
drawnow;
4. 实战调优经验
4.1 奖励函数设计陷阱
初期尝试的简单奖励方案:
- 到达终点:+100
- 撞墙:-10
- 每步:-1
结果发现机器人倾向于原地转圈(减少总步数惩罚)。改进后的奖励结构:
matlab复制function reward = get_reward(state, new_state, goal)
if isequal(new_state, goal)
reward = 50; % 适当降低终点奖励
elseif new_state == state % 撞墙
reward = -5;
else % 有效移动
reward = -0.1 + 0.5*(1 - norm(new_state-goal)/max_dist);
end
end
加入基于距离的渐进奖励后,收敛速度提升40%。
4.2 参数组合的黄金比例
通过网格搜索得到的较优参数组合:
| 参数 | 小迷宫(10×10) | 大迷宫(20×20) |
|---|---|---|
| α | 0.2 | 0.05 |
| γ | 0.95 | 0.85 |
| ε | 0.4→0.1 | 0.5→0.15 |
| 衰减周期 | 200轮 | 500轮 |
关键技巧:ε采用线性衰减,训练初期鼓励探索,后期侧重利用
5. 典型问题排查指南
5.1 路径出现循环
症状:机器人总在某个区域转圈
解决方法:
- 检查碰撞检测逻辑是否漏判
- 增加路径记忆机制(最近N步的状态序列惩罚)
- 在奖励函数中加入移动方向多样性奖励
5.2 训练后期性能下降
可能原因:
- 学习率过高导致Q值震荡
- 探索率衰减过快陷入局部最优
验证方法:保存各轮次的步数曲线,观察是否出现突变
5.3 Matlab性能优化
当迷宫尺寸超过30×30时:
- 将Q表改为稀疏矩阵存储
- 每100轮才刷新一次可视化
- 使用parfor并行处理多个训练回合
6. 扩展应用方向
完成基础版本后,可以尝试:
- 动态迷宫:随机变化障碍物位置
- 多目标点:需要依次访问多个检查点
- 多智能体:多个机器人协同探索
我在测试动态环境时发现,定期重置10%的Q表值(模拟遗忘机制)能使适应速度提升2倍。这就像人类在环境变化时,既需要旧经验也要保持学习新知识的能力。
