分類目錄——強化學習
自定義環境
自定義環境最好繼承自gym.env,這樣可以復用父類中的一些內容
直接上程式,在程式中進行說明
import gym
from gym import spaces
from gym.envs.classic_control import rendering
import time
class
envline
(gym.env)
: metadata =
# 將會初始化動作空間與狀態空間,便於強化學習演算法在給定的狀態空間中搜尋合適的動作
# 環境中會用的全域性變數可以宣告為類(self.)的變數
def__init__
(self)
: self.action_space = spaces.discrete(3)
# 動作空間,0, 1, 2: 不動,左右
self.observation_space = spaces.discrete(5)
# 0,1,2,3,4:狀態空間
self.n_actions = self.action_space.n # 動作個數
self.state =
none
# 當前狀態
self.target =
4# 安全/目標狀態
self.viewer = rendering.viewer(
520,
200)
# 初始化一張畫布
defstep
(self, action)
:# 接收乙個動作,執行這個動作
# 用來處理狀態的轉換邏輯
# 返回動作的回報、下一時刻的狀態、以及是否結束當前episode及除錯資訊
assert self.action_space.contains(action)
,"%r (%s) invalid"
%(action,
type
(action)
) x = self.state
if action ==0:
# 不動
x = x
elif action ==1:
# 左 x = x -
1elif action ==2:
# 右 x = x +
1# 在這裡做一下限定,如果下乙個動作導致智慧型體越過了環境邊界(即不在狀態空間中),則無視這個動作
next_state = x
self.state = next_state if self.observation_space.contains(next_state)
else self.state
self.counts +=
1# 如果到達了終點,給予乙個回報
# 在複雜環境中多種狀態的反饋配比很重要
if self.state == self.target:
reward =
30 done =
true
else
:# 如果是普通的一步,給予乙個小懲罰,目的是為了減少起點到終點的總路程長度
reward =-1
done =
false
return self.state, reward, done
# 用於在每輪開始之前重置智慧型體的狀態,把環境恢復到最開始
# 在訓練的時候,可以不指定startstate,隨機選擇初始狀態,以便能盡可能全的採集到的環境中所有狀態的資料反饋
defreset
(self, startstate=
none):
if startstate==
none
: self.state = self.observation_space.sample(
)else
:# 在訓練完成測試的時候,可以根據需要指定從某個狀態開始
if self.observation_space.contains(startstate)
: self.state = startstate
else
: self.state = self.observation_space.sample(
) self.counts =
0return self.state
# render()繪製視覺化環境的部分都寫在這裡
defrender
(self, mode=
'human'):
# 布置狀態
for i in
range
(self.observation_space.n)
: self.viewer.draw_line((20
,30),
(100,30
), color=(0
,0,0
)).add_attr(rendering.transform(
(100
* i,0)
))# 目標位置
self.viewer.draw_line((20
,30),
(100,30
),color=(0
,1,0
),).add_attr(rendering.transform(
(100*4
,0))
)# 繪製當前位置
self.viewer.draw_polygon([(
60,30)
,(80,
100),(
40,100)
], color=(0
,1,0
)).add_attr(rendering.transform(
(100
* self.state,0)
))self.viewer.draw_circle(20,
20,true
, color=(0
,1,0
)).add_attr(rendering.transform((60
+100
* self.state,
120)))
return self.viewer.render(return_rgb_array=mode ==
'human'
)def
close
(self)
:if self.viewer:
self.viewer.close(
)
測試
if __name__ ==
'__main__'
: env = envline(
)for epoch in
range(5
):env.reset(
)print
('epoch'
, epoch+1,
': '
,end='')
print
(env.state, end='')
env.render(
)# 重新整理畫面
time.sleep(
0.5)
for i in
range(5
):env.step(env.action_space.sample())
# 隨機選擇乙個動作執行
print
(' -> '
, env.state, end='')
env.render(
)# 重新整理畫面
time.sleep(
0.5)
print()
env.close(
)
顯示效果如文首所示
全部**
按順序複製即可執行
相關文獻
分類目錄——強化學習(更新中)什麼是gym
gym自定義視覺化環境繪製
gym自定義視覺化環境例項
強化學習呼叫gym環境例項
從q_learning看強化學習
乙個q_learning強化學習自定義gym環境視覺化例項
強化學習 實驗 Gym環境
本節內容參考 白話強化學習 gym是openai團隊提供的乙個簡單的開源專案,可以快速地實現乙個完整的 s a r a s rightarrow a rightarrow r rightarrow a s a r a 首先我們給python環境中安裝gym包 pip install gym下面給出一...
強化學習實戰 自定義Gym環境之顯示字串
如果想用強化學習去實現掃雷 2048這種帶有數字提示資訊的遊戲,自然是希望自定義 gym 環境時能把字元顯示出來。上網查了很久,沒有找到gym自帶的圖形工具viewer可以顯示字串的資訊,反而是通過pyglet import pyglet from gym.envs.classic control ...
強化學習 蛇棋遊戲gym環境搭建
學習強化學習精要核心演算法與tensorflow實現這本書中,關於蛇棋遊戲利用gym搭建。遊戲的規則非常簡單,詳細請參考馮超的書 強化學習精要核心演算法與tensorflow實現 下面是遊戲的具體實現 import numpy as np import gym from gym.spaces imp...