電王戦第2局においてSeleneが相手の角不成に対して非合法手を指して反則負けになった件ですが、理由は私には想像つくので、以下に書いておきます。
UCIプロトコルでは、思考を開始する局面は、普通、startpos(平手の初期局面)からの指し手を示す文字列が送られてきます。と言うことは、常識的には、UCI表記での指し手文字列を思考エンジンが内部で使っている指し手構造体に変換する必要があります。ところが、Stockfishにはこの変換をダイレクトに行なう関数は存在しません。さて、どうやっているのでしょうか。
実は、現在の局面の合法手すべてを生成して、それをmove_to_uci( )でそれをUCIの指し手文字列に変換し、それが与えられた文字列と一致したら、そのmove_to_uci( )で変換する前の指し手構造体を返すという実装になっています。少し遅いのが気になりますが、思考開始のときに送られてくるだけなのでこの部分が多少遅くとも誤差の範疇です。
このようにしてUSIの指し手文字列から内部の指し手構造体での形式に変換しているのですが、「現在の局面の合法手すべてを生成して」の部分でSeleneは、角不成を生成してないんですね。ここは、探索中に角不成を生成していなくとも、このときばかりは生成しなくてはならないのですが、それをやっていないのでしょう。
なので、角不成に対応するUSI文字列が送られてくるとそれを非合法手として認識して、そこで局面を進めるのをリタイアしてしまうのだと思います。(その結果、その1手前の局面が探索開始局面として設定されることになるので、何らかの誤動作が生じます。)
今回のやねうら王は、そのへんちゃんとやってます。まあ、自己対戦だとお互い不成を読んでいない&指さないのでなかなか気づきにくいバグではあります。棋譜からの学習のときにちゃんと読み込めていない棋譜がないかをチェックすれば気づくとは思うのですが、西海枝さんは面倒だからそういうチェックはやってなかったのか、たまたま使用している棋譜にそういう指し手がなかなったのか…。
まあ、何にせよ、将棋ソフト界隈ではよくあることでありまして、76歩34歩77角不成)(ただ捨て!)の3手で試合が終了しなくて本当に良かったなぁと、我がごとのように思いました。
76歩34歩77角不成の3手ならさすがに指し直しになるのではないでしょうか?しかも不成禁止で。
まあ、そのときは勝負としてはソフト側の負けとして、そのまま親善試合としてもう一局という感じになるのでしょうかね…。さすがに残りの枠、ずっとスイーツ食べてられませんし(笑)
また、アルゴリズムの地平を見てしまった。
結局何事も配慮の問題になるんですよね。
しかし、将棋所ってただのブリッジかと思ってましたが、ルール把握してるとか意外と高性能なんですね。
指し手の合法性のチェック自体はそんなに大変ではないので…。(15行ぐらいで書けます…)
なるほど!気が付きにくいバグなんですね
>76歩34歩77角不成)(ただ捨て!)の3手で試合が終了
私も納得さんの意見に賛成します。
その場合、多分不成禁止で指し直しです。
永瀬さんもそれが分かってて
やらなかったと思います。
それをしたら永瀬さんに非難が行く可能性があります。
永瀬さんは「半分ぐらいの確率で修正されてるかなと思ってた」とか言ってましたが99%以上の確率で修正されてないと思ってたはずですよ?
だって前回の件があるから修正されてたら棋士に連絡が行くはずでしょう?
ドワンゴが棋士に内緒でバグ修正を許すとは思えません。
というか今回、正当な理由?のバグ修正すら許して貰えなさそうな雰囲気ですよね。
そして永瀬さんに連絡がなかったんです。
だから永瀬さんは不成のタイミングを見計らって
わざとやったと考えるのが自然じゃないでしょうか?
ところでセレネがバグってから1時間ぐらい話し合いが行われてたみたいですけど何を話してたんでしょうね?
気になります。
電王戦ルールでは
「何らかのコンピュータのトラブルがあり、原因がコンピュータ側にある場合: 1.手番において着手が確定
できない場合、その持ち時間を消費してコンピュータ将棋開発者側がトラブル処理を行うこととする。」
とあったので西海枝さんが生放送中のその場でババッとデバッグ・コンパイルして間に合わせるという絵が観れるかもと期待してました。
不成に対応+テストは断念してぶっつけ本番、くらいなら残り時間で対応出来ますよね?
ニコニコ的にも(変に)盛り上がったんじゃないでしょうか(笑
環境を用意してなかったんでしょうけど残念でした。
それとも環境があってもそういうリカバリはルール上不可なのでしょうか?