Q-learning原理及代码实现
目录
1. Q-learning原理
1.1 Q值
1.2 更新规则
1.3 目标
1.4 探索与利用
2.代码实现
2.1 代码示例
2.2 解释
1. Q-learning原理
Q-learning是一种基于值的强化学习算法,用于在不依赖环境模型的情况下学习最优策略。它的目标是通过学习动作-状态对的价值(即Q值),找到使得累计奖励最大的策略。以下是Q-learning的关键步骤和公式:
1.1 Q值
Q值(动作价值)是一个函数,表示在某一状态下选择某一动作后,能够获得的未来累计奖励。Q值表示为 ,其中 是当前状态, 是当前动作。
1.2 更新规则
Q-learning 的核心是 Q 值的更新公式。在每一步,Q-learning 会通过与环境交互,更新对应的 Q 值:
其中:
- 是当前 Q 值
- 是学习率,控制更新的速度
- 是执行动作后获得的即时奖励
- 是折扣因子,权衡当前奖励和未来奖励的影响
- 是在新状态 下所有可能动作的最大 Q 值
1.3 目标
通过反复更新Q值,Q-learning可以逐渐逼近最优动作价值函数 。这样,在每个状态下,选择Q值最大的动作就能得到最优策略。
1.4 探索与利用
Q-learning 需要平衡“探索”和“利用”:
- 探索:选择随机动作,以探索新的可能性。
- 利用:选择当前 Q 值最高的动作,以获得最大奖励。
常用的探索策略是 -贪心策略,即以概率 随机选择动作,以概率 选择当前最佳动作。
Q-learning 已广泛应用于游戏、路径规划等领域,特别适合在离散状态和动作空间下的控制任务。
2.代码实现
我们可以用一个简单的迷宫问题来举例,展示如何使用Q-learning找到从起点到终点的最优路径。假设一个5x5的迷宫,其中:
- 起点在左上角(0, 0),终点在右下角(4, 4)。
- 代理(智能体)每次可以向上、下、左、右四个方向移动。
- 如果撞墙或走出边界,则返回到该状态,并获得-1的奖励。
- 到达终点时获得+10的奖励。
- 其余位置每次移动获得-0.1的奖励,以鼓励代理尽快找到终点。
2.1 代码示例
以下是一个基于Q-learning的简单实现,用来训练智能体找到从起点到终点的最短路径。
import numpy as np
import random
# 环境设置
maze_size = 5
goal = (4, 4) # 目标状态
actions = ['up', 'down', 'left', 'right'] # 动作空间
action_dict = {'up': (-1, 0), 'down': (1, 0), 'left': (0, -1), 'right': (0, 1)}
# Q-learning参数
alpha = 0.1 # 学习率
gamma = 0.9 # 折扣因子
epsilon = 0.1 # 探索概率
episodes = 5000 # 训练轮数
# 初始化Q表
Q_table = np.zeros((maze_size, maze_size, len(actions)))
# 定义奖励函数
def get_reward(state):
if state == goal:
return 10
else:
return -0.1
# 获取下一个状态
def next_state(state, action):
row, col = state
move = action_dict[action]
next_row, next_col = row + move[0], col + move[1]
if 0 <= next_row < maze_size and 0 <= next_col < maze_size:
return (next_row, next_col)
else:
return state # 撞墙则停在原地
# Q-learning算法
for episode in range(episodes):
state = (0, 0) # 初始状态
while state != goal:
# 选择动作
if random.uniform(0, 1) < epsilon:
action_index = random.randint(0, len(actions) - 1) # 随机选择动作
else:
action_index = np.argmax(Q_table[state[0], state[1]]) # 利用Q值选择最优动作
action = actions[action_index]
# 执行动作,观察奖励和下一个状态
next_state_ = next_state(state, action)
reward = get_reward(next_state_)
# 更新Q值
best_next_action = np.argmax(Q_table[next_state_[0], next_state_[1]])
Q_table[state[0], state[1], action_index] += alpha * (reward + gamma * Q_table[next_state_[0], next_state_[1], best_next_action] - Q_table[state[0], state[1], action_index])
# 状态更新
state = next_state_
# 打印结果Q表
print("Learned Q-table:")
print(Q_table)
# 显示路径
state = (0, 0)
path = [state]
while state != goal:
action_index = np.argmax(Q_table[state[0], state[1]])
action = actions[action_index]
state = next_state(state, action)
path.append(state)
print("Optimal path from start to goal:", path)
2.2 解释
- 环境初始化:我们定义了一个5x5的迷宫,每个位置可以向上、下、左、右四个方向移动。
- Q表更新:Q表存储在
Q_table
中,维度为(maze_size, maze_size, len(actions))
。每个状态在四个方向上有一个Q值。 - 训练过程:
- 通过
epsilon
-贪心策略选择动作,以平衡探索和利用。 - 根据所选动作获得奖励,计算下一个状态,并用更新规则调整当前状态的Q值。
- 通过
- 输出路径:训练完成后,输出从起点到目标的最优路径。
通过多次迭代,智能体将学习到从左上角到右下角的最短路径。