이 코드를 이해하려면 앞선 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 국제 라이선스에 따라 이용할 수 있습니다.