何手読めば飛車先を受けてくれるのか

今回使った思考エンジンは、評価関数は駒割、探索は単純なPVS(Principal Variation Search)、静止探索は取る手と歩成を4手とリキャプチャーおよび王手回避、置換表あり、前向き枝刈りなし、高速1手詰めなし。シンプルな全幅探索。枝刈りしてないので終盤はほとんど読めない。

1図は▲2五歩まで)

初手から▲2六歩△9二香▲2五歩で1図。結論から言うと、駒割だけの評価関数を使いこの局面で飛車先を受けるためには、7手先まで読む必要がある。

2図は▲2三歩まで △1二香と受けた変化)

飛車先を受ける方法は色々ある。普通は△3二金だが、△3二銀も同じように受けている。また、△1四歩・△4二銀・△1二香といった受け方もある。いずれも、▲2四歩△同 歩▲同 飛△3二金▲2三歩(2図)と進んだときに角の逃げ場所を作っている意味がある。△3四歩も自然だが、横歩を取られて駒損してしまうので、実際の形勢はともかく駒割評価関数的には却下だ。

いずれにせよ、コンピュータがここで挙げたような手を指したなら、正常に動いている状況証拠となる(弱い状況証拠だけど)。「△1二香と指した、バグなんじゃないか」と思う必要はないということだ。

3図は▲2三歩まで)

さて、深さ6で探索した場合、1図から△6二銀などと指してしまう。以下、▲2四歩△同歩▲同飛△3二金▲2五飛という読み筋だ。▲2五飛に代えて▲2三歩(3図)と打つ手も当然読んでいるのだが、評価関数は駒割だけだから、これで後手が悪いことを判断できない。評価値は0で、▲2五飛でチャンスを逃した局面と同じだ。

深さ6から更に静止探索もやっているのだが、△2三同金と歩を取るのは▲同飛成で駒損だから、結局は3図の評価値を返すことになる。静止探索に入った時点で後手番なので、後手が何か取る手(あるいは成る手)を指さないかぎり、先手は何もできないのだ。これはStand-Pat方式の静止探索の欠陥とも言えるが、探索ノード数が少なく簡単で高速というメリットがあり、評価関数でカバーできる部分でもある。

※参考 アッラーの御名において、Stand-Patは気持ち悪い: A級リーグ指し手1号

話が逸れた。まとめると、6手先の3図を評価できない以上、7手読まないと飛車先は受けてくれない。もちろん、深さ6の探索でも偶然△3二金と指すことはある(うっかりぬか喜んでしまう)。でも逆に言えば、そのままの評価関数でもオーダリング(どの手を先に読むか)をいじれば△3二金と指してくれる。7手というのはけっこう長く感じるが、「自分が1図から△6二銀と指す1手」と「3図で何をやっても角が取られることを確認する1手」が加算されているのだ。

補足。2手目△9二香を深さ8まで読んで指した場合、実際は深さ9の探索も途中までやってあることがある。すると、3手目▲2五歩に対して、いきなり深さ1で△3二金を示したりする(普段は△6二銀なのに)。深さ9の探索で△3二金の受けを発見し、それが置換表に書かれていたのだ。単純なことだけど、開発中は「8手しか読んでないのにわかるはずが……」と混乱することもあった。