登月小艇¶

此環境是 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 負荷非常小。如果已喚醒的主體與睡眠的主體碰撞,則睡眠的主體會喚醒。如果連接到它們的關節或接觸被破壞,主體也會喚醒。
參數¶
登月小艇具有大量參數
>>> 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.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 問題)。修正由於未完全摧毀世界而導致的非確定性行為(相關 GitHub 問題)。
將
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,'角速度':2.5
修正後,狀態的單位如下:'x':(單位),'y':(單位),'vx':(單位/秒),'vy':(單位/秒),'angle':(弧度),'角速度':(弧度/秒)
貢獻者¶
由 Oleg Klimov 建立