我有一个随机环境,我正在为环境中发生的学习实施一个 Q 表。代码如下所示。简而言之,有十种状态(0、1、2、...、9),以及三个动作:0、1 和 2。动作 0 什么都不做,动作 1 以 0.7 的概率减去 1,动作2 以 0.7 的概率加 1。当我们处于状态 5 时,我们得到 1 的奖励,否则为 0。
import numpy as np
import matplotlib.pyplot as plt
def reward(s_dash):
if s_dash == 5:
return 1
else:
return 0
states = range(10)
Q = np.zeros((len(states),3))
Q_previous = np.zeros((len(states),3))
episodes = 2000
trials = 100
alpha = 0.1
decay = 0.995
gamma = 0.9
ls_av = []
ls = []
for episode in range(episodes):
print(episode)
s = np.random.choice(states)
eps = 1
for i in range(trials):
eps *= decay
p = np.random.random()
if p < eps:
a = np.random.randint(0,3)
else:
a = np.argmax(Q[s, :])
if a == 0:
s_dash = s
elif a == 1:
if p >= 0.7:
s_dash = max(s-1, 0)
else:
s_dash = s
else:
if p >= 0.7:
s_dash = min(s+1, 9)
else:
s_dash = s
r = reward(s_dash)
Q[s][a] = (1-alpha)*Q[s][a] + alpha*(r + gamma*np.max(Q[s_dash]))
s = s_dash
ls.append(np.max(abs(Q - Q_previous)))
Q_previous = np.copy(Q)
print(Q)
for i in range(10):
print(i, np.argmax(Q[i, :]))
plt.plot(ls)
plt.show()
当我在每集结束时绘制 Q 表中最大变化的绝对值时,我得到以下信息,这表明 Q 表正在不断更新。
但是,我看到当我打印出每个状态的最大 Q 值的动作时,它显示了我期望的最优策略。对于每个状态,最佳动作如下所示:
(0, 2)
(1, 2)
(2, 2)
(3, 2)
(4, 2)
(5, 0)
(6, 1)
(7, 1)
(8, 1)
(9, 1)
我的问题是:为什么我在 Q 表中没有收敛?如果我有一个随机环境,我事先不知道最佳策略是什么,当 Q 表不收敛时,我如何判断是否需要停止训练?