什麼是NP問題,NP-complete和NP-hard問題.

什麼是NP問題

概念1:

在計算機學科中,存在多項式時間的算法的一類問題,稱之爲P類問題;而像梵塔問題、推銷員旅行問題、(命題表達式)可滿足問題這類,至今沒有找到多項式時間算法解的一類問題,稱之爲NP類問題。

概念2:

多項式時間(Polynomial time)在計算複雜度理論中,指的是一個問題的計算時間m(n)不大於問題大小n的多項式倍數。任何抽象機器都擁有一複雜度類,此類包括可於此機器以多項式時間求解的問題。

以數學描述的話,則可說m(n) = O(n),此n爲一常數值(依問題而定)


拿推銷員旅行問題爲例,假設推銷員亨利有向6個城市推銷公司產品的任務,並規定了一個旅行預算。他手中有一張航班票價表,他要從A城開始走遍圖中的6個城市後返回A城,並且不超出預算,請你幫他找出應走的路線。如果給出的預算寬裕,則任務很簡單;如果預算比較緊張,你就得認真設計路線了。你得考慮每一種可能的次序,以使旅費最少。

而NP問題中最困難的問題稱之爲NP完全問題(NP-complete),已經證明的包括:電話網絡的最優幾何設計、格子棋的最佳走法。根據庫克定理,任意一個NP完全問題如果能夠在多項式時間內解決,則所有的NP問題都能在多項式時間內解決,而至今這一問題仍無答案。


什麼是非確定性問題呢?有些計算問題是確定性的,比如加減乘除之類,你只要按照公式推導,按部就班一步步來,就可以得到結果。但是,有些問題是無法按部就班直接地計算出。比如,找大質數的問題。有沒有一個公式,你一套公式,就可以一步步推算出來,下一個質數應該是多少呢?這樣的公式是沒有的。再比如,大的合數分解質因數的問題,有沒有一個公式,把合數代進去,就直接可以算出,它的因子各自是多少?也沒有這樣的公式。

這種問題的答案,是無法直接計算得到的,只能通過間接的“猜算”來得到結果。這也就是非確定性問題。而這些問題的通常有個算法,它不能直接告訴你答案是什麼,但可以告訴你,某個可能的結果是正確的答案還是錯誤的。這個可以告訴你“猜算”的答案正確與否的算法,假如可以在多項式時間(多項式時間: 運行時間最多是輸入量的多項式函數)內算出來,就叫做多項式非確定性問題。而如果這個問題的所有可能答案,都是可以在多項式時間內進行正確與否的驗算的話,就叫完全多項式非確定問題。

完全多項式非確定性問題可以用窮舉法得到答案,一個個檢驗下去,最終便能得到結果。但是這樣算法的複雜程度,是指數關係,因此計算的時間隨問題的複雜程度成指數的增長,很快便變得不可計算了。人們發現,所有的完全多項式非確定性問題,都可以轉換爲一類叫做滿足性問題的邏輯運算問題。既然這類問題的所有可能答案,都可以在多項式時間內計算,人們於是就猜想,是否這類問題,存在一個確定性算法,可以在指數時間內,直接算出或是搜尋出正確的答案呢?這就是著名的NP=P?的猜想。

解決這個猜想,無非兩種可能,一種是找到一個這樣的算法,只要針對某個特定NP完全問題找到一個算法,所有這類問題都可以迎刃而解了,因爲他們可以轉化爲同一個問題。另外的一種可能,就是這樣的算法是不存在的。那麼就要從數學理論上證明它爲什麼不存在。

前段時間轟動世界的一個數學成果,是幾個印度人提出了一個新算法,可以在多項式時間內,證明某個數是或者不是質數,而在這之前,人們認爲質數的證明,是個非多項式問題。可見,有些看來好象是非多項式的問題,其實是多項式問題,只是人們一時還不知道它的多項式解而已。

什麼叫做NP問題,什麼叫做NPC問題?

