# Improving

Improving は、現在局面の静的評価が 2 手前や 4 手前に比べて改善しているかどうかを表すフラグ、またはその連続量である。
現代的な探索では、[Late Move Reductions](/shogi/shogiwiki/search/late-move-reductions/)や
[Reverse Futility Pruning](/shogi/shogiwiki/search/reverse-futility-pruning/)など多くのヒューリスティクの調整材料として使われる。

## 概要

単純な発想としては、

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

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

この情報を使うと、

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

といった調整ができる。

## 実装例

```cpp
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 は

- [Reverse Futility Pruning](/shogi/shogiwiki/search/reverse-futility-pruning/)
- [Late Move Reductions](/shogi/shogiwiki/search/late-move-reductions/)
- [Null Move Pruning](/shogi/shogiwiki/search/null-move-pruning/)
- move count based pruning

などの調整に使われる。

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

## 将棋AIでの位置づけ

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

## 注意点

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

## 関連項目

- [Late Move Reductions](/shogi/shogiwiki/search/late-move-reductions/)
- [Reverse Futility Pruning](/shogi/shogiwiki/search/reverse-futility-pruning/)
- [Null Move Pruning](/shogi/shogiwiki/search/null-move-pruning/)
- [探索不安定性](/shogi/shogiwiki/search/search-instability/)

## 参考にしたホームページ

- [Chessprogramming Wiki: Improving](https://www.chessprogramming.org/Improving)
- [Chessprogramming Wiki: Reverse Futility Pruning](https://www.chessprogramming.org/Reverse_Futility_Pruning)
- [Chessprogramming Wiki: LATE MOVE Reductions](https://www.chessprogramming.org/Late_Move_Reductions)