yaneurao / YaneuraOu

YaneuraOu is the World's Strongest Shogi engine(AI player) , WCSC29 1st winner , educational and USI compliant engine.
GNU General Public License v3.0
524 stars 140 forks source link

weak_mate_n_ply()の「!effected_to(them, to)」 #11

Closed tttak closed 8 years ago

tttak commented 8 years ago

N手詰めについて、もしまだ作成途中でしたらすいません。 weak_mate_n_ply()の if ((around8 & to) && effected_to(us, to) && !effected_to(them, to) ) について、近接王手なのでtoには必ず相手方の玉の利きがあるためeffected_to(them, to)がtrueになり if文全体としては必ずfalseになってしまうように思うのですが、いかがでしょうか?

yaneurao commented 8 years ago

うおー。そうでした…(´ω`) 修正しておきます。

yaneurao commented 8 years ago

あと、受け方が王手回避で逆王手になったときに、これは詰みを逃れているという判定にする必要があって、以下のようにコードを修正したのですけど、3手詰めを入れるとメモリを破壊しているのか、undo_move()で落ちるようになりました。原因を調査している時間がないので…何かわかったら教えてください。(他力本願)

        for (auto m2 : MoveList<EVASIONS>(*this))
        {
            // この指し手で逆王手になるなら、不詰めとして扱う
            if (gives_check(m2))
                goto NEXT_CHECK;
yaneurao commented 8 years ago

legal()判定忘れてました(´ω`) 修正しておきました。

tttak commented 8 years ago

修正後の下記の部分、「!」が足りないような気がいたします。 「敵玉以外に敵の利きが無ければ」だと思いますので...

// toに利かせている駒から玉を取り除いて、toに利かせている駒があれば。 (attackers_to(them,to,pieces()) ^ king_square(them))

yaneurao commented 8 years ago

うおー、ほんまですね!私の日本語が不自由でした(´ω`) その不自由な日本語をそのままソースコードに落として間違ったコードになってました。申し訳ない。時間なくてテストしてないもんで…。

tttak commented 8 years ago

電王トーナメント直前のお忙しいところ、度々の追記になりましてすいません。 もしN手詰めはそれほど重要ではない場合は無視してください。

weak_mate_n_ply()は「利きのある場所への取れない近接王手からのN手詰め」とのことですが、 味方の利きのeffected_to(us, to)についても意図と異なる結果になっているように思えてきました。

 ・駒打ち以外の移動手の場合、toには移動した駒の利きがあったはずなので、effected_to(us, to)は常にtrueになってしまう。   → attackers_to()の結果からfrom_sqを除外する。  ・飛車先の歩を突いた場合など、長い利きの影の利きを考慮する。   → from_sqを除外したoccupied bitboardをattackers_to()に渡す。

LONG_EFFECT_LIBRARYを使う場合を含めて、effected_to(us, to)の部分は以下のように書き換えられるかと考えましたが、いかがでしょうか? もしバグがありましたらすいません。

#ifndef LONG_EFFECT_LIBRARY
    (is_drop(m) ? effected_to(us, to) : (attackers_to(us, to, pieces() ^ from_sq(m)) ^ from_sq(m)))
#else
    (is_drop(m) ? effected_to(us, to) :
        board_effect[us].effect(to) >= 2 ||
        (long_effect.directions_of(us, from_sq(m)) & Effect8::directions_of(from_sq(m), to)) != 0)
#endif
yaneurao commented 8 years ago

うおー。ほんまですね。修正します(´ω`) ご指摘、感謝!! N手詰め入れて、強くなるのかどうかはよくわからんですが、npsだだ下がり(10%ぐらい下がる?)なので、たぶん弱くなります…。