Оптимизация алгоритма итерации стоимости в обучении подкреплению
У меня есть одно сомнение, связанное с итерацией значения. Я пытался решить проблему "FrozenLake8x8-v0". Алгоритм, который я использовал, в основном рассчитывает вознаграждение для каждого состояния, если мы хотим сделать первые 1000 шагов из этого состояния. Чтобы получить политику, он пытается вычислить 1001-й шаг со всеми возможными действиями, и действие, которое дает наибольшую награду, он выберет это действие для этого соответствующего состояния.
Но в случае "FrozenLake8x8-v0" основным мотивом является достижение цели, и вы получите награду 1, только если достигнете цели. Итак, что я сделал, я сделал 1000 итераций после каждой итерации, я проверяю, для каких состояний мы получаем вознаграждение> 0, что означает, что оно достигло цели, и в той же итерации я также буду хранить действие, которое он предпринял (Любое действие, получающее вознаграждение > 0). Состояния, за которые я получил вознаграждение> 0, я не буду рассматривать их для следующей итерации. Точно так же, когда мы увидим это для двух последовательных итераций, если мы получим одинаковое количество состояний с наградой = 0. Это означает, что они дырки, и я нарушаю цикл итерации.
Почему я использую приведенный выше сценарий
- Это не должно повторяться в течение 1000 итераций.
- Мы всегда будем указывать агенту на наименьший путь для достижения цели из этого состояния.
Но при втором подходе агент работает очень плохо. Счет равен примерно 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