1. 强化学习与迷宫寻路初探第一次接触强化学习的朋友可能会觉得这个概念有点抽象但其实它就像教小孩学走路一样自然。想象一下你把一个小机器人放在迷宫里它一开始完全不知道该怎么走但通过不断尝试和获得反馈比如撞墙扣分、找到出口加分慢慢就能学会最优路径。这就是强化学习的核心思想 - 通过环境反馈来优化行为策略。在这个实战项目中我们要用最经典的Q表格方法来解决迷宫寻路问题。Q表格就像是一本行动指南记录着在每个位置采取不同动作的预期收益。比如在迷宫的(2,3)位置表格会告诉我们往上走预计得5分往右走预计得8分 - 那当然选择往右更划算。这种方法特别适合初学者因为它足够直观7x7的迷宫对应49个状态每个格子一个状态每个状态有4个动作上下左右整个Q表格就是49行4列的矩阵。我刚开始学的时候犯过一个典型错误把Q值理解成了即时奖励。其实Q值代表的是长期收益的预估包含当前动作带来的即时奖励以及后续可能获得的所有奖励的折现。这个概念理解清楚后后面的算法实现就顺畅多了。2. 搭建迷宫训练场2.1 自定义迷宫环境很多教程一上来就用现成的Gym环境但我发现从零搭建环境反而更能理解底层逻辑。我们的迷宫用7x7的网格表示其中0代表可通行的路径1是危险区域走上去扣50分-1是终点到达得50分智能体初始位置在(0,0)用Python实现这个环境特别简单import numpy as np class MazeEnv: def __init__(self): self.grid np.zeros((7,7)) self.agent_pos [0,0] self.danger_zone [(1,1),(1,2),(2,1),(2,2)] # 危险区域坐标 self.goal (5,5) # 终点坐标 # 初始化危险区域 for x,y in self.danger_zone: self.grid[x,y] 1 self.grid[self.goal] -12.2 设计奖励机制奖励函数是强化学习的指挥棒设计不当会导致智能体学偏。经过多次调试我采用了这样的奖励方案每走一步-1鼓励尽快找到终点进入危险区-50到达终点50撞墙-5保持当前位置不变这种设计让智能体既要考虑路径效率又要规避风险。实际项目中奖励函数往往需要反复调整这也是强化学习工程师的重要工作之一。3. Q-learning算法实现3.1 Q表格更新原理Q-learning的核心是下面这个更新公式Q(s,a) ← Q(s,a) α[r γ*max(Q(s,a)) - Q(s,a)]其中α是学习率我设为0.1γ是折扣因子设为0.9s是下一个状态a是下一个动作这个公式的意思是用当前获得的奖励r加上预估的未来最大收益γ*max(Q(s,a))来调整当前Q值的估计。经过足够多次的迭代Q值会收敛到最优值。3.2 代码实现细节在实现时有几个关键点需要注意探索-利用平衡我设置了10%的探索概率让智能体有时随机选择动作避免陷入局部最优状态编码将二维坐标(x,y)转换为一维状态码x*7y边界处理当撞墙时保持位置不变完整实现如下class QLearningAgent: def __init__(self): self.q_table np.zeros((49,4)) # 49个状态4个动作 self.learning_rate 0.1 self.discount_factor 0.9 self.epsilon 0.1 def choose_action(self, state): if np.random.rand() self.epsilon: # 探索 return np.random.randint(4) else: # 利用 return np.argmax(self.q_table[state]) def learn(self, state, action, reward, next_state, done): current_q self.q_table[state, action] if done: target_q reward else: target_q reward self.discount_factor * np.max(self.q_table[next_state]) self.q_table[state, action] self.learning_rate * (target_q - current_q)4. Sarsa算法对比实现4.1 算法差异解析Sarsa与Q-learning的主要区别在于更新公式Q(s,a) ← Q(s,a) α[r γ*Q(s,a) - Q(s,a)]注意这里用的是下一个实际采取的动作a而不是最大价值的动作。这使得Sarsa更加谨慎因为它会考虑实际执行动作的风险。在悬崖漫步(Cliff Walking)问题中这种差异表现得特别明显Q-learning会学习到贴着悬崖走的最短路径Sarsa则会选择更安全的绕行路线4.2 代码调整要点只需修改learn方法即可实现Sarsadef learn(self, state, action, reward, next_state, next_action, done): current_q self.q_table[state, action] if done: target_q reward else: target_q reward self.discount_factor * self.q_table[next_state, next_action] self.q_table[state, action] self.learning_rate * (target_q - current_q)在训练循环中需要额外保存next_actionnext_action agent.choose_action(next_state) agent.learn(state, action, reward, next_state, next_action, done)5. 训练过程与结果分析5.1 训练曲线可视化我记录了150轮训练的总得分变化使用matplotlib绘制学习曲线import matplotlib.pyplot as plt scores [] for episode in range(150): score run_episode(env, agent) scores.append(score) plt.plot(scores) plt.xlabel(Episode) plt.ylabel(Total Reward) plt.show()典型的训练过程会呈现三个阶段初期得分很低经常走进危险区中期得分波动上升开始找到路径但不够稳定后期得分趋于稳定找到最优或次优路径5.2 策略可视化训练完成后我们可以打印每个位置的最优动作def visualize_policy(q_table): arrows [↑,↓,←,→] for i in range(7): for j in range(7): state i*7 j best_action np.argmax(q_table[state]) print(arrows[best_action], end ) print()从结果中可以明显看出两种算法的策略差异Q-learning的路径更直接但会紧贴危险区Sarsa的路径更保守会主动绕开危险区6. 实战中的经验技巧6.1 超参数调优心得经过多次实验我总结出这些参数设置经验学习率α0.1-0.3比较合适太大容易震荡太小学习太慢折扣因子γ0.9是个不错的起点对长期任务可以提高到0.99探索率ε初期可以设0.2后期逐渐衰减到0.01可以尝试线性衰减探索率self.epsilon max(0.01, 0.2 - 0.01*episode)6.2 常见问题排查遇到训练效果不好时可以检查这些方面奖励函数设计是否合理状态表示是否包含了足够信息学习率是否过大/过小探索率是否合适训练轮次是否足够我曾在项目中遇到过智能体躺平的问题 - 因为每步都有-1惩罚智能体发现原地不动反而扣分最少。通过调整奖励函数增加原地不动的惩罚解决了这个问题。7. 扩展与进阶方向掌握了基础实现后可以尝试这些进阶改进用神经网络替代Q表格DQN添加经验回放机制实现Double DQN解决过估计问题尝试更复杂的环境如8x8迷宫对于这个7x7迷宫我还尝试过设置移动障碍物这需要智能体学会动态调整策略。实现方法是每10步随机移动一个危险区域的位置这显著增加了问题的复杂度。在实际项目中Q表格方法虽然简单但在状态空间不大时仍然非常有效。我曾用类似的方法解决过一个仓库拣货路径优化问题状态空间约2000左右Q表格方法只用了几百次迭代就找到了接近最优的解决方案。