やねうら王が攻略された?


今回の電王戦の対戦相手である佐藤紳哉六段のニコ生の放送によると、やねうら王の攻略の糸口がつかめたそうな。(見るのが怖くてタイムシフト予約してあるものの放送は見てません。) ちょっと様子を偵察するため、来週末以降で、一度、佐藤紳哉六段に会いに行こうかと勝手に思っています。(最悪、アポ無しで…)


一般的に言って、コンピューター将棋を強くするというと、探索の改良とか評価関数の改良、棋譜からの学習メソッドの改良、高速化などが真っ先に挙げられる。それらはまあそれとして、地味に利いてくるのが一手詰めである。Bonanzaの1手詰め判定は、近接王手からの一手詰めのみ。近接王手でその駒を取り返せず、玉の逃げ場がないとき、これを一手詰めとする、みたいな定義である。


ところが、本来、将棋の一手詰めはもう少し広義である。例えば次のように一手詰めを定義するとしよう。


・攻め方(攻撃側の手番)が1手王手となる手を指して、受け方(詰まされる側)が合法な指し手がなければ詰み。


これは、プログラムが書きやすい。現局面で、すべての合法手を生成して、1手進めて、その局面でまたすべての合法手を生成して、その生成された手がゼロであれば、というようなプログラムを書けば良い。指し手生成ルーチンは当然作ってあるはずだから、このプログラムならば5行ほどで書けるだろう。


この後者の1手詰めは比較的、世間で言うところの「一手詰め」に近い条件である。


ところが、この後者の1手詰めとBonanzaの1手詰めとで判定される集合は一致しない。これは、両王手による詰みや、離し飛車(香)・離し角で手駒がなくて(もしくは歩が二歩でつかなくて)合い駒が出来ずに詰むケースや、開き王手で合い駒が出来ずに詰むケースが漏れているからである。ということは、Bonanza型の1手詰めルーチンを書いてもその検証用に後者の詰め判定を用いて、詰みを逃していないかをチェックすることは出来ない。Bonanza型の1手詰めルーチンが詰むと判定した指し手が本当は詰まない指し手であるかを判定することは出来るのだが。


※ 細かい話をすると詰将棋のルール上は、無駄合いは手数に含めないので、これをきちんと考慮しだすと、後者の「一手詰め」も詰将棋のルールの一手詰めとは判定される集合が異なるのだが、いま、これはあまり問題ではないので考えないことにする。


※ 上の説明、わかりにくいかも知れないので図を追加。1手詰めだと判定される局面の集合を図にすると下図のようになります。


そこで、自分の書いた1手詰め判定が正しいのかを連続対戦により自動検証するためには、1手詰め判定ルーチンで判定される局面の集合をなるべく後者の判定に近づける必要がある。


ところが、これがすこぶる難しい。開き王手をして、その移動させた駒で受け方の遠方駒の利きを遮断して詰むケース(あるいは詰まないケース)などがあり、このへんの条件は非常に複雑でずいぶんコードを書いたのだが、いくらやっても連続対戦による自動検証を完全にパスすることは難しく、結局、書いたコードを丸ごと破棄した。バグが取りきれないと思ったのは生まれて初めての経験だった。(まあ、レアケースを正しく判定できたところで、そんな局面がそうそう出てこないのでチェックするコストのほうが上回るから何でも書けばいいというものでもないのだが)


そのとき思ったのは、人間というのはどうしてこんなに間違いを犯しやすく愚かなのかということだ。


世間では私のことを天才プログラマーだと評する声もあるが*1、天才かどうかはさておき、まあ36年もプログラムをやっていれば馬鹿であれそれ相応の域には達するはずである。その私をして、少し書いては、ランニングさせる→漏れるケースが検出される→修正する→誤って判定される→修正する→ランニングする→漏れるケースが見つかる、みたいな循環から結局は抜けだせなかった。それは3年前のことで、私の当時の記録によるとそのとき1週間ぐらい格闘していたようだ。あともう1週間ぐらいあれば修正できていたのかも知れないが、それにしても、あのとき味わったのは果てしない底なしの闇が襲ってくるような感覚であり、あれにより、どれだけ私の心が粉々に砕かれたことか計り知れない。あんな作業をあと1週間も続けるぐらいなら死んだほうがマシだ。あのときは正直そう思った。


私の知人にナルコレプシーの人がいる。彼は、仕事中にも突然眠くなって寝てしまうのだそうだ。そんな彼は、時間の約束を守れない。寝てしまうかも知れないからだ。「何時までにやります」とか言っても寝てしまうかも知れない。「何時に行きます」と言っても行けないかも知れない。彼は約束を守れない自分に苛立ちを感じ、何度も挫折を味わい、そして最後には自分に対する自信を完全に喪失してしまう。彼が言うには、それはナルコレプシーの人におおむね共通する性格なのだそうだ。


その話を聞いて、3年前の自分は、全く同じ状態だったと思った。何度やってもまた今回も駄目なんじゃないかという恐怖、そして実際にやっぱり駄目だったと無慈悲に知らされる現実。それの繰り返し。それを短期間に何百回と繰り返す。短期間に何百回も自己否定され、何百回も己の愚かさを知る。なんと自分は馬鹿なんだろうか。本当の天才なら、この永劫回帰とも思える循環のなかからいともたやすく抜け出せるのだろうか?それとも、天才と呼ばれるような人なら、このような循環すら楽しみながら何度でも挑戦できるのだろうか。


そんなことを思いながらも、今回の電王戦トーナメント出場のときには、そんな過去の因縁を断ち切り、どうにか完成に漕ぎ着けた。それがやねうら王2013である。時間の都合上、出来なかったことも多々あるが、やれる限りのことはすべてやったので全く後悔はしていない。


佐藤紳哉六段に「やねうら王?強いよね。」と言わせるために、来週末以降、会いに行ってきます!(最悪アポ無しで…)