最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

OpenAI Gym學習(二):創(chuàng)建自定義環(huán)境

2023-08-07 22:44 作者:LSC2049  | 我要投稿

本文檔概述了創(chuàng)建新環(huán)境以及Gymnasium中為創(chuàng)建新環(huán)境而設計的相關wrapper、實用程序和測試。你可以克隆Gym的例子來使用這里提供的代碼。

子類化 gymnasium.Env

在Gym示例中可以發(fā)現(xiàn)環(huán)境大概長這樣:

為了說明Gym Env的子類化過程,我們將實現(xiàn)一個非常簡單的游戲,名為GridWorldEnv。我們將在gym-examples/gym_examples/envs/grid_world.py中為我們的自定義環(huán)境編寫代碼。該環(huán)境由一個固定大小的二維方形網(wǎng)格組成(在構建過程中通過大小參數(shù)指定)。agent可以在每個時間步長的網(wǎng)格單元之間垂直或水平移動。agent的目標是導航到網(wǎng)格上在劇集開始時隨機放置的目標。

  • Observation:觀測提供了目標和代理人的位置。

  • Action:在我們的環(huán)境中有4個動作,分別對應“右”、“上”、“左”和“下”。

  • Done:一旦agent導航到目標所在的網(wǎng)格單元,就會發(fā)出完成信號。

  • Reward:獎勵是二進制和稀疏的,這意味著即時獎勵始終為零,除非代理達到目標,否則為1。

在這種環(huán)境中(大小=5)的一集可能如下所示:

缺圖

其中藍色圓點表示代理,紅色方塊表示目標。

讓我們逐一查看GridWorldEnv的源代碼:

聲明和初始化

我們的自定義環(huán)境將繼承抽象類gymnasium.Env。您不應該忘記將meta元數(shù)據(jù)屬性添加到類中。在那里,您應該指定環(huán)境支持的render_mode(例如“human”、“rgb_array”、“ansi”)以及渲染環(huán)境的幀速率。每個環(huán)境都應該支持None作為渲染模式;您不需要將其添加到元數(shù)據(jù)中。在GridWorldEnv中,我們將支持“rgb_array”和“human”模式,并以4 FPS進行渲染。

我們環(huán)境的__init__方法將接受整數(shù)大小,該大小決定了方形網(wǎng)格的大小。我們將設置一些用于渲染的變量,并定義self.observation_space和self.action_space。在我們的情況下,觀測應提供有關agent和target在二維網(wǎng)格上的位置的信息。我們將選擇用關鍵字“agent”和“target”的字典形式來表示觀察結(jié)果。觀察結(jié)果可能類似于{“agent”:array([1,0]),“target”:array([0,3])}。由于我們的環(huán)境中有4個動作(“right”、“up”、“l(fā)eft”、“down”),我們將使用Discrete(4)作為動作空間。以下是GridWorldEnv的聲明和__init__的實現(xiàn):

從環(huán)境狀態(tài)構建觀測

由于我們需要在reset和step中計算觀測值,因此使用(私有)方法_get_obs將環(huán)境狀態(tài)轉(zhuǎn)換為觀測值通常很方便。然而,這不是強制性的,您也可以分別在重置和步驟中計算觀測值:

對于step和reset返回的輔助信息,我們也可以實現(xiàn)類似的方法。在我們的情況下,我們希望提供agent和target之間的曼哈頓距離:

通常,info還會包含一些僅在步驟方法中可用的數(shù)據(jù)(例如,個人獎勵條款)。在這種情況下,我們必須更新_get_info在步驟中返回的字典。

Reset

調(diào)用reset方法來啟動新的輪次。您可以假設在調(diào)用reset之前不會調(diào)用step方法。此外,無論何時發(fā)出完成信號,都應調(diào)用重置。用戶可以傳遞seed關鍵字以重置,從而將環(huán)境使用的任何隨機數(shù)生成器初始化為確定性狀態(tài)。建議使用環(huán)境的基類gymnasium.Env提供的隨機數(shù)生成器self.np_random。如果你只使用這個RNG,你不需要太擔心種子,但你需要記住調(diào)用“super().reset(seed=seed)”,以確保gymnasium.Env正確地喂給RNG。一旦完成,我們就可以隨機設置環(huán)境的狀態(tài)。在我們的情況下,我們隨機選擇代理的位置和隨機樣本目標位置,直到它與代理的位置不一致。

reset方法應該返回初始觀測值的元組和一些輔助信息。我們可以使用前面實現(xiàn)的方法_get_obs和_get_info:

Step

step方法通常包含環(huán)境的大部分邏輯。它接受一個action,在應用該action后計算環(huán)境的狀態(tài),并返回5元組(observation、reward 、terminated、truncated、info)。請參閱gymnium.Env.step()。一旦計算出環(huán)境的新狀態(tài),我們就可以檢查它是否是一個終止狀態(tài),并相應地設置完成。由于我們在GridWorldEnv中使用稀疏二進制獎勵(sparse binary rewards),一旦我們知道完成了計算獎勵就很簡單了。為了收集觀察結(jié)果和信息,我們可以再次使用_get_obs和_get_info:

Rendering

在這里,我們使用PyGame進行渲染。Gymnasium中包含的許多環(huán)境都使用類似的渲染方法,您可以將其用作自己環(huán)境的骨架:

