現状、世の中で最も強い立体四目並べAIを作ることができました。詳しい解説は以下のnoteに掲載します。
https://note.com/qweral/m/mabfb360417ab
なお、本AIで使用した評価関数は一部retu27様のコードを参考にしました(以下リンク)。
https://retu27.com/scorefour_cpu_nosupport.html
2025/5/4
定石打ちを実装しました。
立体四目並べの理論をもとに、盤面のパターン認識を実装するなど、評価関数の改善をしました。
詰み手順を正確にするためにダブルリーチの得点を10,000から5,000に変更しました。
詰み検出がうまく動作しないバグを修正しました。
researchモードで探索がうまくいかないバグを修正しました。
これでも十分強いですが、まだ改善の余地はあるため、今後は機械学習などを利用してさらなる強化を目指します。
現在公開していてるMCTSを利用したAIの改善も含めて強化していきたいです。
以下のとおりです。
>> 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
-
定石打ち
詳細は、/score4/kifu/README.md
を参照ください。
特に序盤における定石打ちができるようにしました。
定石には2種類あります。
1つ目は過去の対戦結果を記録したものを参考に、自動で生成される定石です。
ゲーム終了時に毎回、棋譜を保存しますか?ときかれます。これに対して、yesと答えると棋譜が保存されると同時に解析が行われ、条件を満たしたものについてはcreate_kifu.py
によって定石が生成されます。
条件は、create_kifu.py
で変更できます。
現在は、定石として認めるための最低対局数を5回と設定しており、対局終了時の残りの空きマスの数を棋譜のスコアとして採用し、スコアの高いものを定石としています。2つ目は人間が作った定石です。
こちらは、human_made_book.csv
で定義されており、自由に追加・変更することができます。
今回は最もよく使われる定石の1つだけ格納してあります。 -
互いに最善手を打った場合の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に入力できるような形式に変換して出力するためのものです。
- 「数字」: 棋譜を入力