Python實現的Q Learning入門Demo

2022-04-03 08:48:10 字數 3234 閱讀 6337

首先明確學習的概念,學習是系統為了適應環境而做出的長久的變化,以便在未來更有效率的處理類似的問題

強化學習就是通過演算法和訓練,讓程式的產生相應的變化,未來更好地處理類似問題。

學習系統本身(即學習程式)

環境(即學習程式要解決的問題所處的環境)

系統判定當前狀態,根據策略採取行動

系統獲得環境的反饋

系統根據反饋,更新策略

重複上述步驟,直到問題解決

強化學習是一種無監督學習

在狀態s下,不同的行動a會有不同的反饋r

反饋r的獲得,通常是有延時的

當前行動a,會對系統後續的行為產生影響

q-learning就是其中一種簡單的系統實現,通過q-table的不斷更新,來產生長久的變化。

在強化學習中,通常用q(s, a)來表示狀態s下,採取動作a所帶來的價值,所以這個演算法就用q-learning作了它的名字。

關鍵點:狀態、策略、行動、反饋

q(s,a)←q(s,a)+α[r+γmaxa′​q(s′,a′)−q(s,a)]

引數說明:

α是學習速率,在[0,1]區間取值,表示反饋對當前策略的影響程度。0表示完全不考慮反饋,1表示只看反饋,不看歷史經驗。

r表示r(s, a),通過「反饋表」或者「反饋演算法」獲得的反饋值

maxa′​q(s′,a′) 解釋:s是狀態s時採取行動a之後到達的狀態;maxa′​q(s′,a′) 表示在s′狀態時,能獲得的最大q值,即歷史經驗,或者說是記憶中的利益

γ表示折扣因子,代表歷史經驗中未來利益的重要性,如果為0,表示只看眼前利益r

初始化q-table

定義reward獲取方法

制定策略,即在狀態s下,如何通過q-table選取行動a

初始化狀態s,可以固定,也可以隨機

根據當前狀態s,採取行動a,並獲得反饋r

使用更新公式,對q-table進行更新

重複步驟5,6,直到命中退出條件(比如成功、失敗、走出了迷宮、到達了目的地等等)

重複4-7流程n次,n代表訓練的回合數

"-----t"

比如上面的乙個字串,機械人從任意一點進入字串,可以向左或者向右走一步,最終的目標是走到字母t的位置。

我們的code進行20次訓練,得到更新後q-table,這時機械人再進入字串,就能以最效率的方式,走到字母t

import

numpy as np

#by jarek.tan

alpha = 0.1gamma = 0.9epsilon = 0.9epoch = 20n_state = 6actions = ["

left

", "

right"]

np.random.seed(2)

q_table =np.zeros((n_state, len(actions)))

defget_reward(s, a):

if s == 5:

r = 1

elif s == 4 and a == '

right

': #

s!=5

r = 1

else

: r =0

return

rdef

take_action(s):

if s ==0:

return 1, '

right

', np.max(q_table[1, :])

maxq =np.max(q_table[s, :])

if maxq == 0 or np.random.uniform() >epsilon:

if maxq ==0:

print("

maxq is 0")

else

:

print("

random 0.1 hit")

action =np.random.choice(actions)

else

: idx =np.argmax(q_table[s, :])

print("

idx:

", idx)

action =actions[idx]

if action == '

left':

sn = s - 1

else

: sn = s + 1maxq =np.max(q_table[sn, :])

return

sn, action, maxq

defget_value(s, a):

if a == '

left':

return

q_table[s, 0]

else

:

return q_table[s, 1]

defset_value(s, a, v):

if a == '

left':

q_table[s, 0] =v

else

: q_table[s, 1] =v

defupdate_q(s, a, mq):

value = (1 - alpha) * get_value(s, a) + alpha * (get_reward(s, a) + gamma *mq)

set_value(s, a, value)

for loop in

range(epoch):

print("

loop:

", loop)

s =0

step =0

steps =

while s != 5:

sn, action, maxq =take_action(s)

update_q(s, action, maxq)

s =sn

print("

state:

", s, "

totalsteps:

", step, "

\ndetail:

", steps)

print("

q_table:

", q_table)

的python實現 python實現檔案自動歸類

這幾天和幾個小夥伴,在一起做乙個ppt。那我想,可不可以做乙個指令碼實現檔案按照副檔名自動分類呢?這樣,就可以相對輕鬆的找到檔案了。效果展示 使用方法很簡單,只要把python指令碼檔案,放到待處理的資料夾目錄下,執行python檔案即可。這個指令碼實現比較簡單,我把涉及的知識點列了出來。1 相對路...

用python實現棧 Python實現棧的方法

usr bin env python 定義乙個列表來模擬棧 stack def pu 出棧,用到了pop 函式 def popit if len stack 0 print cannot pop from an empty stack else print removed stack.pop 編歷棧...

pypy 用python實現的python

pypy 分為兩部分 乙個 python 的實現 和 乙個編譯器 pypy provides infrastructure for building interpreters in r python.this infrastructure makes it much easier than star...