強化学習について勉強しようと思い、まずはサンプルとしてよく取り上げられる 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()