-
Futility Pruning futility-pruning
futility-pruning
-
-
添付ファイル
-
変更点
-
ソースを表示
-
表示
# Futility Pruning
Futility Pruning は、現在局面の静的評価に安全マージンを足しても `alpha` を超えそうにない手を、
探索しても無駄とみなして省く前方枝刈りである。
[Late Move Reductions](/shogi/shogiwiki/search/late-move-reductions/)や[Null Move Pruning](/shogi/shogiwiki/search/null-move-pruning/)と並ぶ、
選択的探索の代表技術のひとつである。
## 概要
発想は単純で、
- 現在局面の静的評価 `eval`
- その手で期待できる改善量の上限 `margin`
を使い、
`eval + margin <= alpha`
なら、その手を読んでも `alpha` を超えないだろうと見なして枝を省く。
この判断は主に frontier node 付近の浅いノードで使われるが、
近年は深さに応じてマージンを広げる形で非葉ノードにも拡張されている。
## どの手を除外するか
通常は tactical な安全性のため、
- 王手の手
- 王手されている局面の手
- 明らかな captures
は futility pruning の対象から外す。
また、mate 値に近い局面では使わないことが多い。
## 実装例
```cpp
if (!inCheck(pos) && depth == 1) {
int margin = 150;
int futilityValue = staticEval(pos) + margin;
if (futilityValue <= alpha && isQuiet(move) && !givesCheck(move)) {
continue;
}
}
```
実戦的には、
- 深さごとにマージンを変える
- [Static Exchange Evaluation](/shogi/shogiwiki/search/static-exchange-evaluation/)で悪い captures も除く
- move count based pruning と組み合わせる
といった拡張が入る。
## 将棋AIでの位置づけ
将棋は分岐数が大きく、特に quiet move を全部丁寧に読むとノード数が膨らみやすい。
そのため futility pruning は、終端近くの quiet move を大きく減らす手段として有効である。
ただし将棋では、
- 成りによる急激な価値変化
- 王手や受けの一手
- 打つ手による急所の受け
があるため、除外条件はチェス以上に慎重である必要がある。
## 歴史的拡張
Chessprogramming Wiki では、
- Extended Futility Pruning
- Deep Futility Pruning
のような拡張も紹介されている。
また、[Late Move Pruning](/shogi/shogiwiki/search/late-move-pruning/)との関係も深い。
## 注意点
- 王手筋や受けの急所を見落とす危険がある
- 静的評価が不安定な局面では使いにくい
- 終局や stalemate / 千日手相当の扱いを誤るとバグにつながる
## 関連項目
- [Static Exchange Evaluation](/shogi/shogiwiki/search/static-exchange-evaluation/)
- [Late Move Reductions](/shogi/shogiwiki/search/late-move-reductions/)
- [Null Move Pruning](/shogi/shogiwiki/search/null-move-pruning/)
- [Razoring](/shogi/shogiwiki/search/razoring/)
## 参考にしたホームページ
- [Chessprogramming Wiki: Futility Pruning](https://www.chessprogramming.org/Futility_Pruning)
- [www.semanticscholar.org: Efficiency OF Three Forward Pruning Techniques IN HOKI Muramatsu](https://www.semanticscholar.org/paper/Efficiency-of-three-Forward-Pruning-Techniques-in-Hoki-Muramatsu/)
- [GitHub: official-stockfish/Stockfish](https://github.com/official-stockfish/Stockfish/issues/6519)