第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歩 飛 ・ | 六 |
歩 歩 ・ ・ 歩 歩 歩 ・ 歩 | 七 |
・ 角 玉 ・ ・ ・ ・ ・ ・ | 八 |
香 桂 銀 金 ・ 金 銀 桂 香 | 九 |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- +
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
後手は歩をタダで捨ててしまっているのですが、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金 ・ 歩 歩 | 五 |
歩 ・ 歩 歩 ・ ・ ・ ・ ・ | 六 |
・ 歩 銀 ・ 歩 歩 歩 ・ ・ | 七 |
・ 角 玉 ・ 金 ・ 銀 飛 ・ | 八 |
香 桂 ・ 金 ・ ・ ・ 桂 香 | 九 |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- +
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
▲同歩と取って、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歩 | 三 |
歩 ・ ・ ・ ・ ・ ・ ・ ・ | 四 |
・ ・ ・ 歩 ・ ・ ・ 歩 歩 | 五 |
・ ・ 歩 ・ 歩 ・ 歩 ・ ・ | 六 |
・ 歩 銀 ・ ・ 歩 ・ ・ ・ | 七 |
・ 角 玉 ・ 金 ・ 銀 飛 ・ | 八 |
香 桂 ・ 金 ・ ・ ・ 桂 香 | 九 |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- +
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
私には予想外の手だったのですが、指されてみると後手はつらそうです。
△同桂▲同歩成で後手の飛車が死んでしまい、△63銀▲92と△同香▲同香成で9筋を完全に破って、あとはym将棋がちゃんと寄せてくれました。
昨年は1勝できるかどうか心配だったのですが、今年は初戦で勝つことができたので、精神的に余裕ができました。
*1:最初の1手は先手なら78金、後手なら32金を指すようになっていた