logo

할인 실습

미끄러운 보행 Slippery Walk

  • 격자 세계(grid world)
  • 상태:
    • 구멍: 종료
    • 골: +1점을 보상으로 받고 종료
    • 중간: 비종료 상태
  • 가운데서 시작
  • 행동: 좌우로만 이동
  • 전이 함수: 행동한대로 이동(1/2). 제자리(1/3). 반대방향(1/6)
구멍 1 2 3 4 5 골

SlipperyWalk 사용

import gymnasium as gym
import numpy as np

class SlipperyWalk(gym.Env):
    def __init__(self, length):
        super().__init__()

        self.action_space = gym.spaces.Discrete(2)
        self.observation_space = gym.spaces.Discrete(length)

        self.start_state = length // 2  # 2로 나눈 몫
        self.state = self.start_state
        self.done = False
        self.truncated = False
        self.length = length
        self.P = self.set_transition()

    def set_transition(self):
        P = {}
        transition_probs = {'MOVE': 1/2, 'STAY': 1/3, 'OPPOSITE': 1/6}
        goal = self.length - 1

        for s in range(self.length):
            P[s] = {}
            for a in range(2):
                if s == 0:
                    P[s][a] = [(1.0, s, 0, True)]  # 확률, 상태, 보상, 종료 여부
                elif s == goal:
                    P[s][a] = [(1.0, s, 1, True)]
                else:
                    transitions = []
                    for transition, prob in transition_probs.items():
                        if transition == 'MOVE':
                            next_state = s + 1 if a == 1 else s - 1
                        elif transition == 'STAY':
                            next_state = s
                        elif transition == 'OPPOSITE':
                            next_state = s - 1 if a == 1 else s + 1
                        next_state = max(0, min(goal, next_state))   # 범위 제한 표현
                        reward = 1 if next_state == goal else 0      # 삼항 연산자
                        done = next_state == 0 or next_state == goal
                        transitions.append((prob, next_state, reward, done))
                    P[s][a] = transitions

        return P

    def reset(self):
        self.state = self.start_state
        self.done = False
        self.truncated = False
        self.steps = 0
        return self.state, {}

    def step(self, action):
        transitions = self.P[self.state][action]
        probs = np.array([t[0] for t in transitions])
        i = np.random.choice(np.arange(len(transitions)), p=probs)
        _, self.state, reward, self.done = transitions[i]
        self.steps += 1
        self.truncated = self.steps >= 100
        return self.state, reward, self.done, self.truncated, {}

    def render(self, mode='human'):
        grid = ['X'] + ([' '] * (self.length - 2)) + ['O']  # 리스트 연산
        grid[self.state] = 'A'
        print('|' + '|'.join(grid) + '|') # 문자열 연산

    @property
    def unwrapped(self):
        return self

환경 생성(총 9칸):

env = SlipperyWalk(9)

리셋:

env.reset()

왼쪽으로 한 걸음:

env.step(0)

그리기:

env.render()

미끄러운 보행에서 할인이 없다면?

  • 할인율 γ=1.0이면
  • 골로 바로 가는 경우:
    • 3 → 4 → 5 → 골
  • 빙 돌아가는 경우:
    • 예: 3 → 2 → 3 → 4 → 5 → 골
  • 수익이 같음
    • 보상은 골에 도착할 때 한 번만 받으므로

퀴즈

문제 1 / 2맞음: 0힌트: 0틀림: 0채점중: 0남음: 2

Slippery Walk 환경에 대한 설명으로 올바른 것을 모두 고르세요.

  • ☐구멍과 골은 종료 상태이다
  • ☐중간 상태는 비종료 상태이다
  • ☐행동 공간은 상하좌우 네 방향이다
  • ☐선택한 행동은 항상 확률 1로 실행된다

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.