倒立振子課題「CartPole」

今回は強化学習アルゴリズムを実装したり、性能を比較するための実行環境であるOpenAI Gymを使います。

OpenAI Gymでは課題となる実行環境がいくつか用意されていますが、定番の倒立振子課題 CartPole を試します。
倒立振子課題は台車の上に回転軸を固定した棒を立て、その棒が倒れないように台車を右・左と細かく動かす制御課題です。

ますは必要なライブラリをインストールします。(Pythonバージョンは3.6です)

1
2
3
4
5
6
pip install gym
pip install matplotlib
pip install JSAnimation
pip uninstall pyglet -y
pip install pyglet==1.2.4
conda install -c conda-forge ffmpeg

Jupyter Notebookを開きコーディングを始めます。

使用するパッケージは次の通りです。

1
2
3
4
5
# 使用するパッケージの宣言
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import gym

動画を描画するための関数を定義します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 動画の描画関数の宣言
from JSAnimation.IPython_display import display_animation
from matplotlib import animation
from IPython.display import display

def display_frames_as_gif(frames):
plt.figure(figsize=(frames[0].shape[1]/72.0, frames[0].shape[0]/72.0), dpi=72)
patch = plt.imshow(frames[0])
plt.axis('off')

def animate(i):
patch.set_data(frames[i])

anim = animation.FuncAnimation(plt.gcf(), animate, frames=len(frames), interval=50)
anim.save('3_2movie_cartpole.mp4') # 動画を保存

CartPoleを実行するところを実装します。
今回はきちんとした制御をせず、ただランダムに左右動かします。

gym.make()はOpenAIの実行環境を立ち上げる関数です。
環境を実行するとき一番最初にenv.reset()をコールしておきます。
env.step()はゲーム環境を1step進める関数で、引数に0を渡すと左に、1を渡すと右にカートを移動します。

返値は次の4つを返します。

変数 説明
observation カートと棒の状態
reward 即時報酬
カートの位置が±2.4以内 かつ 棒が20.9度以上傾いてない場合 -> 1
カートの位置が±2.4を超える または 棒が20.9度以上傾いている場合 -> 0
done 終了状態になるとTrue
info デバッグなどの必要情報
1
2
3
4
5
6
7
8
9
# CartPoleをランダムに動かす
frames = []
env = gym.make('CartPole-v0')
observation = env.reset() # 最初に環境のresetが必要

for step in range(0, 200):
frames.append(env.render(mode='rgb_array')) # framesに各時刻の画像を追加していく
action = np.random.choice(2) # 0(カートを左に押す), 1(カートを右に押す)をランダムに返す
observation, reward, done, info = env.step(action) # actionを実行する

変数framesに格納された画像を「3_2movie_cartpole.mp4」に保存します。

1
2
# 動画を保存
display_frames_as_gif(frames)

保存した動画は下記のようになります。

ランダムなので棒はすぐに倒れてしまいます。次回は棒が倒れないように強化学習していきます。


参考 > つくりながら学ぶ!深層強化学習 サポートページ