할인 실습
미끄러운 보행 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 → 골
- 예:
- 수익이 같음
- 보상은 골에 도착할 때 한 번만 받으므로
퀴즈
Slippery Walk 환경에 대한 설명으로 올바른 것을 모두 고르세요.
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.