演算法導論之NP完全性和近似演算法

2021-07-11 14:30:04 字數 2996 閱讀 3885

在理解np完全性之前,筆者想引入關於科學與偽科學的定義。凡可接受實踐檢驗、可被證實和被否正的為科學,相反之為非科學,而偽科學是非科學之子集,與科學相對立,認定非科學為科學的即是偽科學。三者關係可簡化為:科學相反於非科學、對立於非科學子集偽科學。集合的運算關係見下面,科學定義為s、非科學定義為ns、偽科學定義為fs。

演算法是用來解決問題的,乙個問題能否在多項式時間內完成是衡量問題複雜度和演算法有效性的標準。多項式時間就是指時間複雜度是個多項式。對於解決問題的演算法,在其輸入規模為下,其最壞執行時間為

再說明下判定問題和最優化問題。判定問題是指尋求有窮步驟內確定是否具有某一特定的性質的一種能行方法或程式或演算法,該類問題的答案可用「是否」來回答;最優化問題是在滿足一定的約束條件和特定引數值輸入下取得最佳值的可行解。對最優化問題的值設定乙個界,可轉化為相關判定問題。

特定狀態輸入下,如輸出唯一確定,則為確定性演算法,如輸出多項可選,則為非確定性演算法。非確定性演算法將問題分解成猜測和驗證兩個階段,演算法的猜測階段是非確定性的,演算法的驗證階段是確定性的,它驗證猜測階段給出解的正確性。

p類問題(polynomialproblem):多項式時間內可解的判定問題。

np類問題(nondeterministic polynomial):非確定性多項式時間可解的判定問題。

npc類問題(npcomplete):屬於np中的問題,其複雜性與整個類的複雜性一致,其中乙個存在多項式時間的演算法,該類所有問題均可在多項式時間可解的。

通俗地說,p類問題就是多項時間內一定可解,可以很快解決的問題組成;np類問題就是多項式時間內非確定性可解,在約束性的輸入下,可以驗證出多項式時間內的解,可以很快驗證其解的問題組成;npc類問題則是無法找尋乙個多項式時間內的解的np問題集合。顯然,p和npc都是np的子集,且p和npc無交集,如下面集合關係。

npc問題的定性更多傾向於解決問題的難度或演算法複雜度無法在多項式時間內量化,於是這類問題的集合在邏輯高度上便形成一即一切、一切即一的思維,乙個問題有解,所有問題便有解。對於np問題的非確定性演算法,存在很多可能性的猜測,但結果正確與否可驗證;可在多項式時間內驗證乙個解是否正確的問題即為np問題,易驗證問題類。

從np類的問題中分出複雜性最高的乙個子類,即np完全類,其理論意義在於證明p=np,只要二者有交集,就證明了np類中的所有問題都是p類的,這對於解決npc問題有現實意義。在演算法設計和分析過程中,如證明某問題是np完全的,即意味著面臨hard問題;因此對於np完全問題,尋找最佳近似演算法,或者界定具體要求尋找多項式時間演算法。

實際上,p、np、npc三者的集合關係隨著各類難題的解決以及新出現的難題,證明p=np一直未能有效成立。有解、未確定性有解、無解,就是問題的分類,有解的是p,如果能夠證明無解的npc有解,那未確定性有解的np就是確定性有解。何謂未確定有解,無法證明有解,但如果提出乙個解可以很快驗證是否有效,其中找不到任何乙個解的都歸類到npc,而npc中只要有乙個問題存在解,那所有該類問題都有解,這就是歸約性的定義。

設a2是判定問題l2的多項式時間演算法, f是計算規約函式f的多項式時間規約演算法。

判定問題l1的多項式時間演算法a1。x屬於l1問題,將x通過f歸約到f(x),f(x)屬於l2問題,如果f(x)能夠通過多項式時間內的演算法a2得解,則判定問題x可通過多項式時間演算法a1得解。

反過來,歸約性也用來證明乙個問題在乙個多項式時間因子內與其他問題一樣難。通過歸約性得出定理:如果任何npc的問題是多項式時間內可求解的,則p=np。等價地,如果np中的任何問題不是多項式時間可求解的,則所有npc問題都不是多項式內可求解的。目前理論研究的進展,傾向p不等於np,三者的集合關係如下圖。

