2017-11-25 14 views
0

저는 Q-Learning을 배우고 OpenAI Gym의 FrozenLake-v0 문제에 대해 Q-learner를 구축하려고합니다. 문제는 단지 16 개의 상태와 4 가지 가능한 액션을 가지고 있기 때문에 상당히 간단해야하지만 내 알고리즘이 Q- 테이블을 올바르게 업데이트하지 않는 것처럼 보입니다.FrozenLake Q-Learning 업데이트 문제

import gym 
import numpy as np 
from gym import wrappers 


def run(
    env, 
    Qtable, 
    N_STEPS=10000, 
    alpha=0.2, # 1-alpha the learning rate 
    rar=0.4, # random exploration rate 
    radr=0.97 # decay rate 
): 

    # Initialize pars:: 
    TOTAL_REWARD = 0 
    done = False 
    action = env.action_space.sample() 
    state = env.reset() 

    for _ in range(N_STEPS): 
     if done: 
      print('TW', TOTAL_REWARD) 
      break 

     s_prime, reward, done, info = env.step(action) 
     # Update Q Table: 
     Qtable[state, action] = (1 - alpha) * Qtable[state, action] + alpha * (reward + Qtable[s_prime,np.argmax(Qtable[s_prime,])]) 

     # Prepare for the next step: 
     # Next New Action: 
     if rand.uniform(0, 1) < rar: 
      action = env.action_space.sample() 
     else: 
      action = np.argmax(Qtable[s_prime, :]) 

     # Update new state: 
     state = s_prime 
     # Update Decay: 
     rar *= radr 
     # Update Stats 
     TOTAL_REWARD += reward 
     if reward > 0: 
      print(reward) 

    return Qtable, TOTAL_REWARD 

는 그 다음 Q-학습자 1000 반복을 실행합니다 :

다음은 내 Q 학습 알고리즘

if __name__=="__main__": 
    # Required Pars: 
    N_ITER = 1000 
    REWARDS = [] 
    # Setup the Maze: 
    env = gym.make('FrozenLake-v0') 

    # Initialize Qtable: 
    num_actions = env.unwrapped.nA 
    num_states = env.unwrapped.nS 
    # Qtable = np.random.uniform(0, 1, size=num_states * num_actions).reshape((num_states, num_actions)) 
    Qtable = np.zeros((env.observation_space.n, env.action_space.n)) 

    for _ in range(N_ITER): 
     res = run(env, Qtable) 
     Qtable = res[0] 
     REWARDS.append(res[1]) 
    print(np.mean(REWARDS)) 

어떤 조언을 이해할 수있을 것이다! 여기

답변