๐ 2D Custom Lunar Lander v2 โ Pure Python Brain (86.0% Landing Rate)
๐ก 86.0% ์ฐฉ์ง ์ฑ๊ณต๋ฅ ๋ฌ์ฑ! ์ธ๋ถ ๋ฌผ๋ฆฌ ์์ง ์์ด **๋จ 47์ค์ ์์ ํ์ด์ฌ(Pure Python)**๊ณผ Gymnasium ๊ท๊ฒฉ์ผ๋ก ๋ฐ๋ฅ๋ถํฐ ์ง์ ์ ์ํ ๊ฒฝ๋ ์ฐฉ์ง ์๋ฎฌ๋ ์ดํฐ ๋ฐ DQN ์ธ๊ณต์ง๋ฅ ๋๋ ๋ชจ๋ธ์ ๋๋ค.
๐ฅ ๋นํ ๋ฐ ์ฐฉ์ง ์์ฐ (Demo)
๐ก ์ข์ฐ ๋ณด์กฐ ์ถ์ง๊ธฐ์ ์ค์ ์ฃผ ์์ง์ ์ ๋ฐํ๊ฒ ์ ์ดํ์ฌ ์ฐฉ์ง๋ ์ค์(X=0, Y=0)์ ์์ง์ผ๋ก ์ฌ๋ฟํ ์์ฐฉํฉ๋๋ค.
๐ ์ฑ๋ฅ ํ๊ฐ ๊ฒฐ๊ณผ (50 Episodes Evaluation)
๋ฏธํ์ต ์๋(Seed 5000 ~ 5049) 50ํ ์ฐ์ ํ๊ฐ ์ค์ธก ๋ฐ์ดํฐ์ ๋๋ค.
| ํ๊ฐ ํญ๋ชฉ | ์ค์ธก ๊ฒฐ๊ณผ | ๋น๊ณ |
|---|---|---|
| ์๋ฒฝ ์ฐฉ์ง ์ฑ๊ณต๋ฅ | 86.0% (43 / 50ํ) ๐ | ์ฐฉ์ง๋ ์ค์ ์์ ์์ญ ์์ฐฉ |
| ์ถ๋ฝ (Crash) | 7ํ (14.0%) | ํ์ฉ ์๋/๊ฐ๋ ์ด๊ณผ ์ ์ด |
| ์ฅ์ธ ์ดํ (Out of Bounds) | 0ํ (0.0%) | 100% ๋นํ ์์ญ ๋ด ์ ์ง |
| ์๊ฐ ์ด๊ณผ (Timeout) | 0ํ (0.0%) | 400์คํ ์ด๋ด ์ ์ํ ์ฐฉ์ง |
| ์ํผ์๋ ํ๊ท ๋ณด์ | +69.8์ | ์ฐ๋ฃ ์ ๊ฐ ๋ฐ ์์ ์ ์ฐฉ์ง ๋ฌ์ฑ |
๐ ๏ธ ํ๊ฒฝ ๋ฐ ์๊ณ ๋ฆฌ์ฆ ์ฌ์
- ์๋ฎฌ๋ ์ดํฐ ํ๊ฒฝ (
custom_lander_env.py):- ๋จ 47์ค์ ๊ฐ๋ฒผ์ด ์์ ํ์ด์ฌ ์ฝ๋๋ก ๊ตฌํ๋ 2D ์ฐ์ฃผ์ ๋ฌผ๋ฆฌ ์์ง
- ์ํ ๊ณต๊ฐ (6์ฐจ์): $[x/5, y/10, v_x/2, v_y/2, \theta, \omega/2]$
- ํ๋ ๊ณต๊ฐ (4์ฐจ์):
0: ์์ง ๋๊ธฐ (๊ด์ฑ ํ๊ฐ)1: ์ข์ธก ๋ณด์กฐ ์ถ์ง๊ธฐ (์ฐํ์ ํ ํฌ)2: ์ค์ ์ฃผ ์ถ์ง๊ธฐ (์์น ์ถ๋ ฅ)3: ์ฐ์ธก ๋ณด์กฐ ์ถ์ง๊ธฐ (์ขํ์ ํ ํฌ)
- ์ ๊ฒฝ๋ง ๊ตฌ์กฐ (DQN):
- ์ ๋ ฅ์ธต(6) $\to$ Linear(128) $\to$ ReLU $\to$ Linear(128) $\to$ ReLU $\to$ ์ถ๋ ฅ์ธต(4)
- ์ด ํ๋ จ ์คํ : 250,000 ์คํ
๐ป ๋น ๋ฅธ ์์ ๋ฐ ์คํ ๋ฐฉ๋ฒ (Quick Start)
1. ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
pip install gymnasium torch numpy
2. ์ฐฉ์ง์ 50ํ ํ๊ฐ ์คํ
์ ์ฅ์๋ฅผ ๋ด๋ ค๋ฐ์ ํ ์๋ ๋ช ๋ น์ด๋ก 86% ์ฑ๋ฅ์ ์ฆ์ ์ฌํํ ์ ์์ต๋๋ค:
python run_demo.py custom_lander_brain.pt
3. ํ์ด์ฌ ์ฝ๋์์ ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
import torch
from custom_lander_env import ์ฐฉ์ง
from run_demo import create_model
# 1. 128 ์๋ ๋
ธ๋ Q-Network ๋ก๋
model = create_model(state_dim=6, action_dim=4, hidden_dim=128)
model.load_state_dict(torch.load('custom_lander_brain.pt', map_location='cpu'))
model.eval()
# 2. ์์ ํ์ด์ฌ ์ฐฉ์ง ํ๊ฒฝ ์ด๊ธฐํ
env = ์ฐฉ์ง()
obs, _ = env.reset(seed=42)
done = False
while not done:
with torch.no_grad():
action = int(model(torch.from_numpy(obs)).argmax())
obs, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
print(f"์ฐฉ์ง ๊ฒฐ๊ณผ: {info['๊ฒฐ๊ณผ']}")
๐ ํ์ผ ๊ตฌ์กฐ
custom_lander_brain.pt: 86% ์ฐฉ์ง ์ฑ๊ณต DQN ๊ฐ์ค์น (74KB)custom_lander_env.py: 47์ค ๊ฒฝ๋ 2D ์์ ํ์ด์ฌ ์ฐฉ์ง ์๋ฎฌ๋ ์ดํฐ ํ๊ฒฝrun_demo.py: 50ํ ์๋ฎฌ๋ ์ด์ ํ๊ฐ ๋ฐ ์ฌํ ์คํฌ๋ฆฝํธlander_demo2.mp4: 2D ์ฐฉ์ง์ ์์ฐ ๋น๋์ค (20KB)README.md: ๋ชจ๋ธ ์นด๋ ๋ฐ ์ฑ๋ฅ ๋ฆฌํฌํธ
Evaluation results
- Landing Success Rate (%) on Pure Python 2D Custom Lunar Landerself-reported86.000