Close

close方法應關閉環(huán)境使用的任何打開的資源。在許多情況下,您實際上不必費力地實現(xiàn)此方法。但是,在我們的示例中,render_mode可能是“human”,我們可能需要關閉已打開的窗口:

在其他環(huán)境中,關閉可能還會關閉已打開的文件或釋放其他資源。在調(diào)用關閉后,您不應該與環(huán)境交互。

Registering Envs

為了讓Gymnasium檢測到自定義環(huán)境,必須按照以下方式進行注冊。我們將選擇將此代碼放在gym-examples/gym_examples/__init__.py中。

環(huán)境ID由三個組件組成,其中兩個組件是可選的:可選名稱空間(此處:gym_examples)、強制名稱(此處:GridWorld)和可選但推薦的版本(此處:v0)。它可能還被注冊為GridWorld-v0(推薦的方法)、GridWorld或gym_examples/GridWorld,然后在創(chuàng)建環(huán)境時應該使用適當?shù)腎D。

關鍵字參數(shù)max_epimode_steps=300將確保通過gymnasium.make實例化的GridWorld環(huán)境將被封裝在TimeLimit包裝器中(有關更多信息,請參閱包裝器文檔)。如果代理已經(jīng)到達目標或者在當前事件中已經(jīng)執(zhí)行了300個步驟,則將產(chǎn)生完成信號。要區(qū)分截斷和終止,您可以檢查信息[“TimeLimit.cotruncated”]。

除了id和入口點,您還可以傳遞以下額外的關鍵字參數(shù)進行注冊:

這些關鍵字中的大多數(shù)(除了max_epimode_steps、order_enforce和kwargs)不會改變環(huán)境實例的行為,而只是提供一些關于環(huán)境的額外信息。注冊后,我們的自定義GridWorldEnv環(huán)境可以用env=gymn.make('gym_examples/GridWorld-v0')創(chuàng)建。

gym-examples/gym_examples/envs/__init__.py應該具有:

如果您的環(huán)境沒有注冊,您可以選擇傳遞一個模塊來導入,該模塊將在創(chuàng)建環(huán)境之前注冊環(huán)境,如下所示-env=gymnom.make('module:env-v0'),其中module包含注冊代碼。對于GridWorld env,注冊代碼是通過導入gym_examples來運行的,因此,如果無法顯式導入gym_samples,則可以在制作時通過env=gym.make('gym_examples:gym_examples/GridWorld-v0)進行注冊。當只允許將環(huán)境ID傳遞給第三方代碼庫(例如學習庫)時,這一點尤其有用。這使您可以注冊環(huán)境,而無需編輯庫的源代碼。

Creating a Package

最后一步是將我們的代碼構造為Python包。這涉及到配置gym examples/setup.py。如何做到這一點的最簡單示例如下:

Creating Environment Instances

使用pip install -e gym-examples在本地安裝軟件包后,您可以通過以下方式創(chuàng)建環(huán)境實例:

您還可以將環(huán)境構造函數(shù)的關鍵字參數(shù)傳遞給gymnasium.make以自定義環(huán)境。在我們的案例中,我們可以做到:

有時,您可能會發(fā)現(xiàn)跳過注冊并自己調(diào)用環(huán)境的構造函數(shù)更方便。有些人可能會發(fā)現(xiàn)這種方法更Python,像這樣實例化的環(huán)境也非常好(但也要記住添加包裝器!)。

Using Wrappers

通常,我們想要使用自定義環(huán)境的不同變體,或者我們想要修改Gym或其他方提供的環(huán)境的行為。包裝器允許我們在不更改環(huán)境實現(xiàn)或添加任何樣板代碼的情況下實現(xiàn)這一點。有關如何使用包裝器的詳細信息以及實現(xiàn)自己的包裝器的說明,請查看包裝器文檔。在我們的例子中,觀察不能直接用于學習代碼,因為它們是字典。然而,我們實際上不需要接觸我們的環(huán)境實現(xiàn)來解決這個問題!我們可以簡單地在環(huán)境實例的頂部添加一個包裝器,將觀察結(jié)果扁平化為單個數(shù)組:

包裝器的最大優(yōu)點是使環(huán)境高度模塊化。例如,您可能只想查看目標和代理的相對位置,而不是將GridWorld中的觀察結(jié)果扁平化。在關于ObservationWrappers的部分中,我們實現(xiàn)了一個完成這項工作的包裝器。這種包裝也可用于gym-examples:


OpenAI Gym學習(二):創(chuàng)建自定義環(huán)境的評論 (共 條)

分享到微博請遵守國家法律
夹江县| 上饶市| 岱山县| 喀喇沁旗| 浠水县| 柳州市| 甘德县| 阳谷县| 通江县| 衡阳市| 通道| 正安县| 杭州市| 景宁| 井研县| 松溪县| 大荔县| 朔州市| 利津县| 琼结县| 永嘉县| 通海县| 太原市| 南丹县| 绥阳县| 龙陵县| 聊城市| 白银市| 阿坝县| 聂荣县| 滨州市| 普安县| 隆安县| 井陉县| 称多县| 关岭| 蒙自县| 栾川县| 陇南市| 大厂| 阿合奇县|