machinelearningゲーム木から回転、対照形を間引く以前から懸案だったプログラム内に保持している局面データの省略をやってみました。言うのも勝ったら報酬を与えて負けたら罰するという強化学習の部分がうまく機能するのか心配だったので放置していたのですが、とりあえず作ってテストしてみると報酬の与え方の部分は変更せずに局面データの変換だけでうまく機能しているようです。|7|8|X|一手目の局面に関して言うと、今までゲーム木データ内に1手目の局面は上のように9種類保持していたのを、回転・対照形を省いて以下の3局面だけ保持するようになっています。め対照2種類)を用意して、ゲーム木データを検索する時にすべての座標変換を試しながら検索して対象の局面を見つけ出し、そこにある報酬データ(score配列)を使って指し手を決め、実際の盤面の座標に変換して駒(×、○)を打ちます。ゲーム終了後には実際の局面からゲーム木データが保持している局面に座標変換して報酬データを書き込むようにします。|X|8|O|1手目は実際の局面を右に90度回転させた局面として見つけ出すことが出来、2手目は上下反転したもの、3手目はまた別の変換というように、一手毎に座標変換の仕方が異なるわけですが、一つの局面データに対して一つしか持ってない報酬データ(score配列)に対して加算(報酬)、減算(罰)していけば問題なく強化学習が進みます。627今回の改良で回転・対照形の局面は同一局面としてプログラム内に一つしか保持しないようにしたのと同時に、マス目が全て埋まっている局面や、既に勝ち負けが決まっている局面もゲーム木データから除いています。右の欄の9手目の局面が0になっているのはそのため(既に勝敗が決まっているから)です。ゲーム木データを格納したファイル(trees.dump)のサイズは50Kバイト程度で今までの10分の1以下になりました。リリース中のandroidアプリにも反映させようと思っているのですが、現行バージョンに採用しているゲーム木を動的に生成する方法1と今回の方法を併用するのは難しいのでデータの互換性は無くなりそうです。従来のプログラムと今回修正したもので改めてデータを取り直して、学習の進捗度をグラフにしてみました。回転・対照形をゲーム木から除いた点以外はまったく同じプログラムで比較しています。三目並べの特性上、完全読み切りを行っている最強プログラムに勝つことは出来ませんが、変更前のプログラムより何割か増しで引分に持ち込む頻度が上がり、学習の速度が上がっていることがわかります。乱数で指し手を決める弱いプログラム相手でも、今までより対戦回数が少ない段階で勝率が上がっていることがわかります。「消える三目並べ」に応用出来るか?前回の記事で「消える三目並べ」(3手前に打った自分の駒が消えるルールの三目並べ)はデータ量が増えすぎて、強化学習型のスマホアプリにするのは難しいと書きました。そこで今回の方法で回転・対照形を省けば保持する局面データ量が減って問題解決に繋がるかといえば残念ながらそうはいきません。これも以前書きましたが「消える三目並べ」は局面(と手番)だけでは最善手が決まりません。将棋、オセロ、囲碁など多くのテーブルゲームは局面と手番が決まれば最善手を決めることが出来ますが、「消える三目並べ」はその局面に至った経過が大事(順列データ)なので単純に今回のように局面データを省略しても駄目そうです2。通常の配列データではなくもっと物理的に小さなデータ(ビットパターン)で局面を保持するしかないかなと考えてますが、これについてはもう少し模索しようと思います。「どうぶつしょうぎ」を完全解析したプログラムは一つの局面を整数データとして(ビットパターンで)保持していたそうですが、有名な将棋ソフトなどもソースコードを追ったことは無いのですが、すべてそうやっているのでしょう。この記事を書いている最中にlibshogiというビットパターンで将棋盤を生成するライブラリがあることをTwitterで知りました。いうライブラリの三目並べ用があればいいのですが、有るわけないですね初回起動時にゲーム木データを生成するやり方だと2分ぐらい待たされるから動的に生成するやり方にしたのですが、データを小さくすることが出来たので初回起動時にデータを作るようにしようと思ってます。↩そもそも前回試しに作った「消える三目並べ」のプログラムは局面の検索に局面データは役に立たないので、指し手の手順を含めたデータを使っています。このプログラムもいずれgithubで公開するつもりです。