我对价值迭代有疑问。我正在尝试解决“ FrozenLake8x8-v0”问题。如果我们要从该州起步1000步,我主要使用的算法是为每个州计算奖励。为了获得该策略,它尝试使用所有可能的操作来计算第1001步,并且给出最高奖励的操作将针对相应的状态选择该操作。
但是在“ FrozenLake8x8-v0”的情况下,主要动机是达到目标,只有达到目标,您才能获得1分的奖励。所以我要做的是,在每次迭代之后我进行了1000次迭代,我检查我们获得的所有状态的奖励均大于0,这意味着它达到了目标,并且在同一迭代中我还将存储所采取的动作(任何动作都奖励) > 0)。获得奖励的状态> 0,在下次迭代中将不考虑它们。以同样的方式,如果我们得到2个连续迭代,如果得到的状态数相同,且奖励=0。这意味着它们是空洞,我打破了迭代循环。
为什么我使用上述情况
但是在第二种方法中,代理的表现非常差。该分数约为0.003,在第一个分数中为0.965。我不明白为什么会这样?
我的方法:
def value_Iteration(env,gamma=1,iteration=1000):
v = np.zeros(env.nS)
policy = np.zeros(env.nS)
numStateZero = 0
for i in range(iteration):
print("Iteration:{}".format(i))
v_new = np.zeros(env.nS)
for s in range(env.nS):
if not v[s] > 0.0:
q_s = np.zeros(env.nA)
q_s = [sum([p*(r_ + gamma * v[s_]) for p,s_,r_,_ in env.P[s][a]]) for a in range(env.nA)]
policy[s] = np.argmax(q_s)
v_new[s] = max(q_s)
else:
v_new[s] = v[s]
if count(v_new,0) == numStateZero:
return v_new,policy
else:
numStateZero = count(v_new,0)
v=np.copy(v_new)
return v,policy