莫烦python学习笔记1
什么是Q Learning
Q Learning也是一個(gè)決策過程
小例子
用tabular Q-learning的方法實(shí)現(xiàn)一個(gè)小例子,例子的環(huán)境是一個(gè)一維世界,在世界的右邊有寶藏,探索者只要得到了寶藏嘗到了甜頭,然后以后就記住了得到寶藏的方法,這就是他用強(qiáng)化學(xué)習(xí)所學(xué)習(xí)到的行為。
-o---T # T 就是寶藏的位置, o 是探索者的位置Q-learing是一種記錄行為值(Q value)的方法,每種在一定狀態(tài)的行為都會(huì)有一個(gè)值Q(s,a),就是說行為a在s狀態(tài)的值是Q(s,a).s在上面的探索游戲中,就是o所咋的地點(diǎn)。而每個(gè)地點(diǎn)探索者都能做出兩個(gè)行為left/right,這就是探索者的所有可行的a
如果在某個(gè)地點(diǎn)s1,探索者計(jì)算了他能有的兩種行為,哪個(gè)行為的Q值大則選擇哪個(gè)行為。
預(yù)設(shè)值
import numpy as np import pandas as pd import timeN_STATES=6 #1維世界的寬度 ACTION=['left','right'] #探索者的的可用動(dòng)作 EPSILON=0.9 #貪婪度 greedy ALPHA=0.1 #學(xué)習(xí)率 GAMMA=0.9 #獎(jiǎng)勵(lì)遞減值 MAX_EPISODES=13 #最大回合數(shù) FRESH_TIME=0.3 #移動(dòng)間隔時(shí)間Q表
def build_q_table(n_states,actions):table=pd.DataFrame(np.zeros((n_states,len(actions))),columns=actions,) #columns對(duì)應(yīng)的是行為名稱return table定義動(dòng)作
接著是定義探索者是如何挑選行為的,引入epsilon greedy的概念。因?yàn)樵诔跏茧A段,隨機(jī)的探索環(huán)境,往往比固定的行為模式要好,所以這也是累計(jì)經(jīng)驗(yàn)的階段,我們希望探索者不會(huì)那么貪婪(greedy),所以EPSILON就是用來控制貪婪程度的值。EPSILON可以隨著探索時(shí)間不斷提升(越來越貪婪),不過這個(gè)例子中,我們就固定成EPSILON=0.9,90%的時(shí)間是選擇最優(yōu)策略,10%的時(shí)間用來探索。
#在某個(gè)state地點(diǎn),選擇行為 def choose_action(state,q_table):state_actions=q.table.iloc[state,:] #選出這個(gè)state的所有action值if (np.random.uniform() > EPSILON) or (state_actions.all() == 0): # 非貪婪 or 或者這個(gè) state 還沒有探索過action_name = np.random.choice(ACTIONS)else:action_name=state_actions.argmax()#貪婪度return action_name環(huán)境反饋
做出行為后,環(huán)境也要給我們的行為一個(gè)反饋,反饋出下個(gè)state,以及reward
def get_env_feedback(S, A):# This is how agent will interact with the environmentif A == 'right': # move rightif S == N_STATES - 2: # terminateS_ = 'terminal'R = 1else:S_ = S + 1R = 0else: # move leftR = 0if S == 0:S_ = S # reach the wallelse:S_ = S - 1return S_, R環(huán)境更新
def update_env(S, episode, step_counter):# This is how environment be updatedenv_list = ['-']*(N_STATES-1) + ['T'] # '---------T' our environmentif 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)強(qiáng)化學(xué)習(xí)主循環(huán)
def rl():q_table=build_q_table(N_STATES,ACTIONS) #初始 qtablefor episode in range(MAX_EPISODES):#回合step_counter=0S=0 #回合初始位置is_terminated=False #是否回合結(jié)束update_env(S,episode,step_counter) #環(huán)境更新while not is_terminated:A=choose_action(S,q_table) #選擇行為S_,R=get_env_feeback(S,A) #實(shí)施行為并得到環(huán)境的反饋q_predict=q_table.loc[S,A] #估算得到的(狀態(tài)-行為)值if S_!='terminal':q_target = R + GAMMA * q_table.iloc[S_, :].max() # 實(shí)際的(狀態(tài)-行為)值 (回合沒結(jié)束)else:q_target=R #實(shí)際的(狀態(tài)-行為值)回合結(jié)束is_terminated=Trueq_table.loc[S,A]+=ALPHA*(q_target-q_predict) #q_table更新S=S_ #探索者移動(dòng)到下一個(gè)stateupdata_env(S,episode,step_counter+1) #環(huán)境更新step_counter+=1return q_table總結(jié)
以上是生活随笔為你收集整理的莫烦python学习笔记1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: static关键字 void和void指
- 下一篇: python植物大战僵尸代码写完了怎么运