# Static Exchange Evaluation

Static Exchange Evaluation(SEE)は、ある升で駒の取り合いが続いたとき、最終的な損得がどうなりそうかを静的に見積もる手法である。
[静止探索](/shogi/shogiwiki/search/quiescence-search/)や[手の並べ替え](/shogi/shogiwiki/search/move-ordering/)でよく使われる。

## 概要

駒取りの手があるとき、

- 本当に得な取りなのか
- すぐ取り返されて損なのか

を判断したい場面が多い。

SEE では、ある升に対して

1. 最も安い駒から順に取り返すと仮定する
2. 駒得の増減を交互に並べる
3. 最適応手を前提に後ろから畳み込む

ことで、その取りの損得を近似的に求める。

## 何に使うか

- 悪い駒取りを後ろに回す
- [静止探索](/shogi/shogiwiki/search/quiescence-search/)で明らかに損な取りを除く
- [futility pruning](/shogi/shogiwiki/search/futility-pruning/)や delta pruning の補助に使う

## 実装例

単純化した擬似コードは次のようになる。

```cpp
int see(Position pos, Square sq) {
    int gain[MAX_SWAP];
    int depth = 0;

    gain[depth] = pieceValue(pos.pieceOn(sq));

    while (hasAttacker(pos, sq, pos.sideToMove())) {
        Move capture = leastValuableAttacker(pos, sq, pos.sideToMove());
        doMove(pos, capture);
        ++depth;
        gain[depth] = pieceValue(capturedPiece(capture)) - gain[depth - 1];
    }

    while (--depth > 0) {
        gain[depth - 1] = -std::max(-gain[depth - 1], gain[depth]);
    }

    return gain[0];
}
```

実際には pin や成り、将棋特有の利きの更新も考える必要がある。

## 将棋AIでの位置づけ

将棋では、

- 大駒の取り合い
- 歩や香の安い駒からの取り返し
- 成りを伴う取り

が多く、単純な `駒を取る手だから良い` という判断では不十分である。
そのため SEE は、特に捕獲手の品質管理に役立つ。

## 注意点

- SEE は戦術探索そのものではないので、王手や詰み筋は扱えない
- pin や X 線の利きを正しく扱う必要がある
- 将棋では持ち駒化や成りの扱いがチェスより少し複雑になる

## 関連項目

- [静止探索](/shogi/shogiwiki/search/quiescence-search/)
- [手の並べ替え](/shogi/shogiwiki/search/move-ordering/)
- [futility pruning](/shogi/shogiwiki/search/futility-pruning/)
- [delta pruning](/shogi/shogiwiki/search/delta-pruning/)

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

- [Chessprogramming Wiki: Static Exchange Evaluation](https://www.chessprogramming.org/Static_Exchange_Evaluation)
- [Chessprogramming Wiki: Quiescence Search](https://www.chessprogramming.org/Quiescence_Search)
- [Chessprogramming Wiki: MOVE Ordering](https://www.chessprogramming.org/Move_Ordering)