强化学习实践三 :编写通用的格子世界环境类
gym里內置了許多好玩經典的環境用于訓練一個更加智能的個體,不過這些環境類絕大多數不能用來實踐前五講的視頻內容,主要是由于這些環境類的觀測空間的某個維度是連續變量而不是離散變量,這是前五講內容還未涉及到的知識。為了配合解釋David Silver視頻公開課提到的一些示例,參考了gym的思想設計了一個通用的格子世界環境類,該環境類的觀測空間是一維離散變量,可以很好地模擬其公開課中提到的:簡單格子、有風格子、隨機行走、懸崖行走、隨機策略(骷髏和錢袋子)等問題。在此基礎上理解、實踐強化學習的基礎算法就相對簡單而且直觀了。
先貼上格子世界環境類的源文件:gridworld.py,只把該文件下載到您自己的文件夾內,導入其中的類或方法就可以了。已經內置的一些環境類UI界面類似下面這些:
一些內置的格子世界環境
簡單或有風10*7格子世界
懸崖行走示例
隨機行走示例
模仿Gridworld with Dynamic Programming?的一個格子世界
用戶可以自定義格子的大小、水平和垂直格子數目、內部障礙分布、以及每一個格子的即時獎勵值。在通用的格子世界環境類的UI界面中,我使用不同的顏色設置表示不同的意義,其中:
- 帶有藍色邊框的格子 表示起始狀態;
- 帶有金黃色邊框的格子 表示終止狀態,終止狀態可以不止一個;
- 黑色的格子表示障礙格子,個體一般不能進入;
- 其他不同顏色的格子表示格子的即時獎勵值不同,獎勵值為0的格子顏色為灰色,獎勵值為負值顏色顯示偏向于紅色,值越小,紅色越深;獎勵值大于0的格子偏向于顯示綠色,值越大,綠色越飽滿;
- 個體使用黃色圓形來表示。
?
如何使用通用的格子世界類來定制自己想要的格子環境:
通用的格子世界環境類接受如下參數:
def __init__(self, n_width:int=10,n_height:int = 7,u_size = 40,default_reward:float = 0,default_type = 0,windy=False):分別是水平方向上格子數量,豎直方向上格子數量,每一個單位格子的繪制邊長(單位為像素值),默認每一個格子的即時獎勵值以及默認格子的類型。定義格子類型值為0時為個體可進入格子,類型為1表示為障礙,個體不能進入格子。有興趣您可以修改代碼支持更多的類型。
下面以一個懸崖行走格子世界環境為例,講解如何使用通用的格子世界環境類來得到自己想要的格子世界環境對象。懸崖行走的例子出現在David Silver強化學習公開課的?第五講?,環境如下:
?
- 首先,明確格子世界環境的布局:長寬格子數、內部的障礙、即時獎勵、起始狀態、終止狀態等信息。對于懸崖行走示例來說,世界長??、寬??,起始位置在左下角,坐標為??,終止狀態在右下角,坐標為??。
- 使用對應的參數建立一個格子世界環境類對象:
- 設置起始和終止狀態,起始狀態用元組描述,終止狀態用列表描述:
對一些特殊格子的類型和即時獎勵值進行修改,這里要把組成懸崖的格子的即時獎勵設為-100,這個例子中沒有不可進入的格子,所以不需要對格子類型進行修改。示例中懸崖格子是終止狀態,因此有:
for i in range(10):env.rewards.append((i+1,0,-100))env.ends.append((i+1,0))- 特殊類型的格子設置類似于即時獎勵設置,比如我們將坐標為(5,1)和(5,2)的兩個格子設為不可進入,可以添加如下代碼:
- 最后為了使這些設置在實際生效,調用刷新設置方法:
至此,我們自定義的格子世界環境就設置好了,調用其render()方法查看一下吧:
env.render() input("press any key to continue...")效果如下:
兩塊障礙已經順利生成了,可是發現個體的位置不在起始位置,為此我們需要重置下個體的位置,只需要調用env的reset()方法就可以了:
env.reset()?再看效果符合預期:
生成這個環境完整的代碼如下:?
from gridworld import GridWorldEnv from gym import spacesenv = GridWorldEnv(n_width=12, # 水平方向格子數量n_height = 4, # 垂直方向格子數量u_size = 60, # 可以根據喜好調整大小default_reward = -1, # 默認格子的即時獎勵值default_type = 0) # 默認的格子都是可以進入的 env.action_space = spaces.Discrete(4) # 設置行為空間數量 # 格子世界環境類默認使用0表示左,1:右,2:上,3:下,4,5,6,7為斜向行走 # 具體可參考_step內的定義 # 格子世界的觀測空間不需要額外設置,會自動根據傳輸的格子數量計算得到 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...")有了格子世界通用環境類,我們就可以比較方便定制自己的格子世界環境。為了方便使用,我也寫好了幾個內置的格子世界環境,大家只要調用相應的方法就可以得到它:
env = LargeGridWorld() # 10*10的大格子 env = SimpleGridWorld() # 10*7簡單無風格子 env = WindyGridWorld() # 10*7有風格子 env = RandomWalk() # 隨機行走 env = CliffWalk() # 懸崖行走 env = SkullAndTreasure() # 骷髏和錢袋子示例如果您希望讓您的個體支持斜向行走,請將相應的行為空間參數設為8,同時請留意環境類的_step方法關于斜向行走狀態的改變是否如您所愿的那樣設置,您可以在此基礎上定制自己的行為規則。
要使用格子世界環境類提供的功能,您必須已經實現安裝了gym庫以及其依賴庫。關于如何安裝gym庫、如何向gym注冊自定義的環境類可以參考相關教程。通過gym庫提供的相關功能,你還可以把個體經歷Episode的過程錄制成視頻。
下次實踐編寫與個體相關的代碼來鞏固我們對強化學習相關基礎算法的理解。敬請期待。
?
總結
以上是生活随笔為你收集整理的强化学习实践三 :编写通用的格子世界环境类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高校考的计算机应用能力一级,四川省普通高
- 下一篇: 新美大 java待遇_入我新美大的Jav