-
Proof-Number Search proof-number-search
proof-number-search
-
-
添付ファイル
-
変更点
-
ソースを表示
-
表示
# Proof-Number Search
Proof-Number Search(PNS)は、
AND/OR 木の根が「証明できるか」「反証できるか」を最小コストで調べる best-first search である。
将棋では特に詰将棋や詰み探索の文脈で重要であり、
通常の [アルファベータ法](/shogi/shogiwiki/search/alpha-beta/) とは役割がかなり異なる。
## 概要
PNS では各ノードに、
- proof number
- disproof number
を持たせる。
概念的には、
- その局面が勝ちだと証明するのにどれだけ手間がかかるか
- 負けではないと示すのにどれだけ手間がかかるか
を数えている。
OR ノードでは「どれか 1 つ証明できればよい」ので最小を取り、
AND ノードでは「全部証明しなければならない」ので和を取る。
この値が最も有望な frontier node を選んで展開していくのが、
PNS の基本である。
## 実装例
教育用に単純化すると次のようになる。
```cpp
while (!root.proven() && !root.disproven()) {
Node* mostProving = selectMostProvingNode(root);
expand(mostProving);
evaluateTerminalChildren(mostProving);
updateAncestors(mostProving);
}
```
更新規則は概ね次のようになる。
```cpp
if (node.isOrNode()) {
node.proof = min(child.proof);
node.disproof = sum(child.disproof);
} else {
node.proof = sum(child.proof);
node.disproof = min(child.disproof);
}
```
## 詰将棋との関係
PNS は、長い詰みや複雑な分岐のある詰将棋で特に有効である。
[アルファベータ法](/shogi/shogiwiki/search/alpha-beta/) のように全体を深さ優先で舐めるより、
「証明に近い部分木」へ集中できるからである。
Chessprogramming Wiki でも、
将棋や詰将棋での応用が明示的に言及されている。
## Conspiracy Number Search との関係
[Conspiracy Number Search](/shogi/shogiwiki/search/conspiracy-number-search/) は、
根の値を覆す難しさを扱う best-first search である。
PNS はその流れの近縁にありつつ、
より「証明問題」に特化した形と見ると分かりやすい。
## 将棋AIでの位置づけ
通常の対局用将棋AIでは、
[アルファベータ法](/shogi/shogiwiki/search/alpha-beta/)と
[静止探索](/shogi/shogiwiki/search/quiescence-search/)を中心とする探索が主流である。
一方で、
- 詰み探索
- 詰将棋ソルバ
- 終局証明
では PNS 系が非常に重要になる。
そのため「通常探索の代わり」ではなく、
「目的の違う専用探索」と理解するのが適切である。
## 注意点
- 木全体を保持しやすく、メモリ消費が大きくなりやすい
- 終端判定や合法手生成の正確性が特に重要になる
- 一般対局の全局面へそのまま適用するのは重い
## 関連項目
- [Conspiracy Number Search](/shogi/shogiwiki/search/conspiracy-number-search/)
- [アルファベータ法](/shogi/shogiwiki/search/alpha-beta/)
- [探索木](/shogi/shogiwiki/search/search-tree/)
## 参考にしたホームページ
- [Chessprogramming Wiki: Proof Number Search](https://www.chessprogramming.org/Proof-Number_Search)
- [Chessprogramming Wiki: Victor Allis](https://www.chessprogramming.org/Victor_Allis)
- [en.wikipedia.org: Proof Number Search](https://en.wikipedia.org/wiki/Proof-number_search)
- [citeseerx.ist.psu.edu: Document](https://citeseerx.ist.psu.edu/document?doi=db6ce86eea0106dc6ae75349a2cacb212b91884e&repid=rep1&type=pdf)