Improving

Improving は、現在局面の静的評価が 2 手前や 4 手前に比べて改善しているかどうかを表すフラグ、またはその連続量である。 現代的な探索では、Late Move ReductionsReverse Futility Pruningなど多くのヒューリスティクの調整材料として使われる。

概要

単純な発想としては、

  • いまの静的評価が 2 手前より良くなっている

なら、局面は前向きに進んでいる可能性が高い。 逆に悪化しているなら、守勢や不安定化が起きている可能性がある。

この情報を使うと、

  • improving なら pruning を少し弱める
  • non-improving なら reductions を少し強める

といった調整ができる。

実装例

bool improving(const SearchStack* ss) {
    if ((ss - 2)->staticEval != SCORE_NONE) {
        return ss->staticEval > (ss - 2)->staticEval;
    }
    if ((ss - 4)->staticEval != SCORE_NONE) {
        return ss->staticEval > (ss - 4)->staticEval;
    }
    return true;
}

最近は真偽値だけでなく、 差分をなめらかに積み上げる dynamic improving も使われる。

何に効くか

Chessprogramming Wiki でも示されているように、Improving は

などの調整に使われる。

直感的には、 局面が改善しているなら tactical な芽を見逃したくないので少し慎重にし、 改善していないなら選択性を強めてもよい、という考え方である。

将棋AIでの位置づけ

将棋では王手や受け、成り、打つ手によって静的評価が急変しやすい。 そのため Improving は万能ではないが、 「今の局面の流れ」を見る軽量な指標として使いやすい。

注意点

  • 静的評価そのものが不安定だと Improving も当てになりにくい
  • 王手中は static eval を持たない実装も多い
  • 単純な真偽値だけでは荒すぎる場合がある

関連項目

参考にしたホームページ