将棋所のponderについて

ひよこカルロ将棋v0.06にponder機能を実装しました。

将棋所で使われているUSIプロトコルなのですがponderの仕様がちょっとややこしかったのでメモしておきます。


・ponder(相手番での思考)をするには、将棋所の対局ダイアログのエンジン共通設定のところにある「相手の手番中に先読み」にチェックを入れる。そうすると思考エンジンに「ponderしていいですよ」という次のメッセージが送られてくる。

setoption name USI_Ponder value true

このメッセージがあるときは、自分が指したあとに相手が指すであろう手をbestmoveコマンドを送るときに付与しておきます。

bestmove 6a5b ponder 4i5h

ここで付与できなければ、次の相手番の思考時間中のponderは無しになります。

ponderの権利を放棄するのは惜しいのでじゃあponderとして何でもいいからつけておけと「ponder resign」などを付与すると、将棋所がバグるのか、自分が投了したことになります。(あれれ?)

ponderのあとに指し手以外の文字列を渡していいのかどうかは規定されていません。
ponderしたければ何がなんでも合法な指し手を渡す必要があります。

ここで合法な指し手が渡せたとします。

そうすると相手の手番中に、こちらに「go ponder」コマンドが送られてきます。いまからponderしていいよというメッセージです。ところが、その局面はさっきの2手先の局面で、自分の手番です。

すなわち「bestmove 76歩 ponder 34歩」と送ると、go ponderの前に送られてくる局面図はこの34歩のあとです。「いやいやいや。そこじゃなくて、76歩と指す前の局面でponderしたいんだけど。ponderの指し手なんてそうそう当たらないし。」という人は、このときに局面図を自力で2つ前の局面に戻さなくてはなりません。

しかし探索ルートを巻き戻すのは連続王手の千日手のカウントなどをすべて元との状態にしないといけないので、結構面倒くさく(例えばBonanzaのunmake_move_root関数)、この実装は結構骨の折れる作業です。

あと初手からponderしたい場合(普通、初手付近は定跡データベースを使うのでしょうから、そういうニーズはあまりないのでしょうけども)もUSIプロトコル仕様では不可能です。これは現局面の2つ先の局面をponderとして送るという設計がおかしい気が少しします。確かにこの仕様で、2つ先の局面だけを調べればいいだけならponderの実装自体は楽なのですが、ponderはなかなか当たらないわけで、そういうことがしたいんじゃないのにと思わないでもありません。


それから、「ponderしていいよ」のメッセージ

setoption name USI_Ponder value true

が来ていないとき(すなわち、"setoption name USI_Ponder value false"のとき)にponderを返すとどうなるか。これもプロトコルには規定されていません。

ponderを返すと将棋所では、「予想手」のところに表示してくれます。これはなかなか気持ちいいですね。ところがponderが的中したときponderhitが送られてきます。いやいやいや。それは送ってこなくていいから!!

ponderhitに対してponderが終わったからとbestmoveを返しますと相手番で指したことになり反則負け扱いになるようです。

規定されていない動作なのでponderが許可されていないときにponderで予想手を返すのがよくないのでしょうけども、それなら予想手を返すコマンドぐらいあってもいいのに…と思わないでもありません。あるいは、ponderが許可されていない状態でponderhitを送ってこないで欲しいなぁと。

ひよこカルロ将棋v0.08を公開しました。

前バージョンからの変更点。
・将棋所で検討モードとして使うと盤面読み込みに失敗して変な手を返していました。修正しました。検討エンジンとして使えるようになったと思います。
・将棋所の古いバージョンだとtime outになってUSIエンジンとして認識されないことがあったのを修正しました。
・各種延長(recapture,one reply,check extension)を追加しました。
・null move→何か指し手→null moveというのをするのを忘れてましたので修正しました。
・ponder(相手の手番でも考える)機能を追加しました
・LMR、うまく出来ていないのでオフにしました。もっと改善が必要のようです。
・静止探索前に枝刈りするようにしました。(駒得だけの評価関数用のfutility pruning。10%程度、探索速度がupしました)
再帰的反復深化をするようにしました。(探索ノード数が半分ぐらいに減りました)
・思考時間調整しました。
・歩で成って王手したときに詰み判定を間違えているパターンがあったので修正。
・将棋所で置換表の使用率が表示されるようになりました。
・なんだか弱いと思ったら置換表が実はずっと使えてなかったことが判明。← 最初からずっと…
・置換表サイズを将棋所のUIから設定できるようにしました。探索速度が速いため、1GB程度ですと10秒ぐらいで使いきっちゃうようなので24GBほど欲しいです…。←メモリ食いすぎ

実は、置換表ずっと使っていませんでした…。

ひよこ将棋/ひよこカルロ将棋は置換表は世代管理しているんですが、この世代番号を置換表に書きこんでいませんでした…。つまりずっと置換表使えてませんでした。置換表を使わずにR1750もあったんですね…。ひよこカルロ将棋、恐るべし…。

それで早速、置換表使うようになおしました。ひよこカルロ将棋v0.08で終盤はずいぶん強くなってきたと思います。一直線に踏み込む将棋は本当に強いです。谷川先生を彷彿とさせます。

しかし序盤がおかしすぎて序盤で損ねた形勢を取り戻せそうにありません。
ゆえにレーティング上はR1600〜1750付近を行ったり来たりです。おまけにしょっちゅう何かバグが発覚してpishogiに負けてレーティングを一気に奪われ(100ぐらい?)ヘコみます。(ローカル環境でデバッグをほとんどしていないのが悪いのですが…)


なかなかコンピューター将棋ソフトの開発というのは大変ですね。

ちなみにひよこ将棋v0.08で置換表のサイズを変更できるようになったので(いままでは48MBで動かしていました。)、floodgateに参戦させているマシンの設定は4GBに変更しました。4GBあっても探索が速いせいか、すぐに置換表があふれてしまうようです。ひよこカルロ将棋には32GBぐらい欲しいです。