ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 03-2. Monte Carlo (MC) 코드
    실험실/RL 2018. 7. 29. 11:54




    에이전트는 에피소드가 마침(완료) 상태에 갈 때까지 아무것도 하지 않는다. 마침 상태가 되면 에이전트는 지나온 모든 상태의 value function을 업데이트한다.  

    에피소드 동안 방문했던 모든 상태의 value function을 업데이트하면 에이전트는 다시 시작 상태에서부터 새로운 에피소드를 진행한다. 

    이러한 과정을 반복하는 것이 Monte Carlo prediction이다.

    
    if __name__ == "__main__":
        env = Env()
        agent = MCAgent(actions=list(range(env.n_actions)))  # [0, 1, 2, 3]
    
        # generate an episodes
        for episode in range(10):   # 1000
            state = env.reset()
            # 입실론 탐욕 정책에 따라서 current state에 따른 action을 반환
            action = agent.get_action(state)
    
            while True:
                env.render()
    
                # 다음 상태로 이동 : 보상(reward)은 숫자이고, 완료 여부(done)는 boolean
                next_state, reward, done = env.step(action)
                # 메모리에 sample 저장 
                agent.save_sample(next_state, reward, done)
    
                # 다음 상태로 이동하기위한 action 받아옴
                action = agent.get_action(next_state)
    
                # 에피소드가 완료됐을 때, value function 업데이트
                if done:
                    print("episode : ", episode)
                    agent.update()
                    agent.samples.clear()
                    break
    
    
    
    # 몬테카를로 에이전트 (모든 에피소드 각각의 샘플로 부터 학습)
    class MCAgent:
        def __init__(self, actions):
            self.width = 5
            self.height = 5
            self.actions = actions      # [0, 1, 2, 3]
            self.learning_rate = 0.01   # step size
            self.discount_factor = 0.9
            self.epsilon = 0.1
            self.samples = []   # '한 episode 가 끝나는 terminal state 까지' 이어지는 모든 과정(trajectory)의 next_state, reward, done 저장
            self.value_table = defaultdict(float)   # 에이전트가 방문한 상태의 value function : 방문했던 그리드 상태(위치)에 대한 value function 저장
    
        # 메모리에 sample 추가
        def save_sample(self, state, reward, done):
            self.samples.append([state, reward, done])
    
        # 모든 에피소드에서 에이전트가 방문한 state의 value function 업데이트
        # First-visit
        def update(self):
            G_t = 0
            visit_state = []
    
            # for each state s appearing in the episode :
            for sample in reversed(self.samples):
                state = str(sample[0])
    
                # following the first occurrence of s with return G
                # 첫번째 방문에 대한 것만 사용하므로, 두번 이상 방문한 s with return G는 계산되지 않는다.
                if state not in visit_state:
                    visit_state.append(state)
                    # reverse 해서 사용하므로 G6 -> G5 -> G4 -> G3 -> G2 -> G1의 형태로 계산된다.
                    G_t = self.discount_factor * (sample[1] + G_t)
                    value = self.value_table[state]     # current 상태(위치)의 value function 값
                    # value = mean return
                    self.value_table[state] = (value + self.learning_rate * (G_t - value)) 
    
        ...
    
    
    
    


    44page 추가 정리


    '실험실 > RL' 카테고리의 다른 글

    Value Function  (0) 2018.07.30
    02. Value Iteration  (0) 2018.07.29
    01. Policy Iteration  (0) 2018.07.29
Designed by Tistory.