登月小艇

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

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

動作空間

離散(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 維向量:登月小艇在 x & y 中的座標、其在 x & y 中的線性速度、其角度、其角速度,以及兩個布林值,表示每個腳是否與地面接觸。

獎勵

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

對於每一步,獎勵

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

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

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

  • 對於每個與地面接觸的腳會增加 10 分。

  • 每次啟動側引擎時,每幀會減少 0.03 分。

  • 每次啟動主引擎時,每幀會減少 0.3 分。

對於墜毀或安全著陸,該回合分別會收到額外的 -100 或 +100 分獎勵。

如果一個回合得分至少 200 分,則該回合被視為解決方案。

起始狀態

登月小艇從視窗頂部中心開始,對其質心施加隨機初始力。

回合終止

如果發生以下情況,則回合結束

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

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

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

當 Box2D 確定主體(或一組主體)已靜止時,主體會進入睡眠狀態,而睡眠狀態的 CPU 負荷非常小。如果已喚醒的主體與睡眠的主體碰撞,則睡眠的主體會喚醒。如果連接到它們的關節或接觸被破壞,主體也會喚醒。

參數

登月小艇具有大量參數

>>> 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,則右側推進器會啟動。同樣,油門在 -1 和 -0.5(以及分別在 0.5 和 1 之間)線性縮放 50% 到 100%。

  • 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 問題)。

    • 修正由於未完全摧毀世界而導致的非確定性行為(相關 GitHub 問題)。

    • 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,'角速度':2.5

修正後,狀態的單位如下:'x':(單位),'y':(單位),'vx':(單位/秒),'vy':(單位/秒),'angle':(弧度),'角速度':(弧度/秒)

貢獻者

由 Oleg Klimov 建立