既然npc問題的存在,使p=np不成立,那麼研究npc問題的解決便成為複雜類問題的關鍵。一般解決策略有:只對問題的特殊例項求解、用動態規劃法或分支限界法求解、用概率演算法求解、只求近似解、用啟發式方法求解。關於近似演算法定義如下:

若對問題的輸入規模n,有一函式ε(n)使得

對理解npc和近似演算法還需要就具體問題的演算法求解進行研究,如旅行商問題、集合覆蓋問題等。考驗邏輯的圖靈停機問題卻想理解下。

圖靈停機問題的描述:不存在乙個程式(或演算法),它能夠計算任何程式在給定輸入上是否會結束(停機)。用反證法來證明:

1)假設存在萬能程式god_algo,可以判定任何一段程式及其給定的輸入是否會結束。

boolgod_algo(char* program, char* input)else returntrue;

該程式根據god_algo返回結果輸出。假設輸入程式a,god_algo判定a程式及其給定輸入input可停機,則進入迴圈無法退出,如果不停機則返回true。

3)satan_algo呼叫自身:

satan_algo(satan_algo)執行結果顯然是左右矛盾。

假設satan_algo能夠停機,god_algo返回ture,進入while迴圈,無法停機;

假設satan_algo不能停機,god_algo返回false,返回true,可以停機。

4)結論:

satan_algo能夠停機=>satan_algo(satan_algo)它不能停機

satan_algo不能停機=>satan_algo(satan_algo)它能夠停機

推導出不存在這樣的乙個萬能程式,可判定任何程式在給定輸入下是否能停機。

科學的偉大就在於不斷證明和反證明,科學家的偉大在於在不斷的探索中肯定和否定,而思考和邏輯顯然在這中間扮演著無窮魅力的角色。沒有思考不存在邏輯,而沒有邏輯的思考不存在思考的意義,沉浸在理論科學的汪洋大海中,忘記技術工程的瑣細,是一種享受,而尋找理論的應用卻是一種自我昇華和證明的過程。現代資訊科學大廈的基礎無疑是數學,但電腦科學也豐富了數學的理論,無法忘記歸納、推理在程式中所體現的閃光點,圖靈機開創的時代,至今令人心驚動搖,如今智慧型和量子時代的來臨,圖靈理論基礎還是適用。要繼續進步,也許只有理論再次創新,出現二次圖靈機理論,每次理論的創新都有著漫長理論應用的經驗探索,而後量變出現質變,我相信這個理論革命不遠了。超越圖靈機、突破馮諾依曼體系,是賦予現如今電腦科學理論研究者的使命,而作為前沿技術工程者,無疑是期待著能參與,可惜理論所需要的數學基礎非專攻不能。

概率演算法和近似演算法

前面已經提到了顯示中大多數難解問題問題最後都被證明是np 完全問題。這意味著,除非np p,它們是不可能有多項式時間演算法的 而且,在這篇文章提到即使np p,人們也可能找不到乙個np完全問題的 有效 演算法 所以人們發展了各種工具來避開它們,最常用的兩種方法是使用概率演算法和近似演算法,這兩種方法...

演算法 NP 難度和NP 完全的問題

演算法運算的結果都是唯一確定的,這樣的演算法叫做確定的演算法 deterministic algorithm 如加減乘除 允許演算法每種運算的結果不是唯一確定的,而是受限於某個特定的可能性集合。執行這些運算的機器可以根據終止條件選擇可能性集合中的乙個作為結果。這就引出了所謂不確定的演算法 nonde...

理論計算機初步 概率演算法和近似演算法

已經提到了顯示中大多數難解問題問題最後都被證明是np 完全問題。這意味著,除非np p,它們是不可能有多項式時間演算法的 而且,在 這篇文章提到即使np p,人們也可能找不到乙個np完全問題的 有效 演算法 所以人們發展了各種工具來避開它們,最常用的兩種方法是使用概率演算法和近似演算法,這兩種方法也...