充足可能性問題 (SAT) とエンコーディング
論理式を真にする変数割当が存在するかを判定する問題。NP完全問題の原型であり、多くの組合せ問題を SAT へ帰着して SAT solver で解く実用パターンが広い。
Cook-Levin 定理
SAT は NP 完全であることを示した定理。任意の NP 問題は多項式時間で SAT に帰着できる。さらに (節を 3 リテラルに減らす/増やす変換)も成り立つ。
変種
- Circuit-SAT — 論理回路で表現した SAT。これも NP 完全。
DIMACS CNF フォーマット
SAT solver 入力のデファクト標準。p cnf 変数数 節数 ヘッダの後、各節を整数列(負数は否定、行末 0)で書く。
p cnf 2 3
1 2 0
-1 2 0
-1 -2 0
エンコーディングの実践
パズルや制約充足を SAT に落とす。例「犯人は誰だ」では各証言を (!A) == (B || C) のような双条件として書き、CNF 化して solve する。解の否定を制約に追加して再 solve し UNSAT なら一意解、という解の一意性検証テクニックも使える。
関連: np-complexity-classes / boolean-satisfiability-sat / _moc-cs
二分決定図 (BDD / ZDD)
論理関数を表現する DAG 型データ構造。変数を順に分岐させ、同型な部分木を共有することで論理関数を圧縮表現する。
ZDD
Zero-suppressed BDD。集合族(組合せ集合)を表すバリアント。
- 圧縮表現のまま union / intersection / difference といった集合演算を計算できる
- ただし演算が正しく行えるには 簡約化 されている必要がある(冗長な節点が無く、表現が一意であること)
簡約化と並列化
トップダウンに構築した BDD は冗長性が生じやすく、演算ごとに簡約化が必要。
- Knuth09 の簡約化アルゴリズムは
- これをさらに高速化したい → ハードウェアによる高速化、本研究では 並列準簡約化と追駆簡約化 による新しい並列化(先行研究の並列化手法と直交=因果関係のない別軸の手法)
SAT と同じく論理関数を扱うが、BDD は関数全体を一意な正規形として保持する点が異なる。
関連: boolean-satisfiability-sat / parallel-computing / _moc-cs