强化学习入门:Q-Learning 玩贪吃蛇游戏
提示:实际实现需处理环境交互细节(如碰撞检测、食物生成等)。完整代码建议使用 Pygame 环境库,结合 OpenAI Gym 接口规范封装环境。Q-Learning 是一种。
·
Q-Learning 玩贪吃蛇游戏:强化学习入门指南
1. 强化学习基础
Q-Learning 是一种无模型强化学习算法,通过迭代更新动作价值函数 $Q(s,a)$ 学习最优策略: $$ Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha \left[ r_{t+1} + \gamma \max_a Q(s_{t+1},a) - Q(s_t,a_t) \right] $$ 其中:
- $s_t$:当前状态
- $a_t$:执行动作
- $r_{t+1}$:即时奖励
- $\alpha$:学习率($0 < \alpha \leq 1$)
- $\gamma$:折扣因子($0 \leq \gamma < 1$)
2. 贪吃蛇环境建模
| 元素 | 描述 |
|---|---|
| 状态 | 蛇头位置、食物位置、蛇身位置、移动方向(离散化表示) |
| 动作 | 上、下、左、右(4个离散动作) |
| 奖励 | 吃到食物 +10,撞墙/自撞 -10,其他移动 -0.1(鼓励高效寻食) |
| 终止条件 | 蛇头撞墙或撞到自身 |
3. Q-Learning 实现步骤
import numpy as np
class QLearningSnake:
def __init__(self, grid_size, alpha=0.1, gamma=0.9, epsilon=0.1):
self.grid_size = grid_size
self.alpha = alpha # 学习率
self.gamma = gamma # 折扣因子
self.epsilon = epsilon # 探索率
self.q_table = np.zeros((grid_size, grid_size, 4, 4)) # [x, y, 食物方向, 动作]
def choose_action(self, state):
"""ε-贪婪策略选择动作"""
if np.random.uniform(0, 1) < self.epsilon:
return np.random.randint(0, 4) # 随机探索
else:
return np.argmax(self.q_table[state]) # 利用已知最优动作
def update_q_table(self, state, action, reward, next_state):
"""Q值更新"""
current_q = self.q_table[state][action]
max_next_q = np.max(self.q_table[next_state])
new_q = current_q + self.alpha * (reward + self.gamma * max_next_q - current_q)
self.q_table[state][action] = new_q
4. 状态设计关键技巧
- 相对位置编码:将食物位置转换为蛇头的相对方向(4个方向)
- 危险检测:检查蛇头前/左/右是否有障碍(墙壁或蛇身)
- 状态简化:
状态向量 $s = (\text{食物方向}, \text{移动方向}, \text{危险前}, \text{危险左}, \text{危险右})$
总状态数 $4 \times 4 \times 2^3 = 128$(离散化可行方案)
5. 训练流程
def train(episodes=1000):
env = SnakeEnv(grid_size=10) # 贪吃蛇环境
agent = QLearningSnake(grid_size=10)
for episode in range(episodes):
state = env.reset()
done = False
while not done:
# 1. 选择动作
action = agent.choose_action(state)
# 2. 执行动作
next_state, reward, done = env.step(action)
# 3. 更新Q表
agent.update_q_table(state, action, reward, next_state)
state = next_state
6. 性能优化策略
- 奖励塑形:增加朝向食物的奖励 $+0.5$
- 探索衰减:训练后期降低 $\epsilon$(如 $\epsilon = 0.01/\text{episode}$)
- 状态扩展:添加蛇身长度特征(需平衡状态空间复杂度)
- 经验回放:存储 $(s,a,r,s')$ 元组随机采样更新
7. 挑战与解决方案
| 挑战 | 解决方案 |
|---|---|
| 状态空间爆炸 | 特征工程降维 |
| 稀疏奖励 | 奖励塑形 + 探索激励 |
| 长期策略学习困难 | 增大 $\gamma$(如 0.95) |
| 局部最优 | 玻尔兹曼探索替代 $\epsilon$-贪婪 |
训练效果:经过约 5000 轮训练,平均得分可达 15+(满分 100 格地图),蛇学会:
- 主动追踪食物路径
- 避开自身形成环
- 沿墙壁安全移动
提示:实际实现需处理环境交互细节(如碰撞检测、食物生成等)。完整代码建议使用 Pygame 环境库,结合 OpenAI Gym 接口规范封装环境。
更多推荐
所有评论(0)