超シンプルにTensorFlowでDQN (Deep Q Network) を実装してみる 〜解説編① ゲーム (環境) の実装を理解する〜

2016/12/17 | #強化学習  #DQN  #TensorFlow  Shinpei Kawahito 

今回から、実装編についてお届けします。
本記事では、学習させるゲーム (環境) の部分について、解説します。

対象とするソースコードは下記となります。
https://github.com/algolab-inc/tf-dqn-simple/blob/master/catch_ball.py

それでは早速いってみましょう。

ゲームの概要

おさらいになりますが、ゲームの概要としては、上図のように上から落ちてくるボールをキャッチする、というものになります。キャッチできれば+1点、キャッチできなければ-1点というルールで高得点を目指します。

データの持ち方

ゲーム盤は下図のように 8 x 8 の2次元配列で表現しており、「ボール」および「プレイヤー」を1で、背景を0の値として格納しています。

上記の状態の場合、各種インスタンス変数の値は下記となります。

変数名 説明
screen_n_rows 8 ゲーム盤の方向の長さ
screen_n_cols 8 ゲーム盤の横方向の長さ
ball_row 0 ボールの縦方向の位置
ball_col 6 ボールの横方向の位置
player_row 4 プレイヤーの左端の横方向の位置
player_length 3 プレイヤーの横方向の長さ

ゲームの更新処理

続いて、ゲームの更新処理を行うupdateメソッドを見ていきましょう。

引数

updateメソッドは引数としてactionを受け取ります。actionはプレイヤーの行動を表すもので、0,1,2のいずれかの数値で表現しており、それぞれ「何もしない」「左に動く」「右に動く」ことを示します。

プレイヤーの位置の更新

プレイヤーの位置を更新しています。ゲーム盤からはみ出さないように制御しているのがポイントです。

ボールの位置の更新

こちらは単純に、下に1つずらすという処理をしています。

得点判定

ボールがゲーム盤の下端に来た時に、ゲーム終了フラグをセット (self.terminal = True) した上で、得点判定処理を行います。プレイヤーの範囲内にボールがあればキャッチできたとみなし +1点 (self.reward = 1)、そうでなければキャッチできなかったとして、-1点 (self.reward = -1)、としています。

まとめ

今回は、ゲーム (環境) の部分について、重要な箇所を抜粋して解説しました。
次回は、ゲームを学習する流れについて見ていきます。

著者紹介
阪神タイガースと天下一品が好きなエンジニア。