どうぶつしょうぎの完全解析プログラムを改造した3三将棋の完全解析プログラムを、一般の9マス将棋に対応させた。
https://github.com/9-square-shogi/dobutsu
dobutsu.hの26行目から31行目の初期局面を変更し、make && ./makeAllState && ./makeWinLoseで任意の駒の種類の9マス将棋を完全解析できる。
make checkStateして、init.txtに局面を入力し、./checkState init.txtで特定の局面の解析結果を表示できる。
makeWinLose.ccの連続王手の千日手を反則とする処理にバグがあるかもしれない。
初期局面を変更せずに、次のようなシェルスクリプトをdobutsuディレクトリと同じディレクトリで実行すると、約9時間半で3~6駒(玉を除けば1~4駒)の9マス将棋を全パターン完全解析し、最長手数の局面を求められる。(gem install partitionsが必要)
#!/bin/bash
for p in $(ruby -rpartitions -e ‘(1..4).each{|n| n.partitions{|p| [*p, *[0]*(7 – p.length)].permutation.uniq.each{|p| puts p.join("") } } }’)
do
echo $p &&
cp -r dobutsu $p &&
cd $p &&
perl -0777 -i -pE ‘s/0000000/’$p’/’ dobutsu.h &&
make -s &&
time ./makeAllState &&
time ./makeWinLose > output.txt &&
time ./longestWin > longest.txt 2>&1 &&
cd .. &&
mv $p $(perl -E ‘($_ and print qw(r b g s n l p)[$i], $_), $i++ for reverse split //, "’$p’"’)
done
6駒以下の9マス将棋の最長手数の局面は、以下の角金銀歩の67手の局面のようである(左右反転を同一として2通りあるうちの1つで、先手の持ち駒は金、後手の持ち駒は角)。
-GI . +OU
. . .
. +FU-OU
0000100
0000010
+
このプログラムでは遅すぎて、個々の9マス将棋はなんとか完全解析できるものの、7駒の9マス将棋は2、3日では全パターン完全解析できなかった。
n駒の9マス将棋の駒の種類の組合せの数は、玉以外の7種類の駒から(n – 2)個を選ぶ重複組合せとなるので、
7H(n – 2) = (n + 4)C6 = (n + 4)C(n – 2)
と表せるようだ。
Wolfram Alphaによると、n ≥ 2での値は次のようになる。
1, 7, 28, 84, 210, 462, 924, 1716, 3003, 5005, …