이번에는 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
'강화학습 > OpenAI gym' 카테고리의 다른 글
OpenAI gym을 이용해 SARSA 구현하기 (0) | 2020.03.21 |
---|---|
OpenAI gym을 이용해 TD prediction 구현하기 (1) | 2020.03.20 |
OpenAI gym을 이용해 MonteCarlo prediction 구현하기 (0) | 2020.03.19 |
OpenAI gym을 이용해 PolicyIteration 구현하기 (0) | 2020.03.08 |
윈도우 10에서 OpenAI gym 설치 및 에러 해결 (1) | 2020.03.04 |