Inverted Pendulum이 무엇인지에 대해서는 관련 문서를 읽어보고, 파악합니다. 이번에는 action이 연속적인 것이 특징입니다.

Gymnasium Documentation

1. 사용자 조종 환경 구성

직접 조작해보면서 막대기를 위로 계속 세워보고, 반환되는 보상값을 확인합니다.

##############################################
# 키보드 입력을 받아 action을 결정하는 코드
from pynput import keyboard  # pip install pynput

action = 0

def left():
    global action
    action = -2

def right():
    global action
    action = 2

def dont_accelerate():
    global action
    action = 0

listener = keyboard.GlobalHotKeys({
    'j': left,  # j는 시계 방향으로 가속
    'l': right,  # l은 반시계 방향으로 가속 
    'k': dont_accelerate  # k는 가속하지 않음
})

listener.start()
##############################################

import gymnasium as gym
import time

env = gym.make('Pendulum-v1', render_mode="human")
env.reset()
steps = 0

while True:
    # env.step 진행
    _, reward, done, _, _ = env.step((action,))

    print("현재", steps, "스텝 에서의 보상 반환값:", reward)

    steps += 1
    time.sleep(0.1)

2. 학습

pendulum를 학습할 수 있는 코드를 만듭니다.

학습을 마치면 인퍼런스에 사용할 모델을 세이브 합니다.

# 모델을 저장하는 코드
model = DQN()
####################
# 학습을 진행 후... #
####################
model.save_weights('your_model_name', save_format='tf')

3. 인퍼런스

세이브 한 모델을 불러와서 잘 작동하는지 확인해봅니다.

# 모델을 불러오는 코드
model = DQN()  # 이때, DQN 클래스는 save_weights를 사용한 객체의 클래스 구조가 동일해야 함
model.load_weights("your_model_name")

난이도 선택

Pendulum은 환경을 생성할 때 중력가속도를 지정할 수 있습니다(해당 문서의 arguments 확인). 일반적으로 진자의 반동으로 꼭대기에 세워야 하고 및 꼭대기에 세웠을 때 중심을 잡는 과정이 있어야 하지만, g가 낮은 값으로 설정되면 진자의 반동 없이 힘으로 중력을 거스르고 바로 올라갈 수 있어서 문제 복잡성이 낮아집니다. 해당 문제가 학습이 잘 안된다고 판단되면 g를 낮추고 진행할 수 있습니다.

난이도 중력가속도
평온 1
보통 5
어려움 10(기본)

토글

코드가 너무 길어서 토글 항목으로 만들고 싶으면 마크다운에 다음과 같이 작성하면 됩니다.

<details>
<summary>토글 접기/펼치기</summary>
<div markdown="1">

안녕

</div>
</details>