我們有兩個骰子,乙個是常規的骰子(1-6各有1/6的概率出現,我們稱之為正常骰子),另乙個骰子是1~3,每個數字出現兩次(也就是說1、2、3各有1/3的概率出現,我們稱之為重複骰子)。我們需要選擇乙個骰子進行投擲。遊戲從1出發,每次投到的多大的數字就往前走多少步,但是每次碰到梯子就需要走到另一頭,直到走到100為止。如果超過100,則需要按照剩下的步數往回走。要求在最短的步數內到達終點。
下面基於env定義乙個snakeenv類,用於模擬上面的問題。類中重新定義了reset/step/reward/render方法。
import numpy as np
import gym
from gym.spaces import discrete
class
snakeenv
(gym.env)
: size=
100# 格仔數量
def__init__
(self, ladder_num, dices)
: self.ladder_num = ladder_num #梯子數量
self.dices = dices # 骰子數量
self.ladders =
dict
(np.random.randint(
1, self.size, \
size=
(self.ladder_num,2)
))# 生成梯子,格式類似
self.observation_space=discrete(self.size+1)
self.action_space=discrete(
len(dices)
) keys = self.ladders.keys(
)for k in
list
(keys)
:# 將梯子反過來存一遍
self.ladders[self.ladders[k]
]= k
print
('ladders info:'
)print
(self.ladders)
self.p = np.zeros(
[len
(dices)
, self.size+
1, self.size+1]
, dtype=np.
float
)# p
ladder_move = np.vectorize(
lambda x: self.ladders[x]
if x in self.ladders else x)
# 如果落入梯子區域,則前進到梯子的另一頭
# 下面是p的值
for i, dice in
enumerate
(self.dices)
: prob =
1.0/ dice
for src in
range(1
,100):
step = np.arange(dice)
step += src
step = np.piecewise(step,
[step >
100, step <=
100],[
lambda x:
200- x,
lambda x: x]
) step = ladder_move(step)
for dst in step:
self.p[i, src, dst]
+= prob
self.p[:,
100,
100]=1
self.pos =
1# 遊戲位置
defreset
(self)
: self.pos =
1# 將游位置重置為1
return self.pos
defstep
(self, a)
: step = np.random.randint(
1, self.dices[a]+1
)# 根據選擇的骰子進行投擲
self.pos += step
if self.pos ==
100:
return
100,
100,1,
# 到達位置100,終止遊戲
elif self.pos >
100:
self.pos =
200- self.pos # 超過100時要向回走
if self.pos in self.ladders:
self.pos = self.ladders[self.pos]
# 遇到梯子要前進到梯子的另一頭
return self.pos,-1
,0,def
reward
(self, s)
:# 到達位置100則獲得100獎勵,否則每次-1
if s ==
100:
return
100else
:return-1
defrender
(self)
:pass
# 不進行圖形渲染
執行下面的**進行測試:
env = snakeenv(10,
[3,6
])# 10個梯子,2個篩子最大值分別是3和6
env.reset(
)while
true
: state, reward, terminate, _ = env.step(1)
# 每次都選擇正常的骰子
print
(reward, state)
# 列印r和s
if terminate ==1:
break
我執行了一次的輸出如下。由於是投骰子,因此每次輸出的結果可能不一樣。
ladders info:
dice ranges:
[3, 6]
-1 24
-1 25
-1 31
-1 37
-1 38
-1 6
-1 11
-1 16
-1 21
-1 26
-1 37
-1 41
-1 46
-1 43
-1 45
-1 48
-1 85
-1 91
-1 92
-1 94
100 100
強化學習 蛇棋遊戲gym環境搭建
學習強化學習精要核心演算法與tensorflow實現這本書中,關於蛇棋遊戲利用gym搭建。遊戲的規則非常簡單,詳細請參考馮超的書 強化學習精要核心演算法與tensorflow實現 下面是遊戲的具體實現 import numpy as np import gym from gym.spaces imp...
強化學習例子
迷宮尋寶遊戲 我們這裡有乙個最簡單的2 2的迷宮,左上角為起點 1 右下角為寶藏 4 要提防的就是左下角的陷阱 3 作為高智商物種,我們一眼就可以看出來最優路徑就是1 2 4,而對於計算機則不然,他剛開始對這些沒有任何的概念,這些資訊都要它自己探索獲得,或者我們直接把環境資訊構建好告訴他。在上面這個...
強化學習系列 4 DQN
傳統的 形式的強化學習有這樣乙個瓶頸,使用 來儲存每乙個狀態state,和在這個 state 每個行為 action 所擁有的 q 值.如果全用 來儲存它們,計算機記憶體不夠,而且搜尋對應的狀態也是一件很耗時的事.比如下圍棋 所以,我們可以利用神經網路將狀態和動作當成神經網路的輸入,然後經過神經網路...