Q learning例項二維

2021-10-03 14:40:35 字數 4117 閱讀 2279

探索者學會走迷宮. 黃色的是天堂 (reward 1),

黑色的地獄 (reward -1).

整個演算法就是一直不斷更新 q table 裡的值, 然後再根據新的值來判斷要在某個 state 採取怎樣的 action.

qlearning 是乙個 off-policy 的演算法, 因為裡面的 max action 讓 q table 的更新可以不基於正在經歷的經驗(可以是現在學習著很久以前的經驗,甚至是學習他人的經驗).

不過這一次的例子, 我們沒有運用到 off-policy, 而是把 qlearning 用在了 on-policy 上, 也就是現學現賣, 將現在經歷的直接當場學習並運用.

三個py檔案。 maze_env 環境模組(python 自帶的簡單 gui 模組 tkinter 來編寫虛擬環境.教程),rl_brain如何決策,run_this# 如何提公升迴圈

# 如何提公升迴圈

from maze_eny import maze

from rl_brain import qlearningtable

defupdate()

:for episode in

range

(100):

#100個回合

observation = env.reset(

)#環境給出的觀測值(紅點座標(1,1),(1,2)。。)

while

true

:#,每個episode回合裡

env.render(

)#環境重新重新整理(要跟環境互動就要進行重新整理)

action = rl.choose_action(

str(observation)

)#基於觀測值挑選動作 用str方式放在table中可以當做索引

observation_, reward, done = env.step(action)

#在env中施加動作返回下乙個狀態 done代表跳到黑的部分回

# 合結束跳出while迴圈進入下個episode

rl.learn(

str(observation)

, action, reward,

str(observation_)

)#從(第乙個observation,第乙個observation

#施加的動作,施加動作得到的reward和跳到下乙個狀態)進行強化學習

observation = observation_

# break while loop when end of this episode

if done:

break

# end of game

print

('game over'

) env.destroy(

)if __name__ ==

"__main__"

: env = maze(

) rl = qlearningtable(actions=

list

(range

(env.n_actions)))

env.after(

100, update)

env.mainloop(

)

**主結構

class

qlearningtable

:# 初始化

def__init__

(self, actions, learning_rate=

0.01

, reward_decay=

0.9, e_greedy=

0.9)

:# 選行為

defchoose_action

(self, observation)

:# 更新q錶值

deflearn

(self, s, a, r, s_)

:# 檢測 state 是否存在

defcheck_state_exist

(self, state)

:

# qlearning如何決策

import numpy as np

import pandas as pd

class

qlearningtable

:def

__init__

(self, actions, learning_rate=

0.01

, reward_decay=

0.9, e_greedy=

0.9)

: self.actions = actions # a list

self.lr = learning_rate

self.gamma = reward_decay

self.epsilon = e_greedy

self.q_table = pd.dataframe(columns=self.actions, dtype=np.float64)

#縱軸是有多少個state橫軸標籤是可用action

#初始化qtable是乙個空的dataframe

defchoose_action

(self, observation)

: self.check_state_exist(observation)

#檢驗傳入的observation中有沒有在qtable中

if np.random.uniform(

)< self.epsilon:

# 根據最優選action

state_action = self.q_table.loc[observation,:]

action = np.random.choice(state_action[state_action == np.

max(state_action)

].index)

#打亂action的位置

#因為選最優相同時永遠選第乙個位置上的

else

:# 隨機選擇action

action = np.random.choice(self.actions)

return action

deflearn

(self, s, a, r, s_)

: self.check_state_exist(s_)

#多了s_檢驗是否在qtable當中

q_predict = self.q_table.loc[s, a]

if s_ !=

'terminal'

: q_target = r + self.gamma * self.q_table.loc[s_,:]

.max()

# next state is not terminal

else

: q_target = r # next state is terminal

self.q_table.loc[s, a]

+= self.lr *

(q_target - q_predict)

# 要修改的值

defcheck_state_exist

(self, state)

:#檢驗下乙個經歷的state是不是之前已經經過的或者是從沒經歷過的state

#如果從來沒有經歷過state放到table中去

if state not

in self.q_table.index:

#若不存在加入

pd.series([0

]*len(self.actions)

,#state在任何時候都是全0的

index=self.q_table.columns,

name=state,

))

Python中的二維列表(例項)

1.使用輸入值初始化列表 nums rows eval input 請輸入行數 columns eval input 請輸入列數 forrow inrange rows nums.forcolumn inrange columns num eval input 請輸入數字 nums row num ...

VBA 二維陣列氣泡排序例項

學習vba的同學經常會用到陣列的排序,網上介紹的程式演算法一般都是舉例一維陣列,增加了公升降序選擇,排序列號選擇,以及標題行數等實際需要使用的引數 private sub test dim arr sheets sheet1 select row sheets sheet1 usedrange.ro...

二維陣列與二維指標

1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...