USIプロトコルのponderの仕様と稲庭対策のこと

昨日の記事に対して将棋所の作者様から直々にコメントをいただいたのでお答えします。

相手の正確な残り時間がわからないということですが、そもそも何のために知りたいのでしょうか。相手の残り時間を知って、それをどういうふうに使うのか、少し考えてみましたが使い道がわかりませんでした。

将棋所の作者様は、非常にクレバーな、頭のいい方だと私は理解しています。将棋所は、必要ならば取り入れるし、自分が不要だと思うものは誰かがいくら要望したところで一切取り入れない。そういうポリシーだと理解しています。一流のソフトウェアというのはそのような頑な意志の存在なくして成立しません。

そこで、私のほうとしましても「いるから、いるのだ!!」ではなく、何故必要なのかについて、納得していただけるような、論理的な説明をしなくてはなりません。しかし、それは結構大変なことで、非常に長文となりますが、お許しいただきたく思います。


まず、コンピューター将棋界には稲庭戦法という相手の時間切れを狙う戦法がウイルスのように流行しております。私は最初、単なるウケ狙いの戦法かと思ったのですが、Bonanza4にも通用しており、世界コンピュータ将棋選手権の決勝でもちらほらと見かけるようになりました。(例えば、今年の大会でのponanza vs 激指)

そこで大会で決勝で勝ち残るためには、すべてのコンピューター将棋の開発者にはこの稲庭戦法への対策を余儀なくされているのが実情です。例えばBonanza6では、稲庭対策のコードが追加されております。普段はオフにしてあるのですが、大会出場用に(コンパイルオプションを変えて)ビルドすれば、稲庭対策を発動します。

このときの前提条件が、「20手を過ぎて相手が歩を一切進めていない」(iterate.cに記述)というものでして、そしてこの条件に当てはまったときには、稲庭用の特別な評価関数(evaluate.cのinaniwa_score)が呼び出されます。この評価関数で、中央に向かって跳ねて行った桂と、5筋の歩が進んでいくことに対して加点してあります。要するに5筋を突破しやすくするための対策ですね。

Bonanza6に対して稲庭対策のコードが入っていることについては、もしかしたら私がこのブログで書くのが初めてかも知れません。あまり話題にはなっていないと思います。しかしコンピューター将棋開発者ならば、みんな稲庭対策には苦慮していて、たとえばBonanzaの稲庭対策の発動条件がわかっているのでわざと20手目まで自陣の歩を突かず、無駄に桂を跳ねさせて、この桂をタダ取りしてしまおうという「稲庭対策の対策」みたいなものも成立するかも知れません。


ともかく、そのように稲庭対策が決勝で勝ち残るコンピューター将棋のための必須課題となっているのが現状です。このときに、(大会に将棋所を使って参加しているとして)相手の正確な残り時間を調べたいということは十分考えられます。

「相手が残り時間を消費しているなら稲庭戦法ではないな」だとか、「相手が自分より残り時間を残していないならば稲庭戦法で来られても大丈夫だな」だとか、そういう相手の持ち時間を考慮に入れた思考時間制御がしたいかも知れません。(このへんはそれぞれの開発者ごとに考え方が違うと思いますが、そういうことをしたい人もいるかも知れないという話です。)

そのときにサーバータイム(サーバー側の計測値)で相手が直前の指し手で何秒使ったのかというのを知りたいというのは十分に考えられます。


あと将棋における思考時間制御は非常に難しく、一言で言うと現在のノードが安定しているノード(取り合いなどが少なく、探索することによって評価値が変わりにくい)なら早めに思考を切り上げ、さもなくば思考時間を投入するというのが基本方針ではあるのですが、このときに相手の残り時間との正確な差がわかれば、「これくらい形勢が開いていれば、こちらのほうが思考時間も少ないことだし少しぐらい早く指して形勢互角ぐらいに戻ったとしても仕方ないだろう」のような判断が出来ます。そういうタイプの思考時間制御をしたい人がどれくらい開発者のなかに居るのかはわかりませんが、ともかく、そういう形の思考時間制御もアリです。(私はそういうタイプの思考時間制御をしようと思っています。)

これは、チェスクロックを用いて人間vs人間で将棋を指すのに慣れている人ならば、そういう感覚を理解してもらいやすいと思うのですが、相手のほうが時間を残している場合、終盤で逆転されかねないので、同じぐらいの棋力であれば、序盤はサクサク指したほうが得だというのはあります。(序盤でそこまで致命的には形勢を損ねにくいので)

同様に、コンピューター将棋の思考時間制御においても、相手の持ち時間を見て、それをもとに自分の考慮時間を決めるという方式は結構理にかなっていると思います。

これらがサーバータイムでの相手の消費時間を知り合いという理由です。



以下、USIプロトコルについての要望。


それはそうと、ひよこ将棋やSunfishの作者が書いている、「現局面からponderさせてもらえる機能」みたいなものは欲しいです。「bestmove XXX ponder YYY」のYYYを省略した場合、現局面を思考エンジンに送ってきてもらって、go ponderコマンドが送られてくると非常に良いのですが。(そのあと相手が指したときに、stopコマンドとその局面とgoコマンドが送られてくれば。)