๐Ÿš€ 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: ๋ชจ๋ธ ์นด๋“œ ๋ฐ ์„ฑ๋Šฅ ๋ฆฌํฌํŠธ
Downloads last month

-

Downloads are not tracked for this model. How to track
Video Preview
loading

Evaluation results

  • Landing Success Rate (%) on Pure Python 2D Custom Lunar Lander
    self-reported
    86.000