ENGLISH FOLLOWS JAPANESE TBD
オセロAIの強さ・速さの一定指標となることを念頭に作られたオセロAIです。
原始的なマスの重みによる評価関数を使って、原始的なαβ法による探索を行っています。
ある程度基本的なことを押さえると、このオセロAIには強さ・速さの両面で勝利できると想います。
コンパイルは一度行うだけで良いです。
レポジトリをクローンし、srcディレクトリに入ります
$ git clone git@github.com:Nyanyan/Nats-reversi.git
$ cd Nats-reversi/src
コンパイルします。このとき、-o
で設定した出力ファイル名は任意に変更して構いません。
$ g++ main.cpp -o nats.out
実行します。
$ nats.out
このとき、コマンドライン引数で読みの深さ(手数)を設定できます。終盤読み深さについては、終盤の空きマスがその値以下となった場合に完全読みに入ります。
$ nats.out [中盤読み深さ] [終盤読み深さ]
なお、終盤読み深さを省略すると、中盤読み深さの2倍が終盤読み深さになります。
読み深さを設定しないとデフォルト値(中盤4手、終盤8手完全読み)となります。
読み深さに0以下の値を入れるとエラーとなります。
例として、中盤7手、終盤14手読みで実行すると以下のような表示になります。参考情報の出力、および入力受付の"> "は全て標準エラー出力です
$ nats.out 7 14
[I] Nats Othello AI
[I] (c) 2022-2024 Takuto Yamana
[I] depth mid:7 end:14
[I] initialized
[I] input [board as 64 characters][side to move]
[I] example: ---------------------------OX------XO---------------------------X
>
Natsの入力形式の概要は以下です。入力は任意の場所にスペース・改行を入れて構いません。
[盤面を表す64文字の文字列][手番]
盤面の文字列の座標は、左からa1
、b1
、c1
、…、a2
、b2
、…h8
の順番で並べます。
各文字について、黒石は0
、X
、x
、B
、b
、*
のいずれも使用可能、白石は1
、O
、o
、W
、w
のいずれも使用可能です。空きマスは-
、=
、.
の使用を想定していますが、黒石、白石に使用されていない任意の1バイト文字が使用可能です。
手番は黒なら黒石を表す文字のいずれかを、白なら白石を表す文字のいずれかを入力してください。
入力例として、初期局面からf5d6
と着手した様子を以下に示します。
...........................OX......OXX.....O....................X
探索結果は以下の形式で標準出力に出力されます。
[選んだ手] [評価値]
選んだ手はf5
やd6
など(英字は小文字)の形式です。評価値は整数値です。例として初期局面からf5d6
と進んだ後の局面を7手読みで探索した結果の出力を示します。
$ nats.out 7 14
[I] Nats Othello AI
[I] (c) 2022-2024 Takuto Yamana
[I] depth mid:7 end:14
[I] initialized
[I] input [board as 64 characters][side to move]
[I] example: ---------------------------OX------XO---------------------------X
> ...........................OX......OXX.....O....................X
[I] . . . . . . . .
[I] . . . . . . . .
[I] . . . . . . . .
[I] . . . O X . . .
[I] . . . O X X . .
[I] . . . O . . . .
[I] . . . . . . . .
[I] . . . . . . . .
[I] midgame depth 7
[I] time elapsed 1 ms
c5 0
マスによる重みを使った評価関数を作りました。評価値は最終石差の予想値です。重みは以下の図の通りです。作者による独自の重みで、Siv3DサンプルのオセロAI(Natsと作者が同じ)と同じ評価関数です。
evaluate.hpp
に記述してあります。
探索はαβ法を用いています。
高速化に大きく寄与するmove ordering(着手順序付け)や並列化は行っていません。
探索の詳細はsearch.hpp
およびai.hpp
に記述してあります。
このオセロAIはMITライセンスで公開します。自由に改造・流用して自分のオセロAIに組み込んで構いません。