AI Q学習#5

ゲームコントロール

三目並べエンジン、Q値管理、各プレイヤープログラムと部品は揃った。あとはこれらを制御しながらQ学習を行っていけばよい。クラスMainにplay()関数を実装した。

呼び出し方法

この関数は次の形式で呼び出す。


対戦するプレイヤークラスのインスタンスを配列にし第一引数に設定する。配列の0番目が先攻、1番目が後攻である。第二引数はAIプレイヤーがランダムな手を打つ確率だ。

関数を呼び出すとゲーム終了まで実行される。

プログラム構造

プログラムの構造は次のようなイメージだ。

一見単純な構造のようだが、ここが難解であった。Q値は「ある状態の時に次の行動を行った際の評価値」だ。そしてその評価値の算定に「次の手の最も高いQ値」を利用する。従ってAIプレイヤー、次の手(他プレイヤー)の状態がないとQ値を算定できない。

当初は次のイメージでQ値を更新していた。

これはあきらかに間違いだ。ある状態の行動を評価しなければいけないので、図の状態「121220100」の行動[1][1]が対象となる。正しくは次のイメージで更新しなければいけなかった。

これを実現するためプログラムではAIプレイヤー、その他プレイヤーの状態情報の格納タイミングが違ってきている(下記3行目がAI、7行目がその他プレイヤー用)


これでゲームを行い、Q学習することができる。あとは膨大な学習(試合)を行うように、この関数を何万回も呼び出すようにすればよい。

前へ<ーーー>つづく

タイトルとURLをコピーしました