登月小艇¶

此環境是 Box2D 環境的一部分,其中包含有關環境的一般資訊。
動作空間 |
|
觀察空間 |
|
import |
|
描述¶
此環境是一個經典的火箭軌跡最佳化問題。根據龐特里亞金最大值原理,以全油門啟動引擎或關閉引擎是最佳的。這就是此環境具有離散動作的原因:引擎開啟或關閉。
有兩個環境版本:離散或連續。著陸墊始終位於座標 (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 點,則視為解決方案。
起始狀態¶
登月艇從視窗頂部中央開始,並在其質心上施加隨機初始力。
回合終止¶
在以下情況下,回合結束
登月艇墜毀(登月艇主體與月球接觸);
登月艇超出視窗範圍(
x
座標大於 1);登月艇未喚醒。從 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.0enable_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)。
將
x
、y
座標的觀察空間從 \(\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:初始版本
注意事項¶
環境的實作存在一些意想不到的錯誤。
登月艇本體上的側向推進器位置會根據登月艇的方向而變化。這反過來會導致施加到登月艇的方向相關扭矩。
狀態的單位不一致。即
角速度的單位為每秒 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 建立