深層強化学習 ブロック崩し(breakout)をランダム操作

OpenAI Gym に用意されている環境の1つブロック崩し(breakout)を実行してみます。

まずbreakout-v0を実行するために、次のコマンドを実行します。

1
2
pip install --no-index -f https://github.com/Kojoley/atari-py/releases atari_py
pip install opencv-python

使用するパッケージをインポートします。

1
2
3
4
5
# パッケージのimport
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import gym

ブロック崩し(Breakout-v0)を指定して環境を作成します。

1
2
3
# ゲームの開始
ENV = 'Breakout-v0' # 使用する課題名
env = gym.make(ENV) # 実行する課題を設定

ゲームの状態と行動を把握するためのコードを実行します。

1
2
3
4
5
6
7
8
# ゲームの状態と行動を把握
# 状態
print('状態', env.observation_space)
# Box(210, 160, 3)

# 行動
print( env.action_space)
print('行動', env.unwrapped.get_action_meanings())

実行結果1

  • 状態 env.observation_space は縦210ピクセル、横160のRGB情報です。
    CartPoleのような物理情報ではなく画面そのものが状態となっているのがポイントです。
  • 行動 env.unwrapped.get_action_meanings() は次の4種類となります。
    1. NOOP : 何もしない
    2. FIRE : 玉を発射
    3. RIGHT : 右へ移動
    4. LEFT : 左へ移動

試しに初期状態の画面を表示してみます。

1
2
3
# 初期状態を描画してみる
observation = env.reset() # 環境の初期化
plt.imshow(observation) # 描画

実行結果2

画面上部に表示される数字の意味は下記の通りです。

  • 左の数字 : 得点
  • 中央の数字 : ライフ(残機)
  • 右の数字 : プレイヤー数/チーム数(今回は無視)

動画ファイルを保存する関数を定義します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 動画の描画関数の宣言
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('7_1breakout.mp4') # 動画ファイルを保存する

ランダムに行動し、その様子を動画ファイルで保存します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
frames = []  # 画像を格納していく変数
observation = env.reset() # 環境の初期化

for step in range(1000): # 最大1000エピソードのループ
frames.append(observation) # 変換せずに画像を保存
action = np.random.randint(0, 4) # 0~3のランダムな行動を求める
observation_next, reward, done, info = env.step(action) # 実行

observation = observation_next # 状態の更新

if done: # 終了したらループから抜ける
break

display_frames_as_gif(frames) # 動画を保存と描画してみよう

出力される動画ファイル 7_1breakout.mp4 は下記のようになります。

以上で、ブロック崩し(Breakout)をランダムに動かすことができました。
次回はこの環境に強化学習を適用します。


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