[強化學(xué)習(xí)-2] 機(jī)器人找金幣例子

目的

本文介紹一個簡單的案例。目標(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

全部代碼:https://github.com/WinddyAkoky/reinformence-learning/tree/master

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容