/Nats-reversi

αβ法を使用したスタンダードなオセロAI

Primary LanguageC++MIT LicenseMIT

Nats

ENGLISH FOLLOWS JAPANESE TBD

Natsとは

オセロ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文字の文字列][手番]

盤面の文字列の座標は、左からa1b1c1、…、a2b2、…h8の順番で並べます。

各文字について、黒石は0XxBb*のいずれも使用可能、白石は1OoWwのいずれも使用可能です。空きマスは-=.の使用を想定していますが、黒石、白石に使用されていない任意の1バイト文字が使用可能です。

手番は黒なら黒石を表す文字のいずれかを、白なら白石を表す文字のいずれかを入力してください。

入力例として、初期局面からf5d6と着手した様子を以下に示します。

...........................OX......OXX.....O....................X

出力

探索結果は以下の形式で標準出力に出力されます。

[選んだ手] [評価値]

選んだ手はf5d6など(英字は小文字)の形式です。評価値は整数値です。例として初期局面から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に記述してあります。

cell_weight

探索の詳細

探索はαβ法を用いています。

高速化に大きく寄与するmove ordering(着手順序付け)や並列化は行っていません。

探索の詳細はsearch.hppおよびai.hppに記述してあります。

ライセンス

このオセロAIはMITライセンスで公開します。自由に改造・流用して自分のオセロAIに組み込んで構いません。