이 코드를 이해하려면 앞선 value iteration 포스트를 읽어주세요.
설명은 주석으로 해두었습니다.
Vk+1(s) = maxa∈A(r(St = s, At = a) + γV k(s'))</center>
value_iteration.py
ValueIteration 클래스의 초기화 부분을 보겠다
class ValueIteration:
def __init__(self, env):
# 환경에 대한 객체 선언
self.env = env
# 가치 함수를 2차원 리스트로 초기화 (25개)
self.value_table = [[0.0] * env.width for _ in range(env.height)]
# 할인율
self.discount_factor = 0.9
value_iteration 함수에 대해서 보겠다.
def value_iteration(self):
# 다음 가치함수 초기화
next_value_table = [[0.0] * self.env.width
for _ in range(self.env.height)]
# 모든 상태에 대해서 벨만 최적방정식을 계산
for state in self.env.get_all_states():
# 마침 상태의 가치 함수 = 0
if state == [2, 2]:
# 2, 2지점은 value를 0으로 설정
next_value_table[state[0]][state[1]] = 0.0
# 바로 다음 state로 간다
continue
# 벨만 최적 방정식
value_list = []
# 2, 2가 아닌 경우 현재 state에서 가능한 action 4가지를 모두 반복함
for action in self.env.possible_actions:
# 현재 반복중인 state에서 해당 action을 하면 다음 state는 무엇일지 next_state에 넣음
next_state = self.env.state_after_action(state, action)
# 현재 반복중인 state에서 해당 action을 하면 다음 state에 있는 reward가 얼마일지 reward에 넣음
reward = self.env.get_reward(state, action)
# next_state에 있는 현재 timestep의 value값을 next_value에다 넣음
next_value = self.get_value(next_state)
# 이번엔 각 action에 대한 q value들을 value_list에다가 추가를 해준다.
value_list.append((reward + self.discount_factor * next_value))
# 최댓q를 다음 가치 함수로 대입
next_value_table[state[0]][state[1]] = max(value_list)
# 각 state에서 모든 next_value를 인스턴스 변수인 self.value_table에 업데이트를 시켜준다
self.value_table = next_value_table
get_action 함수에 대해서 보겠다.
# 현재 가치 함수로부터 행동을 반환
def get_action(self, state):
# state가 마침 상태인 2, 2이면 빈 리스트를 반환하며 함수 마침
if state == [2, 2]:
return []
# 모든 행동에 대해 큐함수 (보상 + (감가율 * 다음 상태 가치함수))를 계산
value_list = []
# 2, 2가 아닌 경우 현재 state에서 가능한 action 4가지를 모두 반복함
for action in self.env.possible_actions:
# 현재 반복중인 state에서 해당 action을 하면 다음 state는 무엇일지 next_state에 넣음
next_state = self.env.state_after_action(state, action)
# 현재 반복중인 state에서 해당 action을 하면 다음 state에 있는 reward가 얼마일지 reward에 넣음
reward = self.env.get_reward(state, action)
# next_state에 있는 현재 timestep의 value값을 next_value에다 넣음
next_value = self.get_value(next_state)
# 이번엔 각 action에 대한 q value들을 value_list에다가 추가를 해준다.
value = (reward + self.discount_factor * next_value)
value_list.append(value)
# 최대 큐 함수를 가진 행동(복수일 경우 여러 개)을 반환
max_idx_list = np.argwhere(value_list == np.amax(value_list))
action_list = max_idx_list.flatten().tolist()
return action_list
제가 올린 글에서 잘못된 부분이 있으면 제 메일로 연락주세요!
Reference : https://github.com/rlcode/reinforcement-learning-kr-v2
이승수의 저작물인 이 저작물은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.