プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2024/02/12

Gymnasium の環境を動かしてみる

update2024/02/13 event_note2024/02/11 16:19

強化学習について勉強しようと思い、まずはサンプルとしてよく取り上げられる OpenAI の gym の CartPole などを動かそうとしてみたところ、上手く動きませんでした。
調べてみたところ、gym は現在ではもう更新されておらず、代わりに gym を fork した gymnasium というのがあるようなので、こちらを使って動かしてみました。

実行環境は docker を使って構築します。
とりあえず学習・推論はせず、単純に動かすだけです。

環境

  • WSL2(Ubuntu 22.04)
  • docker 24.0.7
  • python 3.11
  • swig 4.2.0
  • gymnasium 0.29.1

Dockerfile

FROM python:3.11

# 先に swig をインストールしておかないと gymnasium のインストールに失敗しました
RUN pip install swig
RUN pip install gymnasium[box2d]

CMD [ "/bin/bash" ]

コンテナの起動

GUI を動かすので、コンテナは以下のように起動します。

docker run -it --rm \
       -v $(pwd)/workspace:/workspace \
       -v /etc/group:/etc/group:ro \
       -v /etc/passwd:/etc/passwd:ro \
       -u $(id -u $USER):$(id -g $USER) \
       -e DISPLAY \
       -v /tmp/.X11-unix:/tmp/.X11-unix:rw \
       --workdir /workspace \
       imagename

これについては以下が参考になりました。

CartPole のサンプル

import gymnasium as gym

# 環境を作成
# render_mode は描画モードの指定。human は人間が見てわかるように動画として表示するという意味
env = gym.make("CartPole-v1", render_mode="human")

for episode in range(10):
    # 環境をリセット
    observation, info = env.reset()
    step = 0
    while True:
        # 行動をランダムに選択
        action = env.action_space.sample() # これがエージェントの行動になるので、本来はAIが行動を決定するべきところ
        # 選択した行動を実行
        observation, reward, terminated, truncated, info = env.step(action)
        #print(env.render()) # 状態の可視化(human の場合は不要)
        # 終了した場合、次のエピソードへ
        if terminated or truncated:
            print(f"Episode{episode+1} finished after {step+1} timesteps")
            break
        step += 1
env.close()

LunarLander のサンプル

同様に以下のようにして LunarLander も動きました。

import gymnasium as gym

# 環境を作成
# render_mode は描画モードの指定。human は人間が見てわかるように動画として表示するという意味
env = gym.make("LunarLander-v2", render_mode="human")

for episode in range(10):
    # 環境をリセット
    observation, info = env.reset()
    step = 0
    while True:
        # 行動をランダムに選択
        action = env.action_space.sample() # これがエージェントの行動になるので、本来はAIが行動を決定するべきところ
        # 選択した行動を実行
        observation, reward, terminated, truncated, info = env.step(action)
        #print(env.render()) # 状態の可視化(human の場合は不要)
        # 終了した場合、次のエピソードへ
        if terminated or truncated:
            print(f"Episode{episode+1} finished after {step+1} timesteps")
            break
        step += 1

env.close()

FrozenLake のサンプル

同様に以下のようにして FrozenLake も動きました。

import gymnasium as gym

# 環境を作成
# render_mode は描画モードの指定。human は人間が見てわかるように動画として表示するという意味
env = gym.make("FrozenLake-v1", render_mode="human")

for episode in range(10):
    # 環境をリセット、現在の観測値(observation)と情報(info)を取得
    observation, info = env.reset()
    step = 0
    while True:
        # 行動をランダムに選択
        action = env.action_space.sample() # これがエージェントの行動になるので、本来はAIが行動を決定するべきところ
        # 選択した行動を実行
        observation, reward, terminated, truncated, info = env.step(action)
        #print(env.render()) # 状態の可視化(human の場合は不要)
        # 終了した場合、次のエピソードへ
        if terminated or truncated:
            print(f"Episode{episode+1} finished after {step+1} timesteps")
            break
        step += 1
env.close()