強化學習系列4 蛇棋的例子

2021-09-05 11:35:34 字數 3450 閱讀 5581

我們有兩個骰子,乙個是常規的骰子(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 值.如果全用 來儲存它們,計算機記憶體不夠,而且搜尋對應的狀態也是一件很耗時的事.比如下圍棋 所以,我們可以利用神經網路將狀態和動作當成神經網路的輸入,然後經過神經網路...