Решающий горный автомобиль (тренажерный зал) с линейным приближением функции значения с обновлением веса разницы во времени - PullRequest
0 голосов
/ 20 января 2019

Итак, в моем задании мне нужно решить 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
...