授课语音

实践:使用Q-learning解决迷宫问题

在本实践中,我们将使用Q-learning算法解决一个简单的迷宫问题。迷宫环境由一个网格构成,代理从起点出发,目标是找到终点,并通过与环境的交互逐步学习最佳的路径。

1. 迷宫问题描述

假设迷宫是一个二维网格,代理的位置可以用(x, y)坐标表示。迷宫有一个起点和一个终点,代理需要通过一系列的动作(上、下、左、右)移动到终点。

  • 奖励:当代理到达终点时,获得奖励+1;在每一步移动中,代理获得一个小的负奖励(例如-0.1),鼓励代理尽快找到终点。
  • 状态:代理的当前位置(x, y)
  • 动作:上(Up)、下(Down)、左(Left)、右(Right)。
  • Q值更新:根据Q-learning算法,通过Q(state, action)来表示在某个状态下选择某个动作的价值。

2. 环境设置

我们将定义一个简单的迷宫环境,代理可以在网格中上下左右移动,终点为一个特定的位置,起点为另一个位置。

2.1 迷宫类

import random

class Maze:
    def __init__(self, size=(5, 5), start=(0, 0), goal=(4, 4)):
        self.size = size  # 迷宫的大小
        self.start = start  # 起点位置
        self.goal = goal  # 终点位置
        self.state = start  # 代理的初始状态

    def reset(self):
        self.state = self.start  # 重置代理位置为起点
        return self.state

    def step(self, action):
        x, y = self.state
        # 根据动作更新位置
        if action == 'up' and x > 0:
            x -= 1
        elif action == 'down' and x < self.size[0] - 1:
            x += 1
        elif action == 'left' and y > 0:
            y -= 1
        elif action == 'right' and y < self.size[1] - 1:
            y += 1
        self.state = (x, y)

        # 判断是否到达终点
        if self.state == self.goal:
            return self.state, 1  # 到达终点,奖励+1
        else:
            return self.state, -0.1  # 未到终点,奖励-0.1

2.2 Q-learning代理类

class QLearningAgent:
    def __init__(self, actions, learning_rate=0.1, discount_factor=0.9, epsilon=0.1):
        self.actions = actions  # 可用的动作
        self.q_table = {}  # Q值表
        self.learning_rate = learning_rate  # 学习率
        self.discount_factor = discount_factor  # 折扣因子
        self.epsilon = epsilon  # 探索率

    def choose_action(self, state):
        if state not in self.q_table:
            self.q_table[state] = [0 for _ in self.actions]  # 初始化Q值表
        if random.uniform(0, 1) < self.epsilon:  # 以epsilon的概率进行探索
            return random.choice(self.actions)
        else:  # 否则选择最大Q值对应的动作
            return self.actions[self.q_table[state].index(max(self.q_table[state]))]

    def learn(self, state, action, reward, next_state):
        if next_state not in self.q_table:
            self.q_table[next_state] = [0 for _ in self.actions]  # 初始化Q值表
        # 更新Q值
        self.q_table[state][self.actions.index(action)] += self.learning_rate * \
            (reward + self.discount_factor * max(self.q_table[next_state]) - self.q_table[state][self.actions.index(action)])

2.3 迷宫Q-learning训练过程

# 初始化环境和代理
maze = Maze(size=(5, 5), start=(0, 0), goal=(4, 4))
actions = ['up', 'down', 'left', 'right']
agent = QLearningAgent(actions=actions)

# 强化学习过程
num_episodes = 500  # 训练500回合
for episode in range(num_episodes):
    state = maze.reset()  # 重置迷宫
    total_reward = 0

    while state != maze.goal:
        action = agent.choose_action(state)  # 选择动作
        next_state, reward = maze.step(action)  # 环境反馈
        agent.learn(state, action, reward, next_state)  # 更新Q值
        state = next_state  # 更新状态
        total_reward += reward

    print(f"Episode {episode + 1}: Total Reward = {total_reward}")

3. 结果与总结

通过多次与环境的交互,代理逐渐学习到从起点到终点的最优路径。在每一回合中,代理通过Q-learning更新其策略,并在与环境交互时选择最优动作。

  • 奖励:代理根据在迷宫中的表现不断更新其Q值。在接近终点时,代理会得到正奖励,而在离终点较远时,会得到负奖励。
  • 策略:随着训练的进行,代理的Q值表逐渐收敛,最终学到从起点到终点的最短路径。

通过Q-learning算法,代理能够在没有事先了解环境的情况下,通过与环境的互动不断优化其策略,最终找到解决问题的最优方法。

4. 总结

在这个实践中,我们使用Q-learning解决了迷宫问题,通过状态-动作值函数(Q值)来优化代理的策略。Q-learning通过奖励和惩罚机制逐步学习到最优路径,展示了强化学习在实际问题中的应用。

去1:1私密咨询

系列课程: