Hatena::ブログ(Diary)

Bonanzaソース完全解析ブログ

2010-01-05 中合い問題の解説 その1 このエントリーを含むブックマーク このエントリーのブックマークコメント

私の中合い問題(→ http://d.hatena.ne.jp/LS3600/20100101 )の解答をいただいたので、さっそく見ていきます。


中合いについて

http://d.hatena.ne.jp/mclh46/20100104/1262572718

LS3600さんの「新春お年玉プレゼント 詰め将棋問題」を問6まで解いてみました。

問題1)

問題1なのですが、双玉の場合について私は特に書きませんでした。書き忘れていたというのもあるのですが、双玉の場合と、双玉ではない場合と、どちらのケースについても考えて欲しかったからです。


それで、実際問題として、Bonanzaの3手詰めでは、逆王手がかかった瞬間に不詰みという判定をします。逆王手をかけた駒を取って詰むかを調べても良さそうな気もしますが、それはかなり限られた状況なので調べないことになっています。(ただし、利きのない地点への中合いする手は同飛のようにすぐに取り返して3手で詰むかを延長して探索します。)


よってBonanzaの3手詰めを高速化する方法を考える上では、双玉ではないという仮定を入れて良いのです。私の先日の中合い問題は、そのような仮定を入れています。


まあ、それはそれとして、ながとさんの答えを見ていきます。

1一玉→2二金 で一手詰み

これなのですが、1手詰みという場合、OR局面(攻め方)が1手で詰ます場合を言います。3手詰みというのは、OR局面(攻め方)→AND局面(受け方)→OR局面(攻め方)で詰みという形です。この定義からすると、ながとさんの問題1の局面は、AND局面(受け方 = 王手がかかっているほうの手番)からはじまっているので、「1一玉→2二金 で一手詰み」ではなく、これは2手詰みです。


問題2〜5)

たぶん、解答図を見る限り、ながとさんは私の3手詰みの定義のところに書いておいた文を誤解されている気がします。

・攻め方が「間接王手をして」、受け方が、「打ち中合い」をした場合は、攻め方は必ずその駒を最初に間接王手した駒で取ってそのあと「3手で詰む」かどうかを調べます。つまり、打ち中合い→同飛のような場合、その2手は手数に含みません。

いま思うに、「打ち中合い→同飛のような場合、その2手は手数に含みません。」の意味がまぎらわしかったかも知れません。


飛び駒で打ち中合いした駒を取り返して3手で詰むかを調べます。この「3手で詰む」かどうかを調べるというのは、(プログラマにわかる言葉で言うなら)3手詰みルーチンを再帰的に呼び出して調べるの意味でして、すなわち、55歩→同飛→54歩→同飛→53歩→同飛成のように「打ち中合い→取り返す」の繰り返しがあったとしてもすべて手数には含めません。Bonanzaの3手詰みはそのようになっているのです。


3手詰みの定義のなかに3手詰みが出てくるので意味がとりにくかったのだと思いますが、非プログラマの方に伝えるために、そのような書き方にしていました。


問題6)

f:id:mclh46:20100104114420j:image

この図なのですが、AND局面(受け方の手番)からはじまっています。そこで、直前の手は55角だとします。あと2手で詰むかどうかが問題なのですが、例えば、55同角、41飛成で3手消費します。41飛成の局面は普通詰め将棋では詰みの局面ですが、今回の1手詰めの定義からするとこれは詰みではありません。すなわち、

1手詰みは、直接王手 or 両王手によるものでなければなりません。すなわち、間接王手のみの王手は(合駒の問題があるので)1手詰みには含めません。

です。よって、この局面は、55角→55同角→41飛成にて、3手で詰まずです。よって44の焦点の歩があろうがなかろうが3手の範囲で(Bonanzaの3手詰みルーチンでの判定としては)詰まないのです。


そんなわけで、普通の詰め将棋と詰みの定義がやや異なる点が難しかったかも知れません。解答はまだまだ募集しております。コンピュータ将棋の進歩のためにどしどし解答をお寄せください。

mclh46mclh46 2010/01/04 23:02 なるほど。。。
中合いには時間稼ぎ(2手手順を伸ばす)ような意味合いがあるため、中合いには取り返した後でもう一回3手詰めルーチンを呼ぶんですね。
はじめから詰む事が分かっていれば、中合いの後に3手詰めルーチンを呼び出す必要が無くなるため、中合いが省略できる条件が分かると良いという事ですか。
その他言葉の定義や手数のカウント法など大変参考になりました。お年玉になりました!

mozuyamamozuyama 2010/01/04 23:38 問題1についてですが、
攻方:11角、88飛、99角
玉方:21玉、31香、32歩
持駒:香
で、初手29香とすると、2手目28合以外の応手はすべて3手で詰みます。
例えば、11玉には18飛(両王手)、12玉には22角成(直接王手)です。
しかし、28歩合に対しては、5手かかります。(3手目28同飛と取るのは無駄合扱いにならないという理解で正しいでしょうか。)