首先說明一下問題的複雜性和算法的複雜性的區別,下面只考慮時間複雜性。算法的複雜性是指解決問題的一個具體的算法的執行時間,這是算法的性質;問題的複雜性是指這個問題本身的複雜程度,是問題的性質。比如對於排序問題,如果我們只能通過元素間的相互比較來確定元素間的相互位置,而沒有其他的附加可用信息,則排序問題的複雜性是O(nlgn),但是排序算法有很多,冒泡法是O(n^2),快速排序平均情況下是O(nlgn)等等,排序問題的複雜性是指在所有的解決該問題的算法中最好算法的複雜性。問題的複雜性不可能通過枚舉各種可能算法來得到,一般都是預先估計一個值,然後從理論上證明。

爲了研究問題的複雜性,我們必須將問題抽象,爲了簡化問題,我們只考慮一類簡單的問題,判定性問題,即提出一個問題,只需要回答yes或者no的問題。任何一般的最優化問題都可以轉化爲一系列判定性問題,比如求圖中從A到B的最短路徑,可以轉化成:從A到B是否有長度爲1的路徑?從A到B是否有長度爲2的路徑?。。。從A到B是否有長度爲k的路徑?如果問到了k的時候回答了yes,則停止發問,我們可以說從A到B的最短路徑就是k。

如果一個判定性問題的複雜度是該問題的一個實例的規模n的多項式函數,則我們說這種可以在多項式時間內解決的判定性問題屬於P類問題。P類問題就是所有複雜度爲多項式時間的問題的集合。

然而有些問題很難找到多項式時間的算法(或許根本不存在),比如找出無向圖中的哈米爾頓迴路問題,但是我們發現如果給了我們該問題的一個答案,我們可以在多項式時間內判斷這個答案是否正確。比如說對於哈米爾頓迴路問題,給一個任意的迴路,我們很容易判斷他是否是哈米爾頓迴路(只要看是不是所有的頂點都在迴路中就可以了)。這種可以在多項式時間內驗證一個解是否正確的問題稱爲NP問題。顯然,所有的P類問題都是屬於NP問題的,但是現在的問題是,P是否等於NP?這個問題至今還未解決。注意,NP問題不一定都是難解的問題,比如簡單的數組排序問題是P類問題,但是P屬於NP,所以也是NP問題,你能說他很難解麼? 剛纔說了,現在還不知道是否有P=NP或者P<>NP,但是後來人們發現還有一系列的特殊NP問題,這類問題的特殊性質使得很多人相信P<>NP,只不過現在還無法證明。這類特殊的NP問題就是NP完全問題(NPC問題,C代表complete)。NPC問題存在着一個令人驚訝的性質,即如果一個NPC問題存在多項式時間的算法,則所有的NP問題都可以在多項式時間內求解,即P=NP成立!!這是因爲,每一個NPC問題可以在多項式時間內轉化成任何一個NP問題。比如前面說的哈米爾頓迴路問題就是一個NPC問題。NPC問題的歷史並不久,cook在1971年找到了第一個NPC問題,此後人們又陸續發現很多NPC問題,現在可能已經有3000多個了。所以,我們一般認爲NPC問題是難解的問題,因爲他不太可能存在一個多項式時間的算法(如果存在則所有的NP問題都存在多項式時間算法,這太不可思議了,但是也不是不可能)。

類似哈米爾頓迴路/路徑問題,貨郎擔問題,集團問題,最小邊覆蓋問題(注意和路徑覆蓋的區別),等等很多問題都是NPC問題,所以都是難解的問題。


NP中的某些問題的複雜性與整個類的複雜性相關聯.這些問題中任何一個如果存在多項式時間的算法,那麼所有NP問題都是多項式時間可解的.這些問題被稱爲NP-完全問題(NPC問題).

  判定方法:
  一個判定性問題,滿足:
  (1)∏∈NP
  (2)對任意一個∏’∝poly∏ (注:poly爲規約符號)
  則問題∏稱爲NP-完全的(NP-complete,NPC);如果問題∏僅滿足條件(2)而不滿足條件(1),則問題NP稱爲NP-難的(NP-hard)。


總結來說:

P類:已有多項式時間算法的判定問題.

NP類:已有指數時間算法的判定問題,包括P類.

NPC類:是NP的一個子集,且其中每一個問題均能由NP中的任何問題在多項式時間內轉化成.

NPH問題:若問題A不屬於NP類,已知某一NPC問題可在多項式時間內轉化爲問題A,則稱A爲NPH.


要理解NPH問題,請參看TSP(旅行商問題):http://baike.baidu.com/view/1162183.htm


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章