我目前正在尝试在萨特顿(Sutton),巴托(Barto)的“强化学习,入门”中描述在一个有风的上游的网格世界上的SARSA算法。 (我使用的环境与萨顿(Sutton),巴托(Barto)-第130页。)基本上,有70个区域,一个区域可以在四个方向上移动:上,下,左或右。在某些状态下,风将使机芯向上移动一级。对于未达到目标的每个时间步,奖励为-1。
我实施了环境,一切似乎都正常进行。但是,学习算法似乎无效。该书的作者声称,当使用某些参数时,在学习了约150集后,该算法收敛到接近最优的解决方案。我的代码不是这种情况(用Julia v1.1.0编写)
g = GridWorld()
α = 0.5
γ = 1
ϵ = 0.1
Q = zeros(70,4)
for episode in 1:100000
isDone = false
S = g.start
A = eps_greedy(Q,ϵ,S)
while !isDone
(R,isDone) = action(g,A)
S´ = g.position
A´ = eps_greedy(Q,ϵ,S´)
Q[S,A] += α*(R + γ* Q[S´,A´] - Q[S,A])
S = S´
A = A´
end
end
对象g存储当前状态,当调用action(g,A)时,该状态根据操作A而改变。函数eps_greedy(Q,epsilon,S)只是获取当前状态,然后从操作值函数Q中选择一个epsilon-greedy操作。
问题是:我训练的时间越长,存储在Q中的动作值就会越低。例如,训练约2000集,开始状态的动作值在-950处都相似。训练20000将产生约-10000的作用值。 我不认为这会发生,但是我不太确定是什么导致了问题。任何帮助将不胜感激!