探索者學會走迷宮. 黃色的是天堂 (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
('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 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...