現状、世の中で最も強い立体四目並べAIを作ることができました。詳しい解説は以下のnoteに掲載します。
https://note.com/qweral/m/mabfb360417ab
なお、本AIで使用した評価関数は一部retsu27様のコードを参考にしました(以下リンク)。
https://retu27.com/scorefour_cpu_nosupport.html
これでも十分強いですが、まだ改善の余地はあるため、今後は機械学習などを利用してさらなる強化を目指します。
コードにいくつかバグを発見しました。
近々定石を使用したコードを公開する予定なので、そのとき一緒にバグ修正版のコードも公開します。
以下のとおりです。
>> cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
>> g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
score4ディレクトリに移動し、makeで実行ファイルを生成する。
>> cd /file/path/score4
>> make
>> ./main
対戦モードなどを選択。
- AI vs AIは0、AI vs Humanは1、研究したいときは2を入力。
- depthは探索の深さ(7がおすすめ)
※偶数を入力するとうまく動かないので非推奨 - 続きからやりたい棋譜があれば入力可能。
入力形式は、「0 15 3 12・・・」のように座標番号の半角スペース区切り。
※researchは、気になる展開などを制限時間フリーで好きな深さで解析するためのものです。対戦するときには使用しなくていいでしょう。
AI vs AI: 0, AI vs Human: 1, research: 2
>> 1
AI先手: 0, Human先手: 1
>> 0
depthを入力。defaultは7
>> 7
棋譜を入力してください(しない場合はreturn):
>> 0 15 3 12 1 2 13
盤面の表示の仕方ですが、直感的な操作感を目指して、下から上に球を積み上げるように面を配置しています。以下を参考にしてください。
座標は0-15までの番号を入力してください。guideをつけてあるのでそれに従ってください。
. . . . z=4
. . . .
. . . .
. . . .
. O . . z=3
. . . .
. . . .
. . . .
. X . . z=2
. . . .
. X . .
. X . .
O O X O z=1
. O . .
. O . .
X O . X
-- guide --
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
-
互いに最善手を打った場合のn手先までの着手予測
探索中に評価値の入れ替わったすべての手に対して、AIの想定する互いの最善手経路が自動で出力されます。
例えば下図では、9手目として深さ9の探索で手「1」がalpha=14.6で最善とされます。このとき、10手目、11手目・・・と後に続く手に関しては「1 9 1 9 8 10 13 10」を想定しているということです。棋譜: 0 15 3 12 1 2 13 9 9: 5.95 >> 9 9 1 2 2 13 13 14 3 2: 5.95 3: 5.95 13: 7.55 >> 13 13 1 2 1 1 2 9 9 12: 7.55 15: 7.55 4: 7.55 6: 7.55 7: 7.55 8: 7.55 10: 7.55 11: 7.55 14: 7.55 5: 7.55 1: 14.6 >> 1 1 9 1 9 8 10 13 10 0: 14.6 Alpha = 14.6 Depth 9: Best action = 1
-
棋譜自動保存機能
勝敗のついた対局(引き分け含む)は試合終了後に自動でcsvファイルに保存されます。 -
棋譜解析コード
kifuディレクトリ下にkifu.pyが入っています。自動保存した棋譜はもちろん、自分で棋譜を入力し、棋譜同士の関係を樹形図で見たりできます。以下簡単な手引です。- 「数字」: 棋譜を入力
座標を3桁の数字で表した、「xyz」という3桁の整数を入れてください。 座標はpythonコードで使用される盤面のとおりです。 - 「list」: リストを入力
入力形式は、「0 15 3 12 1 2 13」のように2桁の座標と半角スペース - 「cpp」: c++用出力 当該の棋譜をC++のAIに入力できるような形式に変換して出力するためのものです。
- 「数字」: 棋譜を入力