sakurapyon改良点
相変わらず不詰みは遅いので まだまだ改良しないといけないんだけど、とりあえずメモしておく。
移動一手詰を先に調べるようにした
いままでは打一手詰を先に調べて移動一手詰を後から調べてましたが*1、順序を逆にしました。
その結果、持ち駒が多種類あるのに打一手詰では詰まない&移動一手では詰む問題が高速に!.......だけではなくて。
媛No.1〜4はこれだけでも少し高速になりますが、そもそも不詰の問題のコストは一緒です。
(一手詰は何のためにあるのか2にも書いたけど、そもそも大半の局面は一手詰では不詰みなので、不詰みの処理を速くすることが大事だし、速ければもっとあちこちから呼び出せる)。
移動一手詰で得られた情報を打一手詰に流用
打一手詰は桂馬を除いては利きのあるところにしか打てません。そうでないと玉で取られますから。
いままでは打つタイミングで利きを調べていました(利きがあった情報は流用していたけど)。
ところで、sakurapyonの移動一手詰は玉への近傍直接王手しか考えていません。そのため移動一手詰では、玉の近くに移動できるかどうかを必ず調べています。その情報をメモしておいて打一手で流用すれば処理を省けます。
(成れない角が玉頭に来る場合など、玉近傍に移動はできるけど王手にならない場合があり、ムダですがついでに調べてしまいます)
また、この利きは直接利きと間接利きを分けて保存しておきます。間接利きは種別や方向別に細かく分けた方が便利そうだけど、まだ そこまでは手をつけていません。
- 移動王手がかかるのは 利きが重複して2つ以上ある(X-ray含む)なので、先にに利きを全部調べた方が速くなったりするのかな?
打一手詰のときに直接利き・間接利き情報を使う。
移動王手のときに玉周辺の情報は調べましたので、これを打一手詰で流用します。
- そもそも玉周辺にまったく利きが無い場合は打一手を調べるまでもない(桂馬を除く)
- 利きのあるところだけ王手できる
- 直接利きのあるところには玉は逃げられない
- 逃げられる場所(利きが無く、自駒でもない場所)があり、王手駒の利きがそこに及ばないときは不詰み
- 逃げられる場所が1箇所でもあれば桂馬では詰まない
打った駒から得られた情報を流用する
持ち駒が多い場合は特に有効。
- xに駒を打った結果 yの間接利きが止まり 不詰みとなる場合は、yに利きが及ばない駒をxに打っても不詰みである。
- xに打った駒が取られて不詰みになる場合は、何をxに打っても詰まない
守備駒移動による開き王手の確認
- そもそも開き王手にならない場合は高速に調べられる
- 玉の斜め方向に角、縦横に飛車、前方に香車がいるかは低コストで調べられる。まったくいなければ開き王手にはならない
- この情報は流用できるので、最初に一度だけ調べておく
- 玉の斜め方向に角、縦横に飛車、前方に香車がいるかは低コストで調べられる。まったくいなければ開き王手にはならない
- 守備駒に間接利きが及んでいなければ開き王手にはならない
- 事前にPin駒がわかってればもっと楽ですが、今のつくりだと難しいかな...
でもやっぱり遅い
王手がかかる手がたくさんある不詰み局面が遅いですね。媛No.7は特に遅い。
王手候補が多い上に詰まない理由がバラバラなために 情報の使いまわしが利かないのが遅い理由かな...
移動一手が移動先の利きを毎回チェックしてるのも理由だろうなあ。なんとかしたい。