
上文已經描述了怎麼建立和注冊一個自定義的gym環境。但是環境類中的4個函數都是空的,本文将描述怎麼實作那4個函數,實作一個完整的井字棋遊戲的環境。
遊戲規則:兩個玩家在3x3的棋盤上,一方執X,一方執O。哪方先下的連續3個子(不管在對角,豎直還是水準方向)為勝。(類似五子棋)。赢得一方将會獲得+100的獎勵。
完整的環境代碼通路GitHub。
其中,step函數已經指定了雙方下棋的規則,也就是說這個程式不是依靠某個強化學習算法來下棋,而是靠固定規則。因為本系列文章的目的就是要說明如何自定義環境,而不是應用強化學習算法。
def step(self,target):
if self.done==1:
print('game over')
return [self.state,self.reward,self.done,self.add]
elif self.state[int(target/3)][target%3] != '-':
print('invalid step')
return [self.state,self.reward,self.done,self.add]
else:
if(self.counter%2==0):
self.state[int(target/3)][target%3]='o'
else:
self.state[int(target/3)][target%3]='x'
self.counter+=1
if(self.counter==9):
self.done=1
self.render()
win=self.check()
if(win):
self.done=1
print('Player ', win, 'wins. ', sep='',end='\n')
self.add[win-1]=1
if win==1:
self.reward=100
else:
self.reward=-100
return [self.state,self.reward,self.done,self.add]
環境的代碼已經寫好了,下面我們安裝并且注冊環境。
pip install -e .
我們編寫下面的代碼來測試環境。
import gym
import gym_tictac
env = gym.make('tictac-v0')
for e in range(3):
env.reset()
print("######")
print("EPISODE: ", e)
print("######")
for t in range(9):
env.render()
action = t
state, reward, done, info = env.step(action)
print("reward: ", reward)
print("")
env.close()
如果輸出是這樣
######
EPISODE: 0
######
- - -
- - -
- - -
o - -
- - -
- - -
reward: 0
o - -
- - -
- - -
o x -
- - -
- - -
reward: 0
o x -
- - -
- - -
o x o
- - -
- - -
reward: 0
o x o
- - -
- - -
o x o
x - -
- - -
reward: 0
o x o
x - -
- - -
o x o
x o -
- - -
reward: 0
o x o
x o -
- - -
o x o
x o x
- - -
reward: 0
o x o
x o x
- - -
o x o
x o x
o - -
Player 1wins.
reward: 100
意味着環境已經正确編寫并配置。
這個環境已經足夠簡單了,action是固定規則,我們隻是為了闡述自定義gym環境的配置。
下文會講述gym環境如何結合PyBullet。