AI人工智能T型迷宫:从零开始的路径规划算法实战

1次阅读
没有评论

共计 2618 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景介绍

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

AI 人工智能 T 型迷宫:从零开始的路径规划算法实战

对于 AI 初学者来说,T 型迷宫具有以下优势:

  • 状态空间小,训练速度快
  • 能清晰展示算法决策过程
  • 可轻松扩展为更复杂迷宫的基础

技术选型对比

在解决路径规划问题时,我们主要有以下几种算法选择:

  1. A* 算法
  2. 优点:保证找到最短路径,效率高
  3. 缺点:需要完整环境地图,不适应动态变化

  4. 遗传算法

  5. 优点:全局搜索能力强
  6. 缺点:参数调优复杂,收敛速度慢

  7. Q-learning

  8. 优点:无需环境模型,通过试错学习
  9. 缺点:需要充分探索,初期表现随机

对于完全未知的迷宫环境,Q-learning 这类无模型强化学习算法更具优势,这也是我们选择它的主要原因。

Q-learning 核心实现

Q-learning 的实现主要包含以下几个关键步骤:

  1. 环境建模
  2. 将迷宫离散化为网格状态
  3. 定义动作空间(上、下、左、右)
  4. 设置终止状态(出口)

  5. Q 表初始化

  6. 创建状态 - 动作价值矩阵
  7. 初始值可以设为零或小随机数

  8. 训练循环

  9. 选择动作(ε-greedy 策略)
  10. 执行动作,观察新状态和奖励
  11. 更新 Q 值:Q(s,a) ← Q(s,a) + α[r + γmaxQ(s’,a’) – Q(s,a)]

  12. 策略提取

  13. 训练完成后,每个状态选择最大 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()

性能考量

关键超参数对训练效果的影响:

  1. 学习率(α)
  2. 值过大:Q 值波动剧烈,难以收敛
  3. 值过小:学习速度慢,需要更多 episode
  4. 建议范围:0.01-0.5,可随时间衰减

  5. 折扣因子(γ)

  6. 值过大:重视远期奖励,可能导致训练不稳定
  7. 值过小:只关注即时奖励,可能无法找到最优解
  8. 推荐值:0.8-0.99

  9. 探索率(ε)

  10. 初期可设较高 (0.3-0.5) 促进探索
  11. 后期应降低 (0.01-0.1) 以利用学到的策略

避坑指南

  1. 智能体不探索
  2. 现象:总是重复相同路径
  3. 解决:增加 ε 值,添加探索奖励

  4. Q 值爆炸

  5. 现象:Q 值变得极大
  6. 解决:降低学习率,检查奖励比例

  7. 无法收敛

  8. 现象:回报波动大
  9. 解决:尝试更小的 α,确保 γ <1

实践建议

掌握了基础 T 型迷宫后,可以尝试以下扩展:

  1. 增加迷宫复杂度(更多分叉、死路)
  2. 引入动态障碍物
  3. 改用深度 Q 网络 (DQN) 处理更大状态空间

进阶思考

  1. 如何修改奖励函数使智能体学会最短路径?
  2. 当迷宫变为三维结构时,Q-learning 需要做哪些调整?
  3. 比较 Q -learning 与 SARSA 算法在 T 型迷宫中的表现差异

通过这个项目,我们不仅学会了 Q -learning 的基本实现,更重要的是理解了强化学习中的探索 - 利用平衡。建议读者尝试调整不同参数,观察对学习曲线的影响,这是掌握强化学习调参技巧的最佳方式。

正文完
 0
评论(没有评论)