AI Q学習#3

Q値更新

Q学習のメイン、Q値を管理しているプログラムをみていく。

テーブル構造

Q値を管理するテーブルはPythonのdict(辞書)機能により実現している。この辞書機能はいわゆる連想配列であり、キーワードにより値を照会、設定できる。プログラムでは9行目で定義している。

キーワードは前回(AI Q学習#2)紹介した、棋盤情報を文字列化したモノを利用する。これにより棋盤の全パターンの情報を辞書として登録できる。

このキーワードから取得されるデーターが行動毎のQ値である。三目の並べの行動は「マス目に手を打つ」ことから、行動数は最大9(3×3)となる。

データを3×3の二次元配列にしたが、9の一次元配列にした方がハンドリングしやすかったと反省している。

キー作成、データ初期化は関数get()で行っている。

引数のキーワードからデータ(Q値)を返す関数だが、キーワードが登録されてないならキーワードを作成しデータを初期化する。

ここで問題が発生した。上記の状態だと既に6箇所に手が打たれている。そのため次の行動は3箇所と限られているので、6箇所分のQ値は不要だ。当初はそのまま0を設定していたが、デバックを行うにつれこの0が悪さをしていることに気付いた。そこで不要なQ値へ最低値を設定するようにした。

Q値更新

Q値の更新を行っているのが関数cal()である。

この計算は以前(AI Q学習)紹介した数式をプログラム化している。数式と若干違うところは、「次の手のQ値最大値取得」だ。デバックを進めていくと「次の手のQ値最大値取得」ができない、取得しても無駄な場合があることがわかった。

まずAIが勝利した場合は次の行動は無いので値は取得できない。次に相手が勝利した場合は「次の手のQ値最大値」は必ず0になるので無駄とわかった。そこで、50行目のif文で「次の手のQ値最大値取得」を行うかの分岐を行っている。


前へ<ーーー>つづく

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