# Tapered Eval

Tapered Eval は、
中盤用評価と終盤用評価をゲームフェーズに応じて滑らかに混ぜる手法である。
局面段階の変化による評価の不連続を減らせるため、
手作り評価で広く使われている。

## 概要

将棋でもチェスでも、

- 中盤では王の安全や駒の連携が重要
- 終盤では王の活動性や駒の単独性能が重要

になりやすい。

もし中盤評価と終盤評価を完全に切り替えると、
局面が少し変わっただけで評価値が急に飛ぶことがある。

Tapered Eval は、

- opening / middlegame score
- endgame score
- game phase

を使って両者を線形補間する。

## 実装例

```cpp
int taperedEval(const Position& pos) {
    int mg = evaluateMiddleGame(pos);
    int eg = evaluateEndGame(pos);
    int phase = gamePhase(pos);   // 0..256

    return (mg * phase + eg * (256 - phase)) / 256;
}
```

`gamePhase()` は典型的には、
大駒や駒数の残り具合から計算する。

## 将棋AIでの位置づけ

将棋では持ち駒や成りがあるため、
チェスより phase の設計が少し難しい。
それでも、

- [King Safety](/shogi/shogiwiki/search/king-safety/)
- [Mobility](/shogi/shogiwiki/search/mobility/)
- [Piece-Square Tables](/shogi/shogiwiki/search/piece-square-tables/)
- [Material](/shogi/shogiwiki/search/material/)

の重みが局面段階で変わるのは自然である。

そのため、手作り評価を組む際の基本テクニックとして有用である。

## NNUE との関係

[NNUE](/shogi/shogiwiki/search/nnue/) では明示的な tapered eval をそのまま使わないことも多いが、
「局面段階で特徴の意味が変わる」という考え方自体は依然重要である。

また、手作り評価と NNUE を併用する場合には、
一部項目だけ tapered にする設計もありうる。

## 注意点

- phase の定義が悪いと重みづけが不自然になる
- 中盤評価と終盤評価で同じ特徴を二重に数えやすい
- 将棋では持ち駒込みの phase 設計が悩ましい

## 関連項目

- [評価関数](/shogi/shogiwiki/search/evaluation-function/)
- [Material](/shogi/shogiwiki/search/material/)
- [Piece-Square Tables](/shogi/shogiwiki/search/piece-square-tables/)
- [King Safety](/shogi/shogiwiki/search/king-safety/)

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

- [Chessprogramming Wiki: Tapered EVAL](https://www.chessprogramming.org/Tapered_Eval)
- [Chessprogramming Wiki: Evaluation Philosophy](https://www.chessprogramming.org/Evaluation_Philosophy)
- [mediocrechess.blogspot.com: Guide Tapered Eval.Html](https://mediocrechess.blogspot.com/2011/10/guide-tapered-eval.html)
- [arXiv: 1801.07411](https://arxiv.org/abs/1801.07411)