Gymnasium のプログラムを試してみる

概要

Gymnasium の公式ドキュメントに記載の手順をなぞる. OpenAI Gym は開発が終了しており,現在は後継の Gymnasium(Farama Foundation が開発)が保守されている.

目次

関連する外部ページ

https://github.com/Farama-Foundation/Gymnasium のサンプルプログラムを参考にしている.

前準備

Gymnasium のインストールは,別ページ »で説明。

Gymnasium を使ってみる

ランダム動作のプログラム

まず、ランダムな動作を試す。前準備がうまくいったかの確認も兼ねる。

Python プログラムを動かす。

import gymnasium as gym

env = gym.make('CartPole-v1', render_mode="human")  # 環境(environment)を作る

for i_episode in range(20):
    observation, info = env.reset()
    for t in range(100):
        action = env.action_space.sample()  # ランダムな行動.ここを自分のアルゴリズムに置き換える
        observation, reward, terminated, truncated, info = env.step(action)  # 報酬と次の状態を得る
        if terminated or truncated:
            print("Episode finished after {} timesteps".format(t+1))
            break

env.close()

次のような画面が出る。

Environment の確認

Python プログラムを動かす。

import gymnasium as gym

env = gym.make('CartPole-v1', render_mode="human")

for i_episode in range(20):
    observation, info = env.reset()
    for t in range(100):
        print(observation)
        action = env.action_space.sample()  # ランダムな行動.ここを自分のアルゴリズムに置き換える
        observation, reward, terminated, truncated, info = env.step(action)
        if terminated or truncated:
            print("Episode finished after {} timesteps".format(t+1))
            break

env.close()

結果を確認する。

ここに出ているのは、各繰り返し (timestep) での Environment の値(変数名は observation)である。 繰り返しが進むと、Environment の値が変化していることがわかる。

空間 (space)

Python プログラムを動かす。

import gymnasium as gym
env = gym.make('CartPole-v1')
print(env.action_space)
#> Discrete(2)
print(env.observation_space)
#> Box(4,)

結果を確認する。

動画を記録するプログラム

関連する外部ページhttps://gymnasium.farama.org/introduction/record_agent/ のプログラムを参考にしている。

  1. FFmpeg のインストール
  2. Python プログラムの実行

    その他情報

    Python プログラムの実行

    Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である。

    Python のまとめ: 別ページ »にまとめ

    python
    
    import os
    import gymnasium as gym
    from gymnasium.wrappers import RecordVideo, RecordEpisodeStatistics
    
    
    class RandomAgent(object):
        """最も単純なエージェント"""
        def __init__(self, action_space):
            self.action_space = action_space
    
        def act(self, observation, reward, terminated, truncated):
            return self.action_space.sample()
    
    
    if __name__ == '__main__':
        env_id = 'CartPole-v1'
        outdir = 'random-agent-results'
    
        env = gym.make(env_id, render_mode="rgb_array")
        env = RecordVideo(env, video_folder=outdir, episode_trigger=lambda x: True)
        env = RecordEpisodeStatistics(env)
        env.action_space.seed(0)
        agent = RandomAgent(env.action_space)
    
        episode_count = 100
        reward = 0
        terminated = False
        truncated = False
    
        for i in range(episode_count):
            ob, info = env.reset()
            while True:
                action = agent.act(ob, reward, terminated, truncated)
                ob, reward, terminated, truncated, info = env.step(action)
                if terminated or truncated:
                    break
    
        # 環境を閉じ、記録結果をディスクに書き込む
        env.close()
    

    結果を確認する。

    これは、動画とログを記録したというメッセージである。記録先ディレクトリ名を確認する。

    記録先ディレクトリを開いてみる。

Gymnasium の公式チュートリアルで強化学習のサンプルプログラムを動かしてみる

Gymnasium 公式ドキュメントの Training an Agent に、Blackjack環境を題材にした強化学習(Q学習)のサンプルプログラムが掲載されている。 このページの手順に沿って、エージェントの学習を実際に試すことができる。

  1. 上記ページに掲載されている Python プログラムをコピーする

    その他情報

    Python プログラムの実行

    Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である。

    Python のまとめ: 別ページ »にまとめ

  2. Python プログラムの実行
    python
    

    これは、状態や行動の組ごとに期待報酬を記録する表(Qテーブル)を作りながら学習を進める、強化学習の基本的なプログラムである。 学習の進み具合は、報酬の推移などのグラフで確認できる。