共计 2618 个字符,预计需要花费 7 分钟才能阅读完成。
背景介绍
T 型迷宫是强化学习领域中经典的训练环境,它的结构简单但足以验证智能体的决策能力。迷宫由一条主通道和末端的分叉(左 / 右转向)构成,这种结构特别适合研究智能体的探索与利用权衡问题。在神经科学研究中,T 型迷宫也被广泛用于测试动物的空间记忆能力。

对于 AI 初学者来说,T 型迷宫具有以下优势:
- 状态空间小,训练速度快
- 能清晰展示算法决策过程
- 可轻松扩展为更复杂迷宫的基础
技术选型对比
在解决路径规划问题时,我们主要有以下几种算法选择:
- A* 算法
- 优点:保证找到最短路径,效率高
-
缺点:需要完整环境地图,不适应动态变化
-
遗传算法
- 优点:全局搜索能力强
-
缺点:参数调优复杂,收敛速度慢
-
Q-learning
- 优点:无需环境模型,通过试错学习
- 缺点:需要充分探索,初期表现随机
对于完全未知的迷宫环境,Q-learning 这类无模型强化学习算法更具优势,这也是我们选择它的主要原因。
Q-learning 核心实现
Q-learning 的实现主要包含以下几个关键步骤:
- 环境建模
- 将迷宫离散化为网格状态
- 定义动作空间(上、下、左、右)
-
设置终止状态(出口)
-
Q 表初始化
- 创建状态 - 动作价值矩阵
-
初始值可以设为零或小随机数
-
训练循环
- 选择动作(ε-greedy 策略)
- 执行动作,观察新状态和奖励
-
更新 Q 值:Q(s,a) ← Q(s,a) + α[r + γmaxQ(s’,a’) – Q(s,a)]
-
策略提取
- 训练完成后,每个状态选择最大 Q 值对应的动作
完整代码示例
import numpy as np
import matplotlib.pyplot as plt
# 迷宫环境定义
class TMaze:
def __init__(self):
self.states = ['start', 'junction', 'left', 'right', 'goal']
self.actions = ['up', 'down', 'left', 'right']
self.current_state = 'start'
def reset(self):
self.current_state = 'start'
return self.current_state
def step(self, action):
if self.current_state == 'start':
if action == 'up':
self.current_state = 'junction'
return 'junction', 0, False
else:
return 'start', -1, False
# 省略部分转移逻辑...
elif self.current_state == 'left':
if action == 'down':
self.current_state = 'goal'
return 'goal', 10, True
else:
return 'left', -1, False
# Q-learning 实现
class QLearner:
def __init__(self, env, alpha=0.1, gamma=0.9, epsilon=0.1):
self.env = env
self.q_table = {s: {a: 0 for a in env.actions} for s in env.states}
self.alpha = alpha # 学习率
self.gamma = gamma # 折扣因子
self.epsilon = epsilon # 探索率
def choose_action(self, state):
if np.random.uniform() < self.epsilon:
return np.random.choice(self.env.actions)
else:
return max(self.q_table[state].items(), key=lambda x: x[1])[0]
def learn(self, episodes=1000):
rewards = []
for _ in range(episodes):
state = self.env.reset()
total_reward = 0
done = False
while not done:
action = self.choose_action(state)
next_state, reward, done = self.env.step(action)
# Q 值更新
best_next = max(self.q_table[next_state].values())
self.q_table[state][action] += self.alpha * (reward + self.gamma * best_next - self.q_table[state][action])
state = next_state
total_reward += reward
rewards.append(total_reward)
return rewards
# 训练可视化
env = TMaze()
learner = QLearner(env)
rewards = learner.learn()
plt.plot(rewards)
plt.xlabel('Episode')
plt.ylabel('Total Reward')
plt.title('Learning Progress')
plt.show()
性能考量
关键超参数对训练效果的影响:
- 学习率(α)
- 值过大:Q 值波动剧烈,难以收敛
- 值过小:学习速度慢,需要更多 episode
-
建议范围:0.01-0.5,可随时间衰减
-
折扣因子(γ)
- 值过大:重视远期奖励,可能导致训练不稳定
- 值过小:只关注即时奖励,可能无法找到最优解
-
推荐值:0.8-0.99
-
探索率(ε)
- 初期可设较高 (0.3-0.5) 促进探索
- 后期应降低 (0.01-0.1) 以利用学到的策略
避坑指南
- 智能体不探索
- 现象:总是重复相同路径
-
解决:增加 ε 值,添加探索奖励
-
Q 值爆炸
- 现象:Q 值变得极大
-
解决:降低学习率,检查奖励比例
-
无法收敛
- 现象:回报波动大
- 解决:尝试更小的 α,确保 γ <1
实践建议
掌握了基础 T 型迷宫后,可以尝试以下扩展:
- 增加迷宫复杂度(更多分叉、死路)
- 引入动态障碍物
- 改用深度 Q 网络 (DQN) 处理更大状态空间
进阶思考
- 如何修改奖励函数使智能体学会最短路径?
- 当迷宫变为三维结构时,Q-learning 需要做哪些调整?
- 比较 Q -learning 与 SARSA 算法在 T 型迷宫中的表现差异
通过这个项目,我们不仅学会了 Q -learning 的基本实现,更重要的是理解了强化学习中的探索 - 利用平衡。建议读者尝试调整不同参数,观察对学习曲线的影响,这是掌握强化学习调参技巧的最佳方式。
正文完
发表至: 人工智能
近两天内
