Stockfish DD – movegen 指し手生成

今回はStockfishの指し手生成についてです。チェスと将棋では駒の特性が全く違うので、チェスを将棋に変更する場合、この部分は全面的に書き直しが必要となります。

面白いことにチェスではポーン(pawn = 将棋で言う歩)以外は移動に上下の対称性があるので先後の区別がありません。先手も後手も盤上で同じ動きをするので、将棋のように先手用の指し手生成と後手用の指し手生成とを分ける必要がありません。

将棋のほうは先後で駒の移動特性が違う(180度回転させれば同じなんですが…)のと成り駒の移動として金相当になる駒以外に馬と龍という新たな移動特性を持つ駒が生まれるので、将棋のほうが指し手生成は3倍ぐらいソースコードを書くのがしんどい感じがあります。(体感的には)

あとは3手詰めや詰将棋ルーチンを用意するなら指し手生成として王手の指し手のみ生成するコードも用意しないといけません。Stockfishの指し手にはそれは無いのです。(ソースコード上のGenTypeを見ればわかります。指し手生成の実装部には王手のみを生成するコードがあるのですが、純粋な王手だけの指し手を生成するgenerate関数は用意されていません。ゆえに探索部から呼び出されていません。) 従来の将棋ソフトの常識からするとちょっと信じられないですが、まあ、そうなっているということです。

またbitboardを用いて指し手生成をしてありますが、なのはminiのように非bitboard型で持っているなら、Stockfishの指し手生成部のソースコードは何の役にも立たないので一から自分で書く必要があります。

指し手生成の速度は結構利いてくるので、ここをきちんと書けるか否かで探索速度が2,3割変わってきます。まあ2,3割しか変わらないなら上位ソフト以外は関係のない部分とも言えますが、上位ソフトでは絶対に譲れない部分なので極限まで最適化しましょう。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です