Boolean Satisfiability Problem
什麼是 SAT?
Boolean satisfiability problem 簡稱 SAT,簡單說就是用來判斷一組給定的布林函數,是否可以找到一組變數賦值能使其為真。
|
|
SAT 的重要性
SAT 是第一個 NP-Complete problem
在應用的角度只要知道 NP-Complete problem 很難,沒辦法有效率找到最佳解(但可能可以有效率的找到近似最佳解),以及 NP-Complete problem 可以在多項式時間內互相轉換(就是說你可以拿一個 NP-Complete problem 來解另外一個),這樣就夠了。解 SAT 的方法發展的很好
SAT 做為最古老且知名的 NP-Complete problem,已經有許多演算法跟技巧被發明出來解它,目前最好的那些 SAT solver 可以解到上萬個變數,我們知道 NP-Complete problem 可以在多項式時間內互轉,而 SAT solver 的效率又不錯,那麼 SAT 自然是很有實用性的。
SAT 的應用
SAT 被應用在如 EDA 領域的測試、驗證,AI 領域如自動定理證明 ,網路上還查的到很多,但一時間看不懂所以然的我就不列了,以下舉幾個例子。
- Circuit satisfiability problem
給出一個電路,是否有 input 能讓 output 為 true
|
|
如果運用這種方法,就可以堆積出複雜電路的 boolean function,可以測試一個電路能不能 output true,也就是說能知道它會不會是無用的電路(可以化簡)。
這種方法叫做 Tseitin transformation,有興趣可參考 wiki:https://en.wikipedia.org/wiki/Tseytin_transformation
- 四色問題
如果地圖上相鄰的兩個區域不能畫相同的顏色,那不管這張地圖多複雜,最少都可以用四種顏色畫出它。
|
|
不過我們知道一張地圖的區域最少能用幾種顏色畫,讓相鄰的區域不同顏色,這樣的事情要幹嘛? 當然是有用處的。
例如很多地方都蓋了基地台,但只要是相鄰的基地台使用相同的頻率,就會相互干擾導致收訊不良。因此對應到四色問題,我們知道最少用四種頻率的基地台就能解決干擾了。
reference
一個介紹 SAT 的英文文章
http://sahandsaba.com/understanding-sat-by-implementing-a-simple-sat-solver-in-python.html