미로에서역진자 태스크에서는 더 복잡하게 상태가 정의되어야함원래 상태가 가질 수 있는 것은 연속값이지만, 상한과 하한부터 이산값으로 변환하여 표현
# 구현에 사용할 패키지 임포트
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import gym
# 상수 정의
ENV = 'CartPole-v0' # 태스크 이름
NUM_DIZITIZED = 6 # 각 상태를 이산변수로 변환할 구간 수
# CartPole 실행
env = gym.make(ENV) # 실행할 태스크 설정
observation = env.reset() # 환경 초기화
# 이산값으로 만들 구간 계산
def bins(clip_min, clip_max, num) :
'''관측된 상태(연속값)를 이산값으로 변환하는 구간을 계산'''
return np.linspace(clip_min, clip_max, num + 1)[1:-1]
np.linspace는 각 구간 경곗값으로 이뤄진 수열을 생성하는 명령이다np.linspace(-2.4,2.4,6+1)을 실행하면bins에 구했던 구간값에 따라 연속변수를 이산변수로 변환하는 함수를 구현def digitize_state(observation) :
'''관측된 상태(observation 변수)를 이산값으로 변환'''
cart_pos, cart_v, pole_angle, pole_v = observation
digitized = [
np.digitize(cart_pos, bins=bins(-2.4, 2.4, NUM_DIZITIZED)),
np.digitize(cart_v, bins=bins(-3.0, 3.0, NUM_DIZITIZED)),
np.digitize(pole_angle, bins=bins(-0.5, 0.5, NUM_DIZITIZED)),
np.digitize(pole_v, bins=bins(-2.0, 2.0, NUM_DIZITIZED))
]
return sum([x * (NUM_DIZITIZED**i) for i, x in enumerate(digitized)])
np.digitize는 상태변수의 리스트를 bins에 정의된 구간값에 따라 이산값으로 변환digitize_state의 반환값은 상태 4개 변수를 모두 합쳐 0부터 1295사이의 값으로 변환DIGITIZED = 6이라면 6진수로 계산