# 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)