日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

强化学习实践四:编写通用的格子世界环境类

發(fā)布時(shí)間:2024/3/13 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 强化学习实践四:编写通用的格子世界环境类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

gym里內(nèi)置了許多好玩經(jīng)典的環(huán)境用于訓(xùn)練一個(gè)更加智能的個(gè)體,不過這些環(huán)境類絕大多數(shù)不能用來(lái)實(shí)踐前五講的視頻內(nèi)容,主要是由于這些環(huán)境類的觀測(cè)空間的某個(gè)維度是連續(xù)變量而不是離散變量,這是前五講內(nèi)容還未涉及到的知識(shí)。為了配合解釋David Silver視頻公開課提到的一些示例,我參考了gym的思想設(shè)計(jì)了一個(gè)通用的格子世界環(huán)境類,該環(huán)境類的觀測(cè)空間是一維離散變量,可以很好地模擬其公開課中提到的:簡(jiǎn)單格子、有風(fēng)格子、隨機(jī)行走、懸崖行走、隨機(jī)策略(骷髏和錢袋子)等問題。在此基礎(chǔ)上理解、實(shí)踐強(qiáng)化學(xué)習(xí)的基礎(chǔ)算法就相對(duì)簡(jiǎn)單而且直觀了。

先貼上格子世界環(huán)境類的源文件:gridworld.py,只把該文件下載到您自己的文件夾內(nèi),導(dǎo)入其中的類或方法就可以了。已經(jīng)內(nèi)置的一些環(huán)境類UI界面類似下面這些:

?

一些內(nèi)置的格子世界環(huán)境

簡(jiǎn)單或有風(fēng)10*7格子世界

懸崖行走示例

隨機(jī)行走示例

模仿Gridworld with Dynamic Programming?的一個(gè)格子世界

用戶可以自定義格子的大小、水平和垂直格子數(shù)目、內(nèi)部障礙分布、以及每一個(gè)格子的即時(shí)獎(jiǎng)勵(lì)值。在通用的格子世界環(huán)境類的UI界面中,我使用不同的顏色設(shè)置表示不同的意義,其中:

  • 帶有藍(lán)色邊框的格子 表示起始狀態(tài);
  • 帶有金黃色邊框的格子 表示終止?fàn)顟B(tài),終止?fàn)顟B(tài)可以不止一個(gè);
  • 黑色的格子表示障礙格子,個(gè)體一般不能進(jìn)入;
  • 其他不同顏色的格子表示格子的即時(shí)獎(jiǎng)勵(lì)值不同,獎(jiǎng)勵(lì)值為0的格子顏色為灰色,獎(jiǎng)勵(lì)值為負(fù)值顏色顯示偏向與紅色,值越小,紅色越深;獎(jiǎng)勵(lì)值大于0的格子偏向于顯示綠色,值越大,綠色越飽滿;
  • 個(gè)體使用黃色圓形來(lái)表示。

?

如何使用通用的格子世界類來(lái)定制自己想要的格子環(huán)境:

通用的格子世界環(huán)境類接受如下參數(shù):

def __init__(self, n_width:int=10,n_height:int = 7,u_size = 40,default_reward:float = 0,default_type = 0)

分別是水平方向上格子數(shù)量,豎直方向上格子數(shù)量,每一個(gè)單位格子的繪制邊長(zhǎng)(單位為像素值),默認(rèn)每一個(gè)格子的即時(shí)獎(jiǎng)勵(lì)值以及默認(rèn)格子的類型。定義格子類型值為0時(shí)為個(gè)體可進(jìn)入格子,類型為1表示為障礙,個(gè)體不能進(jìn)入。有興趣可以修改代碼支持更多的類型。

下面以一個(gè)懸崖行走格子世界環(huán)境為例,講解如何使用通用的格子世界環(huán)境類來(lái)得到自己想要的格子世界環(huán)境對(duì)象。懸崖行走的例子出現(xiàn)在David Silver強(qiáng)化學(xué)習(xí)公開課的?第五講?,環(huán)境如下:

  • 首先,明確格子世界環(huán)境的布局:長(zhǎng)寬格子數(shù)、內(nèi)部的障礙、即時(shí)獎(jiǎng)勵(lì)、起始狀態(tài)、終止?fàn)顟B(tài)等信息。對(duì)于懸崖行走示例來(lái)說(shuō),世界長(zhǎng)?12、寬?4,起始位置在左下角,坐標(biāo)為(0,0),終止?fàn)顟B(tài)在右下角,坐標(biāo)為(11,0)。
  • 使用對(duì)應(yīng)的參數(shù)建立一個(gè)格子世界環(huán)境類對(duì)象:
# 導(dǎo)入GridWorldEnv前確保當(dāng)前代碼文件與gridworld.py文件同在一個(gè)包內(nèi) from gridworld import GridWorldEnv env = GridWorldEnv(n_width=12, # 水平方向格子數(shù)量n_height = 4, # 垂直方向格子數(shù)量u_size = 60, # 可以根據(jù)喜好調(diào)整大小default_reward = -1, # 默認(rèn)格子的即時(shí)獎(jiǎng)勵(lì)值default_type = 0) # 默認(rèn)的格子都是可以進(jìn)入的 from gym import spaces # 導(dǎo)入spaces env.action_space = spaces.Discrete(4) # 設(shè)置行為空間支持的行為數(shù)量 # 格子世界環(huán)境類默認(rèn)使用0表示左,1:右,2:上,3:下,4,5,6,7為斜向行走 # 具體可參考_step內(nèi)的定義 # 格子世界的觀測(cè)空間不需要額外設(shè)置,會(huì)自動(dòng)根據(jù)傳入的格子數(shù)量計(jì)算得到
  • 設(shè)置起始和終止?fàn)顟B(tài),起始狀態(tài)用元組描述,終止?fàn)顟B(tài)用列表描述:
