Итак, в моем задании мне нужно решить Mountain car, оптимизировав функцию значения состояния действия с использованием аппроксимации линейной функции, в частности, с использованием полиномов в качестве функций. Для решения этой проблемы я использую Эпизодическую полуградиентную Сарсу для оценки функции оптимального значения состояния (как в http://www.cs.cmu.edu/~rsalakhu/10703/Lecture_VFA.pdf стр. 26). Мой вектор признаков для пары [состояние = (позиция, скорость), действие] выглядит следующим образом:
[1, действие, позиция, скорость, позицияXvelocity, actionXvelocity, actionXposition, actionXpositionXvelocity]
поэтому я выбрал полином первой степени ...
Я инициализирую весовой вектор W нулями и в значительной степени следую точному алгоритму. К сожалению, каждый раз, когда я запускаю его (также пытался во многих эпизодах), моему агенту никогда не удается достичь вершины горы, и поэтому он имеет только -1 награду, поэтому улучшения никогда не происходит. Я не хочу менять окружающую среду, так как чувствую, что это «обман». Есть идеи что поменять? мой код в значительной степени следует алгоритму http://www.cs.cmu.edu/~rsalakhu/10703/Lecture_VFA.pdf стр. 26
n- это полиномиальный порядок, phi- вычисляет вектор признаков, qhat- вычисляет featurevector * weightvector, qhat_derived_policy - реализация жадного алгоритма epsilon для выбора действия
def Episodic_Semi_gradient_Sarsa(alpha, epsilon, n):
env = gym.make("MountainCar-v0")
env.seed(3333) # Set a seed for reproducability
w = np.ones((n+1)**3)
w[((n+1)**3) - 1]=0
for i_episode in range(10000):
state = env.reset()
for t in range(200):
env.render()
action = qhat_derived_policy(state, epsilon, w, n)
nextstate, reward, done, info = env.step(action)
if done:
w += alpha*(reward - qhat(state, action, w, n))*phi(state, action, n)
print("Episode finished after {} timesteps".format(t+1))
break
nextaction = qhat_derived_policy(nextstate, epsilon, w, n)
w += alpha*(reward + qhat(nextstate, nextaction, w, n)-qhat(state, action, w, n))*phi(state, action, n)
action = nextaction
state = nextstate