[학습 노트 강화] '술고래 집 으로' 에서 Q Learning 알고리즘 알 아 보기

1. 배경
현재 필 자 는 Q - learning 방법 을 이용 하여 술고래 가 집에 돌아 갈 수 있 도록 도와 주 는 작은 예 를 말한다. 예 를 들 어 환경 은 1 차원 세계 이 고 세계 오른쪽 에 술고래 의 집 이다.이 술 귀신 은 술 을 많이 마셔 서 집 으로 돌아 가 는 길 을 전혀 기억 하지 못 한다. 단지 자신의 직감 에 따라 왼쪽으로 가다가 오른쪽으로 간다.술 귀신 은 결국 집 으로 돌아 가 는 데 성공 하면 집 으로 돌아 가 는 방법 을 기억 하 게 된다. 이것 이 바로 그 가 학습 을 강화 하 는 것 으로 배 운 행동 이다.
- w - H 는 술고래 의 집, w 는 술고래 가 있 는 자리
2. Q 학습 소개
3. 코드
프 리 셋 값
import numpy as np
import pandas as pd
import time

np.random.seed(2)   # reproducible

N_STATES = 6   #           , 1      
ACTIONS = ['left', 'right']     #         
EPSILON = 0.9   #     greedy
ALPHA = 0.1     #    
GAMMA = 0.9    #      
MAX_EPISODES = 15   #      
FRESH_TIME = 0.2    #       

q 표
def build_q_table(n_states,actions):
    table = pd.DataFrame(
        np.zeros((n_states,len(actions))),
        columns=actions,
    )
    print(table)
    return table

선택 행위
#     state   ,     
def choose_action(state, q_table):
    state_actions = q_table.iloc[state, :]  #      state     action  
    if (np.random.uniform() > EPSILON) or (state_actions.all() == 0):  #     or      state       
        action_name = np.random.choice(ACTIONS)
    else:
        action_name = state_actions.argmax()    #     
    return action_name

환경 피드백
def get_env_feedback(S, A):
    if A=='right':
        if S == N_STATES -2:
            S_ = 'terminal'
            R = 1
        else:
            S_ = S+1
            R = 0
    else:
        R=0
        if S==0:
            S_ = S
        else:
            S_ = S-1
    return S_, R

환경 업데이트
def update_env(S, episode, step_counter):
    # This is how environment be updated
    env_list = ['-']*(N_STATES-1) + ['H']   # '---------H' our environment
    if S == 'terminal':
        interaction = 'Episode %s: total_steps = %s' % (episode+1, step_counter)
        print('\r{}'.format(interaction), end='')
        time.sleep(1)
        print('\r                                ', end='')
    else:
        env_list[S] = 'w'
        interaction = ''.join(env_list)
        print('\r{}'.format(interaction), end='')
        time.sleep(FRESH_TIME)

학습 주 순환 강화
def rl():
    q_table = build_q_table(N_STATES, ACTIONS)  #    q table
    for episode in range(MAX_EPISODES):     #   
        step_counter = 0
        S = 0   #       
        is_terminated = False   #       
        update_env(S, episode, step_counter)    #     
        while not is_terminated:

            A = choose_action(S, q_table)   #    
            S_, R = get_env_feedback(S, A)  #             
            q_predict = q_table.loc[S, A]    #    (  -  ) 
            if S_ != 'terminal':
                q_target = R + GAMMA * q_table.iloc[S_, :].max()   #     (  -  )  (     )
            else:
                q_target = R     #     (  -  )  (    )
                is_terminated = True    # terminate this episode

            q_table.loc[S, A] += ALPHA * (q_target - q_predict)  #  q_table   
            S = S_  #          state

            update_env(S, episode, step_counter+1)  #     

            step_counter += 1
    return q_table
if __name__ == "__main__":
    q_table = rl()
    print('\r
Q-table:
'
) print(q_table)

전체 코드 이동 Github

좋은 웹페이지 즐겨찾기