Value Iteration(code)

Seungsoo Lee·2022년 7월 7일
0

RL

목록 보기
12/15

date: 2021-10-18 21:00:00


(https://github.com/rlcode/reinforcement-learning-kr-v2) 의 코드를 참고하였습니다.***

이 코드를 이해하려면 앞선 value iteration 포스트를 읽어주세요.

설명은 주석으로 해두었습니다.


Vk+1(s) = maxa∈A(r(St = s, At = a) + γV k(s'))

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 국제 라이선스에 따라 이용할 수 있습니다.

1개의 댓글

comment-user-thumbnail
2023년 1월 4일

아주 좋고 의미있는 기사, 몇 가지 더 배웠습니다. 그리고 시간이 되시면 trap the mouse 에 들러 편안한 시간을 보내시기 바랍니다.

답글 달기