登月小艇

../../../_images/lunar_lander.gif

此環境是 Box2D 環境的一部分,其中包含有關環境的一般資訊。

動作空間

Discrete(4)

觀察空間

Box([ -2.5 -2.5 -10. -10. -6.2831855 -10. -0. -0. ], [ 2.5 2.5 10. 10. 6.2831855 10. 1. 1. ], (8,), float32)

import

gymnasium.make("LunarLander-v3")

描述

此環境是一個經典的火箭軌跡最佳化問題。根據龐特里亞金最大值原理,以全油門啟動引擎或關閉引擎是最佳的。這就是此環境具有離散動作的原因:引擎開啟或關閉。

有兩個環境版本:離散或連續。著陸墊始終位於座標 (0,0)。座標是狀態向量中的前兩個數字。可以在著陸墊外著陸。燃料是無限的,因此智能體可以學習飛行,然後在其第一次嘗試中著陸。

若要查看啟發式著陸,請執行

python gymnasium/envs/box2d/lunar_lander.py

動作空間

有四個離散動作可用

  • 0:無所事事

  • 1:啟動左方向引擎

  • 2:啟動主引擎

  • 3:啟動右方向引擎

觀察空間

狀態是一個 8 維向量:登月艇在 xy 中的座標、其在 xy 中的線性速度、其角度、其角速度,以及兩個布林值,表示每條腿是否與地面接觸。

獎勵

每個步驟後都會授予獎勵。回合的總獎勵是該回合內所有步驟的獎勵總和。

對於每個步驟,獎勵

  • 會隨著登月艇越靠近/遠離著陸墊而增加/減少。

  • 會隨著登月艇移動越慢/快而增加/減少。

  • 會隨著登月艇傾斜程度越高(角度非水平)而減少。

  • 每條腿與地面接觸,獎勵增加 10 點。

  • 每次側引擎點火,每幀獎勵減少 0.03 點。

  • 每次主引擎點火,每幀獎勵減少 0.3 點。

如果墜毀或安全著陸,回合將分別獲得額外 -100 或 +100 點的獎勵。

如果回合得分至少 200 點,則視為解決方案。

起始狀態

登月艇從視窗頂部中央開始,並在其質心上施加隨機初始力。

回合終止

在以下情況下,回合結束

  1. 登月艇墜毀(登月艇主體與月球接觸);

  2. 登月艇超出視窗範圍(x 座標大於 1);

  3. 登月艇未喚醒。從 Box2D 文件來看,未喚醒的物體是不移動且不與任何其他物體碰撞的物體

當 Box2D 確定一個物體(或物體群組)已靜止時,該物體會進入休眠狀態,這幾乎沒有 CPU overhead。如果一個清醒的物體與一個休眠的物體碰撞,那麼休眠的物體就會醒來。如果連接到物體的關節或接觸被破壞,物體也會醒來。

參數

Lunar Lander 有大量參數

>>> import gymnasium as gym
>>> env = gym.make("LunarLander-v3", continuous=False, gravity=-10.0,
...                enable_wind=False, wind_power=15.0, turbulence_power=1.5)
>>> env
<TimeLimit<OrderEnforcing<PassiveEnvChecker<LunarLander<LunarLander-v3>>>>>

  • continuous 決定是否將使用離散或連續動作(對應於引擎的油門),動作空間分別為 Discrete(4)Box(-1, +1, (2,), dtype=np.float32)。對於連續動作,動作的第一個座標決定主引擎的油門,而第二個座標指定側向推進器的油門。給定一個動作 np.array([main, lateral]),如果 main < 0,主引擎將完全關閉,油門從 50% 仿射縮放到 100%,適用於 0 <= main <= 1(特別是,主引擎在低於 50% 的功率下無法運作)。同樣地,如果 -0.5 < lateral < 0.5,則側向推進器根本不會點火。如果 lateral < -0.5,則左側推進器將點火,如果 lateral > 0.5,則右側推進器將點火。同樣地,油門從 50% 仿射縮放到 100% 之間 -1 和 -0.5(以及分別為 0.5 和 1)。

  • gravity 指示重力常數,此值限制在 0 到 -12 之間。預設值為 -10.0

  • enable_wind 決定是否將對登月艇施加風力效應。風是使用函數 tanh(sin(2 k (t+C)) + sin(pi k (t+C))) 產生的,其中 k 設定為 0.01,C 在 -9999 和 9999 之間隨機取樣。

  • wind_power 指示施加到飛行器的線性風力的最大強度。建議的 wind_power 值介於 0.0 和 20.0 之間。

  • turbulence_power 指示施加到飛行器的旋轉風力的最大強度。建議的 turbulence_power 值介於 0.0 和 2.0 之間。

版本歷史

  • v3

    • 每當環境重設時,重設風和湍流偏移量 (C),以確保連續回合之間的統計獨立性(相關 GitHub issue)。

    • 修正由於未完全銷毀世界而導致的非決定性行為(相關 GitHub issue)。

    • xy 座標的觀察空間從 \(\pm 1.5\) 變更為 \(\pm 2.5\),速度從 \(\pm 5\) 變更為 \(\pm 10\),角度從 \(\pm \pi\) 變更為 \(\pm 2\pi\)(相關 GitHub issue)。

  • v2:計算能量消耗,在 v0.24 中,新增了具有風力和 turbulence_power 參數的湍流

  • v1:在狀態向量中新增了腿部與地面的接觸;與地面的接觸給予 +10 獎勵點,如果隨後失去接觸則給予 -10;獎勵重新標準化為 200;更難的初始隨機推力。

  • v0:初始版本

注意事項

環境的實作存在一些意想不到的錯誤。

  1. 登月艇本體上的側向推進器位置會根據登月艇的方向而變化。這反過來會導致施加到登月艇的方向相關扭矩。

  2. 狀態的單位不一致。即

  • 角速度的單位為每秒 0.4 弧度。為了轉換為每秒弧度,該值需要乘以 2.5 的因子。

對於 VIEWPORT_W、VIEWPORT_H、SCALE 和 FPS 的預設值,比例因子等於:'x':10、'y':6.666、'vx':5、'vy':7.5、'angle':1、'angular velocity':2.5

在進行修正後,狀態的單位如下:'x':(單位)、'y':(單位)、'vx':(單位/秒)、'vy':(單位/秒)、'angle':(弧度)、'angular velocity':(弧度/秒)

貢獻者

由 Oleg Klimov 建立