( 참고 : Fastcampus 강의 )

[ 3. Markov Decision Process (MDP) 실습 ]


1. 환경 설정하기

1-1. Import Packages

import sys; sys.path.append('..') 
import numpy as np 

from src.common.gridworld import GridworldEnv 


1-2. Make Environment

num_y, num_x = 4, 4
env = GridworldEnv(shape=[num_y, num_x])

=========== T x o o o o o o o o o o o o o T

===========

  • T: 도착점 (종결상태, Terminal state)
  • x: 현재 위치 $s_t$
  • o: 다른 환경의 점


2. Environment 소개

observation_space = env.observation_space
action_space = env.action_space
P = env.P_tensor
R = env.R_tensor
  • observation_space의 크기 : 16 ( 4x4의 grid )
  • action_space의 크기 : 4( 상/하/좌/우 )

  • P (Transition Matrix)의 크기 : 4x16x16
    • 4 : a (상하좌우)
    • 16 : 현재 상태 (4x4=16)
    • 16 : 다음 상태 (4x4=16)
  • R (Reward)의 크기 : 16x4
    • 16 : 16개의 state에서
    • 4 : 4가지 행동을 했을 때의 return값들


ex) “상”으로 행동할 경우의 transition probability는?

action_up_prob = P[0, :, :]
  • 값을 확인해보면, 전부 1 or 0이다 ( deterministic이다 )

  • 현실성이 없다

    ( 현실은 “상”으로 행동한다고 반드시 “상”으로 가게 되지 않을 수도 )


3. Markov Decision Process

3-1. Episode

MDP의 Episode는

\(<(s_0, a_0, r_0, s_1),..., (s_{t}, a_{t}, r_{t}, s_{t+1}),..., (s_{T-1}, a_{T-1}, r_{T-1}, s_{T})>\) 으로 구성


4가지 행동 (dictionary)

action_mapper = {
    0: 'UP',
    1: 'RIGHT',
    2: 'DOWN',
    3: 'LEFT'
}


한 번의 Episode 수행하기

  • terminal state에 도달하면, 하나의 epsiode가 끝나게 된다.
_ = env.reset()

num_step = 0
while True:
    print("t = {}".format(num_step))
    
    # (1) environment 세우기
    env._render()
    cur_state = env.s
    
    # (2) random하게 상/하/좌/우 중 1개 고르기
    action = np.random.randint(low=0, high=4)
    
    # (3) action하기
    next_state, reward, done, info = env.step(action)    
    
    print("state : {}".format(cur_state))
    print("aciton : {}".format(action_mapper[action]))
    print("reward : {}".format(reward))
    print("next state : {} \n".format(next_state))
    print('---------------------------------------')
    num_step += 1
    if done:
        break


3-2. 여러 번의 Epsiode

run_episode : initial state와 environment를 주어주면, 1번의 episode를 수행하는 함수

def run_episode(env, s0):
    _ = env.reset() 
    env.s = s0
    num_step = 0
    
    while True:
        action = np.random.randint(low=0, high=4)
        next_state, reward, done, info = env.step(action)
        num_step += 1
        if done:
            break
    return num_step


Settings

  • 총 10번의 epsiode 수행
  • initial state : 6
num_episodes = 10
s0 = 6

for i in range(num_episodes):
    len_ep = run_episode(env, s0)
    print("Episode {} | Length of episode : {}".format(i, len_ep))
Episode 0 | Length of episode : 5
Episode 1 | Length of episode : 101
Episode 2 | Length of episode : 29
Episode 3 | Length of episode : 7
Episode 4 | Length of episode : 7
Episode 5 | Length of episode : 5
Episode 6 | Length of episode : 11
Episode 7 | Length of episode : 9
Episode 8 | Length of episode : 28
Episode 9 | Length of episode : 3