強化學習 蛇棋遊戲gym環境搭建

2021-09-27 18:17:47 字數 3048 閱讀 3208

學習強化學習精要核心演算法與tensorflow實現這本書中,關於蛇棋遊戲利用gym搭建。遊戲的規則非常簡單,詳細請參考馮超的書《強化學習精要核心演算法與tensorflow實現》。

下面是遊戲的具體實現:

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)

# 創造len(dices)個矩陣矩陣維度是100*100

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):

# print(i,dice)

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 # 遊戲位置

def reset(self):

self.pos = 1 # 將游位置重置為1

return self.pos

def step(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 100

else:

return -1

def render(self):

pass # 不進行圖形渲染

**中建構函式需要傳入兩個引數:梯子數量和不同投擲骰子方法的最大值。用乙個dict儲存梯子相連的兩個格仔的關係,用乙個list儲存可能的骰子可投擲的最大值;reset方法將pos設定為1,也就是遊戲開始的位置;step完成一次投擲,引數a表示玩家將採用何種方法。完成位置的更新後,函式將返回玩家的新位置、得分和其他資訊。

利用這個環境進行遊戲,設定遊戲中共有10個梯子,兩種投擲骰子的方法分別可以投擲[1,3]和[1,6]的整數值,玩家將完全使用第一種策略斤進行遊戲,**如下:

from snake import snakeenv

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:-1

5-17

-111-

114-1

18...

....

.(以下省略若干中間結果)-1

99-199

-197-

198100100

強化學習 實驗 Gym環境

本節內容參考 白話強化學習 gym是openai團隊提供的乙個簡單的開源專案,可以快速地實現乙個完整的 s a r a s rightarrow a rightarrow r rightarrow a s a r a 首先我們給python環境中安裝gym包 pip install gym下面給出一...

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

我們有兩個骰子,乙個是常規的骰子 1 6各有1 6的概率出現,我們稱之為正常骰子 另乙個骰子是1 3,每個數字出現兩次 也就是說1 2 3各有1 3的概率出現,我們稱之為重複骰子 我們需要選擇乙個骰子進行投擲。遊戲從1出發,每次投到的多大的數字就往前走多少步,但是每次碰到梯子就需要走到另一頭,直到走...

強化學習 gym環境的解讀及使用

分類目錄 強化學習 環境中的方法 環境中一般都會有上面說到的父類中的方法,其中 這裡把關鍵部分放在這,更多的參見 本文全部 訓練 for i episode in range 2000 observation env.reset ep r 0while true env.render 不進行視覺化可...