個人的には、中合を省略できる完全な条件を探すのはかなり難しいのではないかという気がします。ただ、「かなり限られた状況」という理由で逆王手のチェックを省略するのであれば、玉から4マス以上離れた地点に中合をしないと逃れないという状況を無視してしまうという選択もできるかもしれません。

LS3600LS3600 2010/01/05 00:27 >ながとさん
> はじめから詰む事が分かっていれば、中合いの後に3手詰めルーチンを呼び出す必要が無くなるため、中合いが省略できる条件が分かると良いという事ですか。

はい、そうですね。コンピュータ将棋的には、↓↓と捉えたほうがいいかも。

はじめから(玉から4マスより離れた中合いで)詰まないことがわかっていれば、3手詰めルーチンのなかで(玉から4マスより離れた利きのないところへの)打ち中合いの応手を生成する必要がなくなるため、3手詰みルーチンが高速化する。

LS3600LS3600 2010/01/05 00:54 > もずやまさん

素晴らしい!こんな局面が作れるのですね。さすが、もずやまさん!と言わざるを得ません。感動しました。詳しくは明日の日記で改めて取り上げさせていただきます。

問題2)にあるような飛びごまの利きが別の飛びごまの利きと交差するという条件が含まれているところがミソですね。この条件があるときに、そこに中合いする手が何らかの意味を持つことがあるわけですね。

この打ち中合いのような手は、かなり限定された局面でしか出てこないので、もう少し正確な条件がわかれば、実際にコンピュータ将棋の3手詰みルーチンにも取り入れることが出来ると思います。

> 玉から4マス以上離れた地点に中合をしないと逃れないという状況を無視してしまうという選択もできるかもしれません。

それがですね、詰みを「まだ現在の探索深さでは詰まない」と錯覚してもそれほどダメージはないのです。なぜならそこはまだ探索されるので、探索していくうちに詰みが読み切れることがあるからです。ところが、この逆はよろしくないのです。

すなわち、「不詰みなのに詰みだと錯覚」するのは、致命的なのです。なぜなら、「詰み」というのは確定的な勝ち扱いなので、その局面についてはそれ以上深く調べないので、一直線にその変化に飛び込んできて、直前になって詰まない→負け なんてことになるのです。(人間でもそういう錯覚はよくありますが)

ですので、今回のような「(3手で)不詰みを(3手で)詰み」と錯覚するパターンは結構まずいのです。「5手で詰むものを3手で詰む」と錯覚するのは、まだ救いがあるので、もしいろんな中合い局面を調べてみて、そのすべてに対して玉から4マスより離れた地点に中合いすれば3手→5手には伸びるけど結局は詰むよ、ということであれば、「玉から4マスより離れた地点への中合い」は3手詰みルーチンの範疇では調べる必要がないという結論になるのですが…。

そんなわけでですね、もずやまさん、他にもこのような特殊な局面があれば是非教えてください。攻め方の飛びごまの利きが交差するところに中合いしないパターンで、中合いによって3手詰み→5手詰みとなるようなことは、ありえますでしょうか?

hokihoki 2010/01/05 11:29 LS3600 さん、

簡単にできそうな以下の実験をとりあえずやってみました。

中合は同○の王手で再帰的に2手延長していく3手詰みで、王手している駒が1つの王手回避の場合に、以下の条件を満たす枡への中合を無視できるか検証する。但し、中合は受け方の利きが無い枡(pin されている駒の利きは除外)への打ち及び移動。

・斜め方向の中合の場合4以上離れている枡
・縦・横方向の中合で盤の辺沿いでは4以上
・それ以外は5以上

3日間程度5分切れ負けルールで Bonanza 同士を対局させ、この仮定をした場合としない場合で3手詰み関数が異なる結果を返すかどうか検査しましたが、そんな場合は今のところないようです。

このままもう少し走らせてみますが、1週間待っても反例が出現しなければこの仮定を Bonanza にも採用してみようと思います。

hoki

LS3600LS3600 2010/01/05 13:22 > このままもう少し走らせてみますが、1週間待っても反例が出現しなければこの仮定を Bonanza にも採用してみようと思います。

了解です!Bonanzaがまた強くなりますね!!

hokihoki 2010/01/05 22:41 > 了解です!Bonanzaがまた強くなりますね!!

このブログに書かれている情報を参考にしてプログラムを書き直した所、終盤では nps が1割増し程度になる場合があるようです。この調子で改善を進めると、本当に一部 5手詰みまで認識可能になるかもしれません。LS3600 さんにいろいろ教えて頂いて、mate_in3ply() にまだまだ改良の余地があると気づきました。ありがとうございます。

3手詰みを 5手詰みにする改善などは余り華々しい努力ではありませんが、こういう努力をコツコツと積み重ねるのも大切ななずです。。。きっと。

LS3600LS3600 2010/01/05 23:01 > 終盤では nps が1割増し程度になる場合があるようです。

やばい。いつの間にか、保木さんが本気を出されている..(笑)