env.start = (0,0) env.ends = [(11,0)]
  • 對(duì)一些特殊格子的類型和即時(shí)獎(jiǎng)勵(lì)值進(jìn)行修改,這里要把組成懸崖的格子的即時(shí)獎(jiǎng)勵(lì)設(shè)為-100,這個(gè)例子中沒有不可進(jìn)入的格子,所以不需要對(duì)格子類型進(jìn)行修改。示例中懸崖格子是終止?fàn)顟B(tài),因此有:
for i in range(10):env.rewards.append((i+1,0,-100))env.ends.append((i+1,0))
  • 特殊類型的格子設(shè)置類似于即時(shí)獎(jiǎng)勵(lì)設(shè)置,比如我們將坐標(biāo)為(5,1)和(5,2)的兩個(gè)格子設(shè)為不可進(jìn)入,可以添加如下代碼:
env.types = [(5,1,1),(5,2,1)]
  • 最后為了使這些設(shè)置在實(shí)際生效,調(diào)用刷新設(shè)置方法:
env.refresh_setting()

至此,我們自定義的格子世界環(huán)境就設(shè)置好了,調(diào)用其render()方法查看一下吧:

env.render() input("press any key to continue...")

效果如下:

兩塊障礙已經(jīng)順利生成了,可是發(fā)現(xiàn)個(gè)體的位置不在起始位置,為此我們需要重置下個(gè)體的位置,只需要調(diào)用env的reset()方法就可以了:

env.reset()

再看效果符合預(yù)期:

生成這個(gè)環(huán)境完整的代碼如下:

from gridworld import GridWorldEnv from gym import spacesenv = GridWorldEnv(n_width=12, # 水平方向格子數(shù)量n_height = 4, # 垂直方向格子數(shù)量u_size = 60, # 可以根據(jù)喜好調(diào)整大小default_reward = -1, # 默認(rèn)格子的即時(shí)獎(jiǎng)勵(lì)值default_type = 0) # 默認(rèn)的格子都是可以進(jìn)入的 env.action_space = spaces.Discrete(4) # 設(shè)置行為空間數(shù)量 # 格子世界環(huán)境類默認(rèn)使用0表示左,1:右,2:上,3:下,4,5,6,7為斜向行走 # 具體可參考_step內(nèi)的定義 # 格子世界的觀測(cè)空間不需要額外設(shè)置,會(huì)自動(dòng)根據(jù)傳輸?shù)母褡訑?shù)量計(jì)算得到 env.start = (0,0) env.ends = [(11,0)] for i in range(10):env.rewards.append((i+1,0,-100))env.ends.append((i+1,0)) env.types = [(5,1,1),(5,2,1)] env.refresh_setting() env.reset() env.render() input("press any key to continue...")

有了格子世界通用環(huán)境類,我們就可以比較方便定制自己的格子世界環(huán)境。為了方便使用,我也寫好了幾個(gè)內(nèi)置的格子世界環(huán)境,大家只要調(diào)用相應(yīng)的方法就可以得到它:

env = LargeGridWorld() # 10*10的大格子 env = SimpleGridWorld() # 10*7簡(jiǎn)單無(wú)風(fēng)格子 env = WindyGridWorld() # 10*7有風(fēng)格子 env = RandomWalk() # 隨機(jī)行走 env = CliffWalk() # 懸崖行走 env = SkullAndTreasure() # 骷髏和錢袋子示例

如果您希望讓您的個(gè)體支持斜向行走,請(qǐng)將相應(yīng)的行為空間參數(shù)設(shè)為8,同時(shí)請(qǐng)留意環(huán)境類的_step方法關(guān)于斜向行走狀態(tài)的改變是否如您所愿的那樣設(shè)置,您可以在此基礎(chǔ)上定制自己的行為規(guī)則。

要使用格子世界環(huán)境類提供的功能,您必須已經(jīng)實(shí)現(xiàn)安裝了gym庫(kù)以及其依賴庫(kù)。關(guān)于如何安裝gym庫(kù)、如何向gym注冊(cè)自定義的環(huán)境類可以參考相關(guān)教程。通過gym庫(kù)提供的相關(guān)功能,你還可以把個(gè)體經(jīng)歷Episode的過程錄制成視頻。

下次實(shí)踐編寫與個(gè)體相關(guān)的代碼來(lái)鞏固我們對(duì)強(qiáng)化學(xué)習(xí)相關(guān)基礎(chǔ)算法的理解。

?

本文轉(zhuǎn)自:https://zhuanlan.zhihu.com/p/28109312

?

?

總結(jié)

以上是生活随笔為你收集整理的强化学习实践四:编写通用的格子世界环境类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。