强化学习中的 Q-learning(Q学习)是一种用于学习在未知环境中做出决策的方法。它是基于值函数的方法,通过学习一个值函数 Q,该函数表示在给定状态和动作下,期望的累积奖励。
以下是一个简单的 Q-learning
的实现教程,使用 Python 进行演示。这里我们考虑一个简单的驾驶代理程序在一个格子世界中学习如何最优地选择动作以达到目标。
import numpy as np
# 定义格子世界的大小
num_states = 6
num_actions = 4 # 上、下、左、右
# 初始化 Q 表
Q = np.zeros((num_states, num_actions))
# 定义参数
alpha = 0.1 # 学习率
gamma = 0.9 # 折扣因子
epsilon = 0.1 # 探索概率
# 定义转移矩阵 R
R = np.array([
[-1, -1, -1, -1, 0, -1],
[-1, -1, -1, 0, -1, 100],
[-1, -1, -1, 0, -1, -1],
[-1, 0, 0, -1, 0, -1],
[0, -1, -1, 0, -1, 100],
[-1, 0, -1, -1, 0, 100]
])
# Q-learning 算法
def q_learning(state, alpha, gamma, epsilon, num_episodes):
for episode in range(num_episodes):
current_state = state
while current_state != 5: # 目标状态为5
# epsilon-greedy策略选择动作
if np.random.rand() < epsilon:
action = np.random.choice(range(num_actions))
else:
action = np.argmax(Q[current_state, :])
# 执行动作,得到下一个状态
next_state = action
# 更新 Q 值
Q[current_state, action] = Q[current_state, action] + alpha * \
(R[current_state, action] + gamma * np.max(Q[next_state, :]) - Q[current_state, action])
# 进入下一个状态
current_state = next_state
# 运行 Q-learning 算法
q_learning(state=0, alpha=alpha, gamma=gamma, epsilon=epsilon, num_episodes=1000)
# 打印学得的 Q 表
print("Learned Q-table:")
print(Q)
在这个例子中,我们定义了一个简单的格子世界,其中代理程序在不同的状态之间移动,选择上、下、左、右四个动作。代理程序通过 Q-learning
学习在每个状态下选择每个动作的 Q 值
。在每个训练 episode
中,代理程序根据 epsilon-greedy
策略选择动作,执行动作后更新 Q 值
。
请注意,这只是一个简化的 Q-learning
示例,实际应用中可能涉及到更复杂的环境和状态。调整参数,如学习率(alpha
)、折扣因子(gamma
)、探索概率(epsilon
),是实现良好性能的关键。