對NP問題的一點感想


 

一.概述

回憶歐拉回路問題,要求找出一條經過圖的每條邊恰好一次的路徑,這個問題是線性可解的。哈密爾頓圈問題是找一個簡單圈,該圈包括圖的每一個頂點。對於這個問題,現在還沒有發現線性算法。

對於有向圖的單源無權最短路徑問題也是有線性時間可解的,但是對應的最長簡單路徑問題(longest-simple-path)尚沒有發現線性算法。

這些問題的變化,其情況實際上比描述得還要糟。對於這些變種問題不僅不知道線性算法,而且不存在保證以多項式時間運行的已知算法。這些問題的一些熟知算法對於某些情況可能要花費指數時間。

由於相當復雜,我在下面的討論也只是非正式的,所以可能會存在一些討論不到位的遺憾。

其實存在大量的重要的問題,它們在復雜性上大體是等價的。這些問題形成了一個類,稱為NP-完全(NP-complete)問題。這些NP-完全問題精確的復雜度仍然需要確定並且在計算機理論科學方面仍然是最重要的開放性問題。或者這些問題都有多項式時間算法,或者都沒有多項式時間算法。

 

二.難與易

給問題分類時,第一步要考慮分界。我們看到許多問題都可以用線性時間求解。我們還看到某些O(logN)的運行時間,但是它們或者假定已經做了某些預處理(如輸入數據已讀入或者數據結構已經建立),或者出現在運算實例中。例如,gcd(最大公因數)算法,當用於兩個數M和N時,花費O(logN)的時間。由於這兩個數分別由logM和logN個二進制位組成,因此gcd算法實際上花費的時間對於輸入數據的量而言是線性的。由此可知,當我們度量運行時間時,我們將把運行時間考慮成輸入數據的量的函數。一般來說,不能期望運行時間比線性時間更好。

另一方面,的確存在某些真正困難的問題(以至於它們不可能被解出)。但這並不意味着我們懊惱嘆息等着天才來解決。正如實數不足以表示X2<0 的解那樣,可以證明的是,計算機不可能解決碰巧發生的每一個問題。這些“不可能”問題,叫做不可判定問題(undecidable problem)

一個特殊的不可判定問題就是停機問題(halting problem)。是否能夠使Java編譯器擁有一個附加的特性,即不僅能夠檢查語法錯誤,而且能夠檢查所有的無限循環?這似乎是一個比較難的問題,但是我們或許期望,假如某些聰明的程序員花上足夠的時間,或許可能編制出這種增強編譯器。

這個問題是不可判定的,其直觀原因在於,這樣的一個程序可能很難檢查它自己。由於這個原因,有時候這些問題被叫做遞歸不可判定的(recursively undecidable)

假如一個無限循環檢查程序能夠寫出,那么它肯定可以用於自檢。假設此時我們可以編寫這樣的一個程序,叫做LOOP。LOOP把一個程序P作為輸入並使P自身運行。如果P自身運行時出現循環,則顯示短語YES。如果P自身運行終止了,那么自然顯示NO。現在,我們換個角度,讓LOOP進入無限循環。

當LOOP將自身作為輸入會發生什么呢?或者LOOP停止,或者不停止。問題在於,這里面存在羅素悖論。

根據我們的定義,如果P(P)終止,則LOOP(P)進入一個無限循環。設當P=LOOP時,P(P)終止。此時,按照LOOP程序,LOOP(P)應該進入一個無限循環。因此,我們必須讓LOOP(LOOP)終止並進入一個無限循環,顯然這是不可能的。另一方面,設當P=LOOP時,P(P)進入一個無限循環,則LOOP(P)必然終止,我們得到了同樣的一組矛盾。因此可以說,LOOP程序不存在。

 

三.NP類

NP類是在難度上遜於不可判定問題的類。NP代表非確定性多項式時間(nondeterministic polynomial-time)。確定性機器在每一時刻都在執行一條指令。根據這條指令,機器在去執行某條接下來的指令,這是唯一確定的。而一台非確定性機器對其后的步驟是有選擇的。它可以自由進行它想要的任意的選擇,如果這些后面的步驟中有一條是導致問題的解,那么它將總是選擇這個正確的步驟。因此,非確定性機器有很好的猜測與優化能力。這好像一個很奇怪的模型,因為沒有人能夠建立這樣一台機器,還因為這台機器是對標准計算機的令人難以置信的改進(這時候所有的問題都變成易解的了)。非確定性是非常有用的理論結構。此外,非確定性也不像人們想象的那樣強大。比如,即使使用非確定性,不可判定問題仍然是不可判定的。

檢驗一個問題是否屬於NP的簡單方法就是將該問題用“是/否(yes/no)問題”的語言描述。如果我們在多項式時間內能夠證明一個問題的任意“是”的實例是正確的,那么該問題就是NP類。我們不必擔心“否”的實例,因為程序總是進行正確的選擇。因此,對於哈密頓圈問題,一個“是”的實例就是圖中任意一個包含所有頂點的簡單的回路。由於給定一條路徑,驗證它是否真的是哈密爾頓圈是一件簡單的事情,因此哈密爾頓圈問題屬於NP。諸如“存在長度大於K的簡單路徑嗎?”這樣的問題也可能容易驗證從而屬於NP。滿足這條性質的任何路徑均可容易檢驗。

由於解本身顯然提供了驗證方法,因此,NP類包括所有具有多項式時間解的問題。人們會想到,既然驗證一個問題要比經過計算提出一個答案簡單得多,因此在NP中就會存在不具有多項式時間解法的問題。這樣的問題至今沒有發現,於是,完全有可能非確定性並不是如此重要的改進。

也並不是所有可判定性問題都屬於NP。考慮確定一個圖是否沒有哈密爾頓圈的問題。證明一個圖有哈密爾頓圈是相對簡單的事情——我們只需要找到一個就可以了。然而卻沒有人知道如何以多項式時間證明一個圖沒有哈密爾頓圈。似乎只剩下一個方法,就是枚舉並驗證。因此,無哈密爾頓圈的問題不知道屬不屬於NP。

 

四.NP-完全問題

在已知屬於NP的所有問題中,存在一個子集,叫做NP-完全問題,包含了NP中最難的問題。NP-完全問題有一個性質:NP中的任一問題都能夠以多項式時間歸約成NP-完全問題。

問題 P1可以歸約成問題P2 如下:設有一個映射,使得 P1的任何實例都可以變換成P2 的一個實例。求解 P2,然后將答案映射回原始的解答。作為一個例子,考慮把數以十進制輸入到一只計算器。將這些十進制數轉換成二進制數,所有的計算都以二進制進行。然后,再把最后的答案轉變成十進制顯示。對於可多項式地歸約成P2 的 P1,與變換相聯系的所有工作必須以多項式時間完成。

NP-完全問題是最難的NP問題的原因在於,一個NP-完全問題基本上可以用作NP中任何問題的子例,其花費的只不過是多項式的開銷量。因此,如果任意NP-完全問題有一個多項式時間解,那么NP中的每一個問題必然都有一個多項式時間解。

假設我們有一個NP-完全問題 P1,並設P2 已知屬於NP。再進一步假設 P1多項式地歸約成 P2,使得我們可以通過 P2求解 P1只多耗費了多項式時間。由於 P1是NP-完全的,NP中的每一個問題都可以歸約成 P1。對於多項式的封閉性,我們看到,NP中的每一個問題均可多項式地歸約成P2 。因此, P2是NP-完全的。

 

 

五.巡回售貨員問題

給定一個完全圖G=(V,E),它的邊值以及整數K,是否存在一個訪問所有頂點並且總值小於等於K的簡單回路?

巡回售貨員問題是NP-完全的。容易看到,它的解可以用多項式時間檢驗,當然它屬於NP。為了證明它是NP-完全的,我們可以多項式地將哈密爾頓圈問題歸約為巡回售貨員問題。為此,構造出一個新圖G’ , G’ 和G有相同的頂點。對於G‘ 的每一條邊(v , w),如果(v , w)∈ G ,那么它就有權1,否則,它的權就是2.我們選取K=|V|。

 

 

容易驗證,G有一個哈密爾頓圈當且僅當G‘ 有一個總權為|V|的巡回售貨員的巡回路線。

現在有許多問題已知是NP-完全問題。為了證明某個新問題是NP-完全問題,必須證明它屬於NP,然后構造一個適當的NP-完全問題變換到該問題。

那么第一個NP-完全問題是怎么具體地被證明的呢?由於證明一個問題是NP-完全需要從另一個NP-完全問題變換到它,因此必然存在某個NP-完全問題,對於這個問題不能用上面的思路。第一個被證明的NP-完全問題是可滿足性(satisfiability)問題。這個問題把一個布爾表達式作為輸入並提問該表達式對各變量的一次賦值取值true。

可滿足性問題當然屬於NP,因為容易計算一個布爾表達式的值並檢查結果是否為真(true)。在1971年,Cook通過直接證明NP中所有問題都可以變換成可滿足性問題而證明了NP-完全問題。為此,他用到了對NP中每一個問題都已知的事實:NP中的每一個問題都可以用一台非確定性計算機在多項式時間內求解。計算機的這種形式化模型就是圖靈機(Turing machine)。Cook指出這台機器的動作如何能夠用一個極其復雜但仍是多項式的冗長的布爾公式來模擬。該布爾公式為真,當且僅當在由圖靈機運行的程序對其輸入得到一個“是”的答案。

一旦可滿足性問題被證明NP-完全,則一大批新的NP-完全問題,包括某些經典的問題,也被證明是NP-完全的。

其實還有還多更加著名的NP-完全問題,比如裝箱問題、背包問題、着色問題、團問題。這些NP-完全問題相當廣泛,包括來自操作系統、數據庫、運籌學、邏輯學等,特別是圖論等領域。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM