强化学习笔记:Q_learning (Q-table)示例举例
1 示例介紹
在右側有寶藏,探險者到達寶藏所在的位置,就可以獲得獎勵
比如某一時刻的狀態是這個樣子的:“-o---T”
?T 就是寶藏的位置, o 是探索者的位置
如果在某個地點?s1, 探索者計算了他能有的兩個行為,?Q(s1, a1) > Q(s1, a2), 那么探索者就會選擇?left?這個行為. 否則就是right
‘
參考內容:小例子 - 強化學習 (Reinforcement Learning) | 莫煩Python (mofanpy.com)
2? 導入庫& 超參數設定
import numpy as np import pandas as pd import timenp.random.seed(2) # 隨機種子N_STATES = 6 # 探寶者可能在的位置ACTIONS = ['left', 'right'] # 探索者的可用動作EPSILON = 0.9 # 貪婪度 greedy #0.9的概率選擇最大的Q對應的action #0.1的概率隨機選actionALPHA = 0.1 # 學習率GAMMA = 0.9 # 獎勵遞減值MAX_EPISODES = 13 # 最大回合數FRESH_TIME = 0.3 # 移動間隔時間3 創建Q-table
這是一個DataFrame
python 庫整理:pandas_UQI-LIUWJ的博客-CSDN博客
index是目前探寶者的位置,columns是對應的動作
?
4 定義動作
定義探寶者如何挑選行為的
這里我們使用ε-greedy
強化學習筆記: generalized policy iteration with MC_UQI-LIUWJ的博客-CSDN博客
# 在某個 state 地點, 選擇行為 def choose_action(state, q_table):state_actions = q_table.iloc[state, :] # 選出這個 state 的所有 action 值(把這一行挑出來 pd.Series)if (np.random.uniform() > EPSILON) or (state_actions.all() == 0): # 非貪婪的10% , 或者這個 state 還沒有探索過action_name = np.random.choice(ACTIONS)#exploration 探索else:action_name = state_actions.idxmax() # 貪婪模式的90% # exploitation 利用return action_name5 設置狀態轉換和獎勵reward
????????做出行為后, 環境也要給我們的行為一個反饋, 反饋出下個 state (S_) 和 在上個 state (S) 做出 action (A) 所得到的 reward (R).
????????這里定義的規則就是, 只有?移動到了?T, 探寶者才會得到唯一的一個獎勵, 獎勵值 R=1, 其他情況都沒有獎勵.
def get_env_feedback(S, A):# This is how agent will interact with the environmentif A == 'right': # move rightif S == N_STATES - 2: #現在在位置4,再往右1格是5,也就是寶藏所在的位置S_ = 'terminal'R = 1else:S_ = S + 1R = 0else: # move leftR = 0if S == 0:S_ = S # 在最右側,碰壁了,所以不變狀態else:S_ = S - 1return S_, R6 環境更新可視化
def update_env(S, episode, step_counter):env_list = ['-']*(N_STATES-1) + ['T'] # 沒有探寶者的環境if S == 'terminal':interaction = 'Episode %s: total_steps = %s' % (episode+1, step_counter)print('\r{}'.format(interaction), end='')time.sleep(2)print('\r ', end='')#探寶者在終點else:env_list[S] = 'o'interaction = ''.join(env_list)print('\r{}'.format(interaction), end='')time.sleep(FRESH_TIME)#探寶者所在的位置替換為o7 Q-learning
使用的是TD:
?
?
def rl():q_table = build_q_table(N_STATES, ACTIONS) # 創建初始 q tablefor 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) # 選行為(ε-greedy)S_, R = get_env_feedback(S, A) # 實施行為并得到環境的反饋q_predict = q_table.loc[S, A] # 估算的(狀態-行為)值#Q(s,a)if S_ != 'terminal':q_target = R + GAMMA * q_table.iloc[S_, :].max() # 實際的(狀態-行為)值 (回合沒結束)# q_table.iloc[S_, :].max() ——> max Q(s',a') else:q_target = R # 實際的(狀態-行為)值 (回合結束)#沒有后續狀態了,所以也不用加那一項#當然get_env_feedback 當遇到terminal 的時候,直接返回'terminal' ,也算不出它的max Q(s',a') is_terminated = True # 此時已經到達terminal了#if-else的作用就是計算q-target,也就是TD更新里面 減號之前的部分q_table.loc[S, A] += ALPHA * (q_target - q_predict) # q_table 更新(TD)S = S_ # 探索者移動到下一個狀態update_env(S, episode, step_counter+1) # 環境更新'''如果在終點,那么輸出這一回合的一些信息如果非重點,那么輸出當前探寶者所在的狀態'''step_counter += 1#一致循環,直到拿到寶藏為止print(q_table)return q_table8 訓練
直接調用函數即可
q_table = rl() print(q_table)在上面的實現中,命令行一次只會出現一行狀態(這個是在update_env里面設置的('\r'+end=''))
??????python筆記 print+‘\r‘ (打印新內容時刪除打印的舊內容)_UQI-LIUWJ的博客-CSDN博客
如果不加這個限制,我們看一個episode:
然后我們綜合考量下每個episode之后的Q-table
| 1 | 38 | |
| 2 | 22 | |
| 3 | 9 | |
| 4 | 5 | |
| 5 | 7 | |
| 6 | 5 | |
| 7 | 5 | |
| 8 | 5 | |
| 9 | 5 | |
| 10 | 5 |
可以發現 left? 不會增長,但right的會一直增大?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的强化学习笔记:Q_learning (Q-table)示例举例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python笔记 print+‘\r‘
- 下一篇: 文巾解题 1816. 截断句子