jj1gujのブログ

アイコン画像は音速の奇行子 様よりいただきました

遺伝的アルゴリズムを使用したオセロAIの作成最新版

この記事はACCESS Advent Calendar 2024 21日目の記事です。

以前書いた自作オセロAIの解説記事の情報が古くなってきたので最新の解説記事を書きます。

最初に

今回作成したオセロAIとはここから遊べます. 遊びながらこの記事を読んでくれると嬉しいです。

また、リポジトリは以下のとおりです。

github.com

概要

この記事は盤面の評価のパラメータ調整において遺伝的アルゴリズムを適用したオセロAIでくのぼうの最新の解説記事となります。 本記事では情報の更新を目的としているためアップデート内容のみ解説する予定です。 そのため、本記事で触れられていない部分を知りたい場合は前作記事をご覧ください。

jj1guj.hatenablog.com

従来型評価関数の仕様と問題点

従来型の評価関数は以下のように角から行方向または列方向、あるいは対角線方向に4マス分抽出して評価していました。

従来の盤面評価方法

しかしこの評価方法では辺・対角線の評価値は4マス分の評価値の和で表すことができることを前提にしているため正確性に欠けます。

改善方法

そこで以下のように4マスずつ評価するのではなく8マス分を評価するようにしました。これに併せて評価値を加算する回数が変わったため数式のパラメータも調整しました。

アップデート後の評価関数

このように評価関数をアップデートすると問題になるのが対称性の扱いについてです。 従来版では片方が角、もう片方が角でないマスと非対称であったため、以下の左右反転した2つは別々のものとして個別に評価値を割り振っても問題ありませんでした。

しかし今回のように8マス分評価しようとすると両端が角になるため以下の左右反転した2つは同一のものとして、同一の評価値を割り振る必要があります。

そこで遺伝子の初期化・交叉・突然変異時に左端を1の位、右端を1の位としてそれぞれ3進数へデコード→10進数へ変換し、対応するインデックスに格納されている値が等しくなるように書き換えるようにし、対称性を取り扱うようにしています。 上の写真の例ですと左端を1の位とすると $12111 _ {(3)} = 148$ 、右端を1の位とすると $11121000 _ {(3)} = 3348$ となるため、以下のように評価値のパラメータの配列の148番目と3348番目の値が等しくなるように書き換えています。

このように改善することにより従来版よりも強い評価関数が完成しました。(勝率のデータを書きたかったがデータがどこかに行った、、、)

まとめと今後の課題

今回の改善では辺と対角線方向の評価方法を改善し従来版よりも強い評価関数を作成しました。

今後の課題のひとつとして人間のバイアスが加わらない評価関数の作成が挙げられます。

今回の評価方法では辺と対角線を評価して評価値を求めるように人間である僕が指示していますが評価箇所も学習の過程でAIに選択させたいと考えています。 とはいえこれをやろうとするともはや遺伝的アルゴリズムの範囲を超えニューラルネットワークの範囲になりそうでかなり困難であると考えています。

最後に

コントリビュートお待ちしています

github.com