NP 是 Non-deterministic Polynomial 的縮寫,NP 問題通俗來說是其解的正確效能夠被很容易檢查的問題, 這裡"很容易檢查"指的是存在一個多項式檢查演算法.
例如, 著名的推銷員旅行問題(Travel Saleman Problem or TSP):假設一個推銷員需要從香港出發, 經過廣州, 北京, 上海,....., 等 n 個城市, 最後返回香港。 任意兩個城市之間都有飛機直達, 但票價不等。現在假設公司只給報銷 $C 塊錢, 問是否存在一個行程安排,使得他能遍曆所有城市,而且總的路費小於 $C ?
推銷員旅行問題顯然是 NP 的. 因為如果你任意給出一個行程安排, 可以很容易算出旅行總開銷. 但是, 要想知道一條總路費小於 $C 的行程是否存在, 在最壞情況下, 必須檢查所有可能的旅行安排! 這將是個天文數字.
NP-complete 問題是所有 NP 問題中最難的問題. 它的定義是, 如果你可以找到一個解決某個 NP-complete 問題的多項式演算法, 那麼所有的 NP 問題都將可以很容易地解決.
通常證明一個問題 A 是 NP-complete 需要兩步, 第一先證明 A 是 NP 的, 即滿足容易被檢查這個性質; 第二步是構造一個從某個已知的 NP-complete 問題 B 到 A 的多項式變換, 使得如果 B 能夠被容易地求解, A 也能被容易地 解決. 這樣一來, 我們至少需要知道一個 NP-complete 問題.
第一個 NP complete 問題是 SAT 問題, 由 COOK 在 1971 年證明. SAT 問題指的是, 給定一個包含 n 個布爾變數(只能為真或假) X1, X2, .., Xn 的邏輯析取範式, 是否存在它們的一個取值組合, 使得該析取範式被滿足? 可以用一個具體例子來說明這一問題, 假設你要安排一個 1000 人的晚宴, 每桌 10 人, 共 100 桌. 主人給了你一張紙, 上面寫明其中哪些 人因為 江湖恩怨不能坐在同一張桌子上, 問是否存在一個滿足所有這些約束條件的晚宴安排? 這個問題顯然是 NP 的, 因為如果有人建議一個安排方式, 你可以很容易檢查它是否滿足所有約束. COOK 證明了這個問題是 NP-complete 的, 即如果你有一個好的方法能解決晚宴安排問題, 那你就能解決所有的 NP 問題.
這聽起來很困難, 因為你必須面對所有的 NP 問題, 而且現在你並不知道任何的 NP-complete 問題可以利用.COOK 用非確定性圖靈機( Non-deterministic Turing Machine ) 巧妙地解決了這一問題.
正式地, NP 問題是用非確定性圖靈機來定義的, 即所有可以被非確定性圖靈機在多項式時間內解決的問題. 非確定性圖靈機是一個特殊的圖靈機, 它的定義抓住了"解容易被檢查" 這一特性. 非確定性圖靈機有一個"具有魔力的"猜想組件, 只要問題有一個解, 它一定可以猜中. 例如, 只要存在哪怕一個滿足約束的晚宴安排方式, 或是一個滿足旅行預算的行程安排, 都無法逃過它的法眼, 它可以在瞬間猜中. 在猜出這個解以後,檢查確認部分和一台普通的確定性圖靈機完全相同,也即是等價於任何一個實際的電腦程式.
COOK 證明了,任意一個非確定性圖靈機的計算過程,即先猜想再驗證的過程, 都可以被描述成一個 SAT 問題,這個 SAT 問題實際上總結了該非確定性圖靈機在計算過程中必須滿足的所有約束條件的總和(包括狀態轉移, 資料讀寫的方式等等), 這樣, 如果你有一個能解決該 SAT 問題的好的演算法, 你就可以解決相應的那個非確定性圖靈機計算問題, 因為每個 NP 問題都不過是一個非確定性圖靈機計算問題, 所以, 如果你可以解決 SAT , 你就可以解決所有 NP 問題. 因此, SAT 是一個 NP-complete 問題.
有了一個 NP-complete 問題, 剩下的就好辦了, 我們不用每次都要和非確定性圖靈機打交道, 而可以用前面介紹的兩步走的方法證明其它的 NP-complete 問題. 迄今為止, 人們已經發現了成千上萬的NP-complete 問題, 它們都具有容易被檢查的性質, 包括前面介紹的推銷員旅行問題. 當然更重要的是, 它們是否也容易被求解, 這就是著名的 P vs NP 的問題.