Q-Learning (code)

Seungsoo Lee·2022년 7월 7일
0

RL

목록 보기
14/15

date: 2021-10-18 22:48:00


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

이 코드를 이해하려면 앞선 Q-Learning 포스트를 읽어주세요.

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


agent.py


if __name__ == "__main__":
    env = Env()
    agent = QLearningAgent(actions=list(range(env.n_actions)))

    # 1000개의 에피소드를 진행함.
    for episode in range(1000):
      	# 게임 환경과 상태를 초기화
        state = env.reset()

        while True:
            # 게임 환경과 상태를 초기화
            env.render()
            # 현재 상태에 대한 행동 선택 (epsilon greedy policy 에 의한 action 선택임)
            action = agent.get_action(state)
            # 행동을 취한 후 다음 상태, 보상 에피소드의 종료여부를 받아옴
            next_state, reward, done = env.step(action)
            # <s,a,r,s'>로 큐함수를 업데이트
            agent.learn(state, action, reward, next_state)
						
            # 반복을 위해 다시 next 변수를 state로 초기화 시킴
            state = next_state
            
            # 모든 큐함수를 화면에 표시
            env.print_value_all(agent.q_table)

            if done:
                break

QLearningAgent 클래스의 초기화 부분을 보겠다

class QLearningAgent:
    def __init__(self, actions):
        self.actions = actions
        # (stepsize가 작기 때문에 reward와 penalty를 각각 100, -100으로 설정함)
        self.step_size = 0.01
        self.discount_factor = 0.1
        self.epsilon = 0.9
        # 0을 초기값으로 가지는 큐함수 테이블 생성
        self.q_table = defaultdict(lambda: [0.0, 0.0, 0.0, 0.0])

learn 함수에 대해서 보겠다.

# <s, a, r, s'> 샘플로부터 큐함수 업데이트
    def learn(self, state, action, reward, next_state):
    		# 변수들을 str으로 변환해줌
        state, next_state = str(state), str(next_state)
        # 매개변수로 받아온 현재 state의 action에 해당하는 q값을 얻어와서 q_1에 넣음
        q_1 = self.q_table[state][action]
        # 벨만 최적 방정식을 사용한 큐함수의 업데이트 (가장 큰 q를 하는 행동일때의 q값을 사용)
        q_2 = reward + self.discount_factor * max(self.q_table[next_state])
        # q_table에 해당 state에서 해당 action을 하였을때의 새로 업데이트된 q값을 넣는다. 
        self.q_table[state][action] += self.step_size * (q_2 - q_1)

get_action 함수에 대해서 보겠다.

# 큐함수에 의거하여 입실론 탐욕 정책에 따라서 행동을 반환
    def get_action(self, state):
		    # 설정된 epsilon이 0.1 이라서 10% 확률로 무작위 행동을 함
        if np.random.rand() < self.epsilon:
            # 무작위 행동 반환
            action = np.random.choice(self.actions)
        else:
            # 큐함수에 따른 행동 반환
            # 최대 q값을 하는 행동을 반환
            state = str(state)
            q_list = self.q_table[state]
            action = arg_max(q_list)
        return action

제가 올린 글에서 잘못된 부분이 있으면 제 메일로 연락주세요!

Reference : https://github.com/rlcode/reinforcement-learning-kr-v2


이승수의 저작물인 이 저작물은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

0개의 댓글