目的
本文介紹一個簡單的案例。目標(biāo)如下:

image.png
我們的機(jī)器人在上面的地圖上行走,目的是要找到寶藏,如果進(jìn)入骷髏頭,游戲就失敗。
定義狀態(tài)空間
我們對地圖上的小方格進(jìn)行編號: 1 - 8

image.png
代碼簡單表示如下:
self.states = [1,2,3,4,5,6,7,8] #狀態(tài)空間
同時定義終止?fàn)顟B(tài):
self.terminate_states = dict() #終止?fàn)顟B(tài)為字典格式
self.terminate_states[6] = 1
self.terminate_states[7] = 1
self.terminate_states[8] = 1
定義動作空間
動作空間很簡單:上,下,左,右
self.actions = ['n','e','s','w']
定義回報函數(shù)
self.rewards = dict(); #回報的數(shù)據(jù)結(jié)構(gòu)為字典
self.rewards['1_s'] = -1.0
self.rewards['3_s'] = 1.0
self.rewards['5_s'] = -1.0
構(gòu)造我們的環(huán)境,目的如下:

(如果不知道怎么用 gym 畫圖,請?zhí)D(zhuǎn):http://www.itdecent.cn/p/b3c4d2b95c58)
代碼如下:
def render(self, mode='human', close=False):
# 創(chuàng)建地圖
lines = []
line1 = rendering.Line((0, 0), (0, 200))
lines.append(line1)
line2 = rendering.Line((120, 0), (120, 200))
lines.append(line2)
line3 = rendering.Line((0, 200), (600, 200))
lines.append(line3)
line4 = rendering.Line((0, 100), (600, 100))
lines.append(line4)
line5 = rendering.Line((240, 0), (240, 200))
lines.append(line5)
line6 = rendering.Line((360, 0), (360, 200))
lines.append(line6)
line7 = rendering.Line((480, 0), (480, 200))
lines.append(line7)
line8 = rendering.Line((600, 0), (600, 200))
lines.append(line8)
line9 = rendering.Line((0, 0), (120, 0))
lines.append(line9)
line10 = rendering.Line((240, 0), (360, 0))
lines.append(line10)
line11 = rendering.Line((480, 0), (600, 0))
lines.append(line11)
# 創(chuàng)建骷髏
kulos = []
kulo1 = rendering.make_circle(40)
kulo1_transiform = rendering.Transform(translation=(60, 50))
kulo1.add_attr(kulo1_transiform)
kulo1.set_color(0, 0, 0)
kulos.append(kulo1)
kulo2 = rendering.make_circle(40)
kulo2_transiform = rendering.Transform(translation=(540, 50))
kulo2.add_attr(kulo2_transiform)
kulo2.set_color(0, 0, 0)
kulos.append(kulo2)
# 創(chuàng)建寶藏
golds = []
gold = rendering.make_circle(40)
circletrans = rendering.Transform(translation=(300, 50))
gold.add_attr(circletrans)
gold.set_color(1, 0.9, 0)
golds.append(gold)
# 創(chuàng)建機(jī)器人
robots = []
robot = rendering.make_circle(40)
robot.set_color(0.8, 0.6, 0.4)
robot_transilation = rendering.Transform(translation=(420, 150))
robot.add_attr(robot_transilation)
robots.append(robot)
transiform = rendering.Transform(translation=(50, 50))
for line_ in lines:
line_.set_color(0, 0, 0)
line_.add_attr(transiform)
self.viewer.add_geom(line_)
for kulo_ in kulos:
kulo_.add_attr(transiform)
self.viewer.add_geom(kulo_)
for gold_ in golds:
gold_.add_attr(transiform)
self.viewer.add_geom(gold_)
for robot_ in robots:
robot_.add_attr(transiform)
self.viewer.add_geom(robot_)
return self.viewer.render(return_rgb_array=mode == 'rgb_array')
結(jié)果
本例子用的算法是DQN, 讀者可以先不管DQN是什么

test.gif