-
Static Exchange Evaluation static-exchange-evaluation
static-exchange-evaluation
-
-
添付ファイル
-
変更点
-
ソースを表示
-
表示
# 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)