目录
Python 案例:使用 Q - learning 解决迷宫问题
基本概念
强化学习是机器学习的一个领域,其核心思想是智能体(Agent)在环境(Environment)中通过不断地与环境进行交互,尝试不同的动作(Action),并根据环境反馈的奖励(Reward)来学习如何做出最优决策,以最大化长期累积奖励。
主要元素
- 智能体(Agent):是学习和决策的主体,它能够感知环境状态,根据一定的策略选择动作,并从环境中接收奖励反馈。
- 环境(Environment):智能体所处的外部世界,它定义了状态空间、动作空间和奖励函数。环境会根据智能体的动作改变自身状态,并给予智能体相应的奖励。
- 状态(State):是对环境在某一时刻的描述,智能体根据当前状态来选择动作。状态可以是离散的,也可以是连续的。
- 动作(Action):智能体在某个状态下可以采取的行为,动作空间定义了所有可能的动作集合。
- 奖励(Reward):是环境对智能体动作的即时反馈,用于指导智能体的学习。智能体的目标是最大化长期累积奖励。
- 策略(Policy):是智能体选择动作的规则,它将状态映射到动作。策略可以是确定性的,也可以是随机性的。
学习过程
强化学习的学习过程通常是一个马尔可夫决策过程(MDP),包括以下步骤:
- 智能体处于初始状态
。
- 智能体根据当前策略
选择一个动作
。
- 环境根据智能体的动作,转移到下一个状态
,并给予智能体一个奖励
。
- 智能体根据新的状态和奖励更新策略
。
- 重复步骤 2 - 4,直到达到终止状态。
常见算法分类
- 基于值函数的方法:通过估计状态或状态 - 动作对的值函数来学习最优策略,如 Q - learning、SARSA 等。值函数表示从某个状态或状态 - 动作对开始,遵循某个策略所能获得的长期累积奖励的期望。
- 基于策略梯度的方法:直接对策略进行参数化,通过优化策略的参数来最大化长期累积奖励,如 REINFORCE、A2C(Advantage Actor - Critic)、A3C(Asynchronous Advantage Actor - Critic)等。
- 演员 - 评论家方法(Actor - Critic):结合了基于值函数和基于策略梯度的方法,既有负责选择动作的演员(Actor),又有负责评估价值的评论家(Critic),如 DDPG(Deep Deterministic Policy Gradient)、TD3(Twin Delayed Deep Deterministic Policy Gradient)等。
示例
以玩游戏为例,假设智能体是一个游戏玩家,环境是游戏世界。游戏中的各种场景和角色状态就是状态,玩家可以采取的操作(如移动、攻击、跳跃等)就是动作。当玩家完成一个任务或击败一个敌人时,游戏会给予一定的分数奖励,这就是奖励。玩家通过不断地尝试不同的操作,根据获得的分数来学习如何在游戏中取得更高的分数,即最大化长期累积奖励。
Python 案例:使用 Q - learning 解决迷宫问题
import numpy as np
# 定义迷宫环境
maze = np.array([
[0, 0, 0, 0],
[0, -1, 0, -1],
[0, 0, 0, 0],
[0, -1, 0, 1]
])
# 定义动作空间
actions = ['up', 'down', 'left', 'right']
# 初始化Q表
q_table = np.zeros((maze.shape[0] * maze.shape[1], len(actions)))
# 定义超参数
learning_rate = 0.1
discount_factor = 0.9
epsilon = 0.1
episodes = 1000
# 获取状态索引
def get_state_index(state):
return state[0] * maze.shape[1] + state[1]
# 选择动作
def choose_action(state):
if np.random.uniform(0, 1) < epsilon:
return np.random.choice(len(actions))
else:
state_index = get_state_index(state)
return np.argmax(q_table[state_index])
# 更新Q表
def update_q_table(state, action, reward, next_state):
state_index = get_state_index(state)
next_state_index = get_state_index(next_state)
q_table[state_index, action] = (1 - learning_rate) * q_table[state_index, action] + \
learning_rate * (reward + discount_factor * np.max(q_table[next_state_index]))
# 训练智能体
for episode in range(episodes):
state = [0, 0]
done = False
while not done:
action = choose_action(state)
if actions[action] == 'up':
next_state = [max(state[0] - 1, 0), state[1]]
elif actions[action] == 'down':
next_state = [min(state[0] + 1, maze.shape[0] - 1), state[1]]
elif actions[action] == 'left':
next_state = [state[0], max(state[1] - 1, 0)]
elif actions[action] == 'right':
next_state = [state[0], min(state[1] + 1, maze.shape[1] - 1)]
reward = maze[next_state[0], next_state[1]]
update_q_table(state, action, reward, next_state)
state = next_state
if reward == 1:
done = True
# 测试智能体
state = [0, 0]
done = False
path = [state.copy()]
while not done:
action = np.argmax(q_table[get_state_index(state)])
if actions[action] == 'up':
state = [max(state[0] - 1, 0), state[1]]
elif actions[action] == 'down':
state = [min(state[0] + 1, maze.shape[0] - 1), state[1]]
elif actions[action] == 'left':
state = [state[0], max(state[1] - 1, 0)]
elif actions[action] == 'right':
state = [state[0], min(state[1] + 1, maze.shape[1] - 1)]
path.append(state.copy())
if maze[state[0], state[1]] == 1:
done = True
print("找到的路径:", path)
代码解释
- 环境定义:使用二维数组
maze
表示迷宫环境,其中0
表示可通行区域,-1
表示障碍物,1
表示目标位置。 - Q 表初始化:创建一个 Q 表
q_table
,用于存储每个状态 - 动作对的 Q 值。 - 超参数设置:设置学习率
learning_rate
、折扣因子discount_factor
、探索率epsilon
和训练轮数episodes
。 - 动作选择:使用 ϵ- 贪心策略选择动作,以一定的概率随机选择动作进行探索,否则选择 Q 值最大的动作进行利用。
- Q 表更新:根据 Q - learning 算法的更新公式更新 Q 表,使得 Q 值逐渐收敛到最优值。
- 训练过程:在每个训练轮次中,智能体从初始状态开始,不断选择动作并更新 Q 表,直到到达目标位置。
- 测试过程:使用训练好的 Q 表,让智能体从初始状态开始,选择 Q 值最大的动作,直到到达目标位置,记录下找到的路径。