第19回世界コンピュータ将棋選手権 1次予選 1回戦

昨年に引き続き自戦記を書いてみます。


1回戦の相手は「デーモン将棋」。
選手権も2度目の参加となると、LAN関係は慣れたもので、さくさくとサーバに接続し対局開始。
デーモン将棋は定跡を持っていないとのことで、先手ym将棋の初手▲76歩に対し△32金。
昨年のym将棋*1を見ているようでしたが、4手目の△62銀の後、局面が進まなくなりました。
ディスプレイを見ると、3手目の▲68玉を指した後予測読みに入り、そのままの状態で止まっているようでした。


審判の方に現状を説明し、デバッグログを確認。
4手目の△62銀をGUI(将棋所)は受け取っているものの、エンジンには渡されておらず、5手目の思考を開始できていないことが判明しました。
原因がその場では分からなかったので、協議の結果やり直しとなりましたが、再び4手目までで停止。
時間的に次のやり直しが最後とのことだったので、予測読みをオフにして再開。今度は先に進みました。


この日帰宅してからプログラムを調べてみて、原因が推測できました。
USIのプロトコルでは、ponder(予測読み)を使用する場合、予測がはずれたらGUIからstop(思考停止)コマンドが送られてきますが、それに対してエンジンはbestmove(最善手)を返す必要があります。
予測がはずれているのだから最善手には意味がないのですが、stopコマンドは「その時点で思考を中断して強制的に指し手を返す」という意味なので、そういう決まりになっているのだと思います。
ym将棋では、GUIとのインターフェースを担当するスレッドAと、指し手を生成するスレッドBがあり、スレッドAがstopコマンドを受け取ると、「スレッドBが既に起動済みであれば」その時点での最善手を返す、という処理になっていました。
「スレッドBが既に起動済みであれば」という判定はスレッドA内のフラグで行っていて、このフラグはスレッドBが起動したときに、B側の処理でオンにしています。
ところが、スレッドA内の処理では、「スレッドBを起動→スレッドBの起動済判定」がほとんど連続しており、スレッドBの起動に時間がかかると、起動済判定の時点ではまだ起動していないと判定され、最善手を返す処理をスキップしてしまった、というのが原因であると考えられます。
この推測が正しければタイミング依存の不具合なので、再現はできなかったのですが、とりあえず起動済判定の前にインターバルを置くようにしようとすると…そこには「少し待つ」とのコメントとともに、50msのインターバルを置く処理が。
この辺は1年以上いじっていないので、記憶にはもうありませんが、昔同じようなことがあってインターバルを入れたのだと思われます。。
結局、「スレッドBが起動するまで待つ」という処理を入れてお茶を濁しました。


対局の方は、20手目の△36歩で評価値が少し先手有利に動きました。

後手:tokita
後手の持駒:なし
  9 8 7 6 5 4 3 2 1
                                                        • +
v香v桂 ・v玉 ・ ・v銀v桂v香
・v飛v金v銀 ・ ・v金 ・ ・
v歩v歩v歩 ・v歩v歩 ・v歩v歩
・ ・ ・v歩 ・ ・ ・ ・ ・
・ ・ ・ ・v角 ・ ・ 歩 ・
・ ・ 歩 歩 ・ ・v歩 飛 ・
歩 歩 ・ ・ 歩 歩 歩 ・ 歩
・ 角 玉 ・ ・ ・ ・ ・ ・
香 桂 銀 金 ・ 金 銀 桂 香
                                                        • +
先手:ymshogi 先手の持駒:なし 手数=20 ▽3六歩 まで


後手は歩をタダで捨ててしまっているのですが、ym将棋はこれを▲36同飛と取ります。飛車で取るのが正しいのかはよく分かりません。とにかく1歩得したので評価値が上がっています。
(5/6追記)▲36同歩だと△19角成がありますね。私の棋力はこの程度です。。


この後40手目で再び評価値が動きます。

後手:tokita
後手の持駒:なし
  9 8 7 6 5 4 3 2 1
                                                        • +
v香v桂 ・ ・ ・ ・v銀v桂v香
v飛v玉 ・v銀 ・ ・v金 ・ ・
・v歩v歩 ・v歩v歩 ・v歩v歩
v歩 ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・v歩v角v金 ・ 歩 歩
歩 ・ 歩 歩 ・ ・ ・ ・ ・
・ 歩 銀 ・ 歩 歩 歩 ・ ・
・ 角 玉 ・ 金 ・ 銀 飛 ・
香 桂 ・ 金 ・ ・ ・ 桂 香
                                                        • +
先手:ymshogi 先手の持駒:歩  手数=40 ▽6五歩 まで

▲同歩と取って、2歩得したことになります。
この時点で、先手がなんか囲いっぽい形になっているのでほっとしていました。
後手は王が端に寄っているものの、金銀が離れていて、しかも隣に飛車がいるという、私から見ても苦しそうな形。
この後、△36金と特攻してきたので、一気に評価が上がりました。
ちゃんと▲56歩と角を追ってから▲36歩で金を頂く。


この後少し進んで次の局面に。

後手:tokita
後手の持駒:なし
  9 8 7 6 5 4 3 2 1
                                                        • +
v香v桂 ・ ・ ・ ・v銀v桂v香
v飛 ・v玉v銀 ・ ・v金v角 ・
金v歩v歩 ・v歩v歩 ・v歩v歩
歩 ・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ 歩 ・ ・ ・ 歩 歩
・ ・ 歩 ・ 歩 ・ 歩 ・ ・
・ 歩 銀 ・ ・ 歩 ・ ・ ・
・ 角 玉 ・ 金 ・ 銀 飛 ・
香 桂 ・ 金 ・ ・ ・ 桂 香
                                                        • +
先手:ymshogi 先手の持駒:歩三  手数=51 ▲9三金 まで 後手番


私には予想外の手だったのですが、指されてみると後手はつらそうです。
△同桂▲同歩成で後手の飛車が死んでしまい、△63銀▲92と△同香▲同香成で9筋を完全に破って、あとはym将棋がちゃんと寄せてくれました。


昨年は1勝できるかどうか心配だったのですが、今年は初戦で勝つことができたので、精神的に余裕ができました。

*1:最初の1手は先手なら78金、後手なら32金を指すようになっていた