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 格地图),蛇学会:

  1. 主动追踪食物路径
  2. 避开自身形成环
  3. 沿墙壁安全移动

提示:实际实现需处理环境交互细节(如碰撞检测、食物生成等)。完整代码建议使用 Pygame 环境库,结合 OpenAI Gym 接口规范封装环境。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