👻 詰将棋AI機能を追加する

2021/9/25

👻 詰将棋AI機能を追加する  JS将棋完成とは言ったものの、車輪の再発明に終わった気がして、何か釈然としませんでした。 世の中には将棋のネット対戦アプリも氾濫しているし、水匠などのすぐれた棋譜分析ツールもあります。 せっかく棋譜の操作が容易になったのだから、もう少しレアな機能を追加してみよかと思いました。


 それで思いついたのが、前から何度か紹介しているまいにち詰将棋です。 ここから盤面や棋譜をダウンロードし、JS将棋に読みこんでは解いたりしていたのですが、その解答をアプリにやらせてみたら面白そうです。

 Javascript は盤面の操作だけにし、主要な解析機能は Perl で行いました。 Javascript のときはいざとなったら、Chrome のデベロッパーツールでデバッグしていましたが、同様のことを Perl デバッガでやろうとすると、慣れないせいもあるのでしょうが、かえって時間がかかります。 結局、ソースの途中に条件と変数を出力する文を書きこむ昔の手法で、トレースしました。 画面出力や CSS、HTMLなど多数の箇所へ注意が分散することなく、文字情報だけをたどるので、それほど苦労することなく作業は終りました。

JS将棋

 ためしに2021年9月16日の詰将棋(3手詰)を解かせてみたところ、1秒かからず解いてしまいました。 青の将棋3手詰などもほぼ解けます(解けないのは合駒が出てきて、本当に詰まるまで5手以上になる場合)。 二歩とか、打ち歩詰めの禁、不成の王手など、次々例外が出てきましたが、合駒問題を除き、いちおう全部対処しました。 いろいろやった結果、5手詰めは6-7割解けましたが、場合によって数十秒かかり、公開するとサーバ負荷がひどくなるのであきらめました。 詰将棋は、攻める側に持駒が2-3個あり、防ぐ側も7種ばかりいつでも使えるため、単純な可能性としては1手の指し方が何百通りかあり、その1つ1つが生み出す次の可能性がまた同数出てくるので、5手だと、1005考える必要が生じる、そして加速度的に処理が遅くなる、というわけです。

 現在は Perl の時間処理関係のパッケージと、Javascript、CGI間の非同期通信機能を使って 2-3秒考えてだめなら処理をやめる仕様にしています。 やっていることは、詰みかどうかを判定する関数を作り、コンピュータに可能な手を全て打たせ、これはどうですかとなったところで判定を下し、よければ採用するというものです。 正解として示す手筋は詰将棋の模範解答とは違うかもしれません。 模範解答は人間のいわば経験からきた恣意が入っているので、そんなことは機械にはできないからです。 また、現状は、先ほども述べたように、全然関係ない、反対側に歩を指すのも軒並み考慮しているという効率の悪さなので、もう少し改善の余地はあります。

付記: もう少し改善し、まいにち将棋5手詰めを制限時間各40秒で解かせたところ、10問中9問までは問題なく解けました(あと1問の提示する解答がちょっとおかしいのが気になりますが……)。

付記2: 最後の1問はかなりの曲者で、プログラムにいろいろ手を入れ、やっと5分で解けるようになりました。 ここで本当に終り、のはずでしたが、アルゴリズム見直しで5秒で解けるようになりました。 これで5手詰めは全て40秒以内には解けるようになったようです。 次は7手詰めですか……最先端のやねうらおうは20手から30手詰めを見ているようですが。

参考: JS将棋

twitterシェア Facebookシェア
  コメントの注意点