강화학습/OpenAI gym

OpenAI gym을 이용해 ValueIteration 구현하기

APinCan 2020. 3. 8. 17:14

이번에는 OpenAI의 FrozenLake-v0를 이용해서 valueIteration을 구현해보자

 

 

import gym
import numpy as np

GAMMA=0.9
INIT_POLICY=[0.25,0.25,0.25,0.25]
THRESHOLD = 1e-20

선언부는 별 차이가 없음

 

env = gym.make('FrozenLake-v0')

FrozenLake 환경을 만들어주고

 

 

def value_iteration(env, policy):
    value_func = np.zeros(env.observation_space.n)
    after_value_func = np.copy(value_func)
    
    for t in range(1000):
        for state in range(env.observation_space.n):
            q_value_list = []
            state_value = 0
            new_policy = [0, 0, 0, 0]
            
            for action in range(env.action_space.n):
                q_value = 0
                
                for state_st in env.P[state][action]:
                    trans_prob, next_state, reward, _ =state_st
                    q_value += trans_prob*(reward + GAMMA*value_func[next_state])
                
                q_value_list.append(q_value)
            
            action_idx = np.argmax(q_value_list)
            new_policy[action_idx] = 1
            
            # value_iteration이므로 
            after_value_func[state] = q_value_list[action_idx]
            policy[state] = new_policy
        
        if np.sum(np.fabs(after_value_func - value_func)) <= THRESHOLD:
            print("converged at {} timesteps".format(t+1))
            break
        
        value_func = np.copy(after_value_func)
                             
    return value_func

valueIteration의 경우 하나의 코드에서 모든걸 수행함

policyIteration이랑은 다르게 평가와 발전이 따로 있는게 아니라 하나로 합쳐진 모습

왜냐하면 valueIteration은 주변 상태들을 모두 고려하는게 아닌 주변 상태들 중 가장 높은 값을 가지는 것을 선택하기 때문에 greedy action을 선택하는 것과 같음

 

 

policy = [INIT_POLICY for i in range(env.observation_space.n)]
value_func = value_iteration(env, policy)

다음과 같이 valueIteration을 통해 얻은 최적 정책과 가치함수를 알아냄

 

 

valueIteartion의 경우 267번의 타임스텝에서 수렴했음

 

그리고 구한 최적 가치함수

 

같이 구한 최적 정책

 

 

가치함수와 정책을 보면 어디서 많이 본듯한 값임. 바로 이전의 PolicyIteration에서 구한 값과 똑같음

https://apincan.tistory.com/19 이렇게 구하나 저렇게 구하나 결국 어디로 수렴하는지는 정해져 있다!

 

 

Reference

파이썬 예제와 함께하는 강화학습

파이썬과 케라스로 배우는 강화학습