學習強化學習精要核心演算法與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 不進行視覺化可...