0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

NP完全性理論與近似算法

算法與數據結構 ? 來源:未知 ? 作者:胡薇 ? 2018-06-22 16:12 ? 次閱讀

一、圖靈機

根據有限狀態(tài)控制器的當前狀態(tài)及每個讀寫頭讀到的帶符號,圖靈機的一個計算步可實現下面3個操作之一或全部。

改變有限狀態(tài)控制器中的狀態(tài)。

清除當前讀寫頭下的方格中原有帶符號并寫上新的帶符號。

獨立地將任何一個或所有讀寫頭,向左移動一個方格(L)或向右移動一個方格(R)或停在當前單元不動(S)。

k帶圖靈機可形式化地描述為一個7元組(Q,T,I,δ,b,q0,qf),其中:

Q是有限個狀態(tài)的集合。

T是有限個帶符號的集合。

I是輸入符號的集合。

b是唯一的空白符,b∈T-I。

q0是初始狀態(tài)。

qf是終止(或接受)狀態(tài)。

δ是移動函數。

它是從Q×Tk的某一子集映射到Q×(T×{L,R,S})k的函數。

圖靈機M的時間復雜性T(n)是它處理所有長度為n的輸入所需的最大計算步數。如果對某個長度為n的輸入,圖靈機不停機,T(n)對這個n值無定義。

圖靈機的空間復雜性S(n)是它處理所有長度為n的輸入時,在k條帶上所使用過的方格數的總和。如果某個讀寫頭無限地向右移動而不停機,S(n)也無定義。

確定型圖靈機

有限狀態(tài)集Q,狀態(tài)q0:初始狀態(tài);qy:接受狀態(tài);狀態(tài)qn:不接受狀態(tài)。

字符集合{0, 1, b} ;其中b是空格符。

轉換功能:

輸入x = 101000b

執(zhí)行順序:

q0輸入1 (q0,r)右移磁頭到0

q0輸入0 (q0,r)右移磁頭到1

q0輸入0 (q0,r)右移磁頭到0

...

q0輸入b (q1,l)左移磁頭到0

q1輸入0 (q2,b)

q2輸入b (q2,l)左移磁頭到0

q2輸入0 (q3,b)

q3輸入b (qy,l)退出

二、P類與NP類問題

一般地說,將可由多項式時間算法求解的問題看作是易處理的問題,而將需要超多項式時間才能求解的問題看作是難處理的問題。

有許多問題,從表面上看似乎并不比排序或圖的搜索等問題更困難,然而至今人們還沒有找到解決這些問題的多項式時間算法,也沒有人能夠證明這些問題需要超多項式時間下界。

在圖靈機計算模型下,這類問題的計算復雜性至今未知。

為了研究這類問題的計算復雜性,人們提出了另一個能力更強的計算模型,即非確定性圖靈機計算模型,簡記為NDTM(Nondeterministic Turing Machine)。

在非確定性圖靈機計算模型下,許多問題可以在多項式時間內求解。

非確定性圖靈機

在圖靈機計算模型中,移動函數δ是單值的,即對于Q′Tk中的每一個值,當它屬于δ的定義域時,Q′(T′{L,R,S})k中只有唯一的值與之對應,稱這種圖靈機為確定性圖靈機,簡記為DTM(Deterministic Turing Machine)。

非確定性圖靈機(NDTM):一個k帶的非確定性圖靈機M是一個7元組:(Q,T,I,δ,b,q0,qf)。與確定性圖靈機不同的是非確定性圖靈機允許移動函數δ具有不確定性,即對于Q×Tk中的每一個值(q;x1,x2,…,xk),當它屬于δ的定義域時,Q×(T×{L,R,S})k中有唯一的一個子集δ(q;x1,x2,…,xk)與之對應??梢栽讦?q;x1,x2,…,xk)中隨意選定一個值作為它的函數值。

P類與NP類語言定義

P={L|L是一個能在多項式時間內被一臺DTM所接受的語言}

NP={L|L是一個能在多項式時間內被一臺NDTM所接受的語言}

由于一臺確定性圖靈機可看作是非確定性圖靈機的特例,所以可在多項式時間內被確定性圖靈機接受的語言也可在多項式時間內被非確定性圖靈機接受。故P í NP。

NP類語言舉例——無向圖的團問題

該問題的輸入是一個有n個頂點的無向圖G=(V,E)和一個整數k。要求判定圖G是否包含一個k頂點的完全子圖(團),即判定是否存在V’V,|V’|=k,且對于所有的u,v∈V’,有(u,v)∈E。

若用鄰接矩陣表示圖G,用二進制串表示整數k,則團問題的一個實例可以用長度為的二進位串表示。因此,團問題可表示為語言:

CLIQUE={w#v|w,v∈{0,1}*,以w為鄰接矩陣的圖G有一個k頂點的團,其中v是k的二進制表示。}

接受該語言CLIQUE的非確定性算法:用非確定性選擇指令選出包含k個頂點的候選頂點子集V,然后確定性地檢查該子集是否是團問題的一個解。算法分為3個階段

算法的第一階段將輸入串w#v分解,并計算出n =?,以及用v表示的整數k。若輸入不具有形式w#v或|w|不是一個平方數就拒絕該輸入。顯而易見,第一階段可在時間內完成。

在算法的第二階段中,非確定性地選擇V的一個k元子集V’V。

算法的第三階段是確定性地檢查V’的團性質。若V’是一個團則接受輸入,否則拒絕輸入。這顯然可以在時間內完成。因此,整個算法的時間復雜性為?。

非確定性算法在多項式時間內接受語言CLIQUE,故CLIQUE∈NP.

NP完全問題

PNP。

直觀上看,P類問題是確定性計算模型下的易解問題類,而NP類問題是非確定性計算模型下的易驗證問題類。

大多數的計算機科學家認為NP類中包含了不屬于P類的語言,即P≠NP。

NP完全問題有一種令人驚奇的性質,即如果一個NP完全問題能在多項式時間內得到解決,那么NP中的每一個問題都可以在多項式時間內求解,即P = NP。

目前還沒有一個NP完全問題有多項式時間算法。

三、NP完全問題的近似算法

迄今為止,所有的NP完全問題都還沒有多項式時間算法。

對于這類問題,通??刹扇∫韵聨追N解題策略。

只對問題的特殊實例求解

用動態(tài)規(guī)劃法或分支限界法求解

用概率算法求解

只求近似解

用啟發(fā)式方法求解

近似算法的性能

若一個最優(yōu)化問題的最優(yōu)值為c*,求解該問題的一個近似算法求得的近似最優(yōu)解相應的目標函數值為c,則將該近似算法的性能比定義為

。

在通常情況下,該性能比是問題輸入規(guī)模n的一個函數ρ(n),即

該近似算法的相對誤差定義為:。若對問題的輸入規(guī)模n,有一函數ε(n)使得則稱ε(n)為該近似算法的相對誤差界。近似算法的性能比ρ(n)與相對誤差界ε(n)之間顯然有如下關系:。

旅行售貨員問題近似算法

問題描述:給定一個完全無向圖G=(V,E),其每一邊(u,v)∈E有一非負整數費用c(u,v)。要找出G的最小費用哈密頓回路。

旅行售貨員問題的一些特殊性質:

比如,費用函數c往往具有三角不等式性質,即對任意的3個頂點u,v,w∈V,有:c(u,w)≤c(u,v)+c(v,w)。當圖G中的頂點就是平面上的點,任意2頂點間的費用就是這2點間的歐氏距離時,費用函數c就具有三角不等式性質。

1 滿足三角不等式的旅行售貨員問題

對于給定的無向圖G,可以利用找圖G的最小生成樹的算法設計找近似最優(yōu)的旅行售貨員回路的算法。

void approxTSP (Graph g)

{

選擇g的任一頂點r;

用Prim算法找出帶權圖g的一棵以r為根的最小生成樹T;

前序遍歷樹T得到的頂點表L;

將r加到表L的末尾,按表L中頂點次序組成回路H,作為計 算結果返回;

}

當費用函數滿足三角不等式時,算法找出的旅行售貨員回路的費用不會超過最優(yōu)旅行售貨員回路費用的2倍。

實現

/* 主題:近似算法——旅行售貨員問題

* 作者:chinazhangjie

* 郵箱:chinajiezhang@gmail.com

* 開發(fā)語言:C++

* 開發(fā)環(huán)境:Virsual Studio2005

* 時間: 2010.12.06

*/

#include

#include

#include

using namespace std;

structTreeNode

{

public:

TreeNode(intnVertexIndexA = 0,intnVertexIndexB = 0,intnWeight = 0)

: m_nVertexIndexA(nVertexIndexA),

m_nVertexIndexB(nVertexIndexB),

m_nWeight(nWeight)

{}

public:

intm_nVertexIndexA;

intm_nVertexIndexB;

intm_nWeight;

};

classMST_Prim

{

public:

MST_Prim()

{}

MST_Prim(const vector >& vnGraph)

{

m_nvGraph = vnGraph;

m_nNodeCount = (int)m_nvGraph.size();

}

void SetData(const vector >& vnGraph)

{

m_nvGraph = vnGraph;

m_nNodeCount = (int)m_nvGraph.size();

}

//

const vector& GetMSTree()const

{

returnm_tnMSTree;

}

//

const vector >& GetGraph()const

{

returnm_nvGraph;

}

void DoPrim()

{

// 是否被訪問標志

vector bFlag(m_nNodeCount,false);

bFlag[0] = true;

intnMaxIndexA;

intnMaxIndexB;

intj = 0;

while(j < m_nNodeCount - 1){

intnMaxWeight = numeric_limits::max();

// 找到當前最短路徑

inti = 0;

while(i < m_nNodeCount){

if(!bFlag[i]){

++ i;

continue;

}

for(intj = 0;j < m_nNodeCount; ++ j){

if(!bFlag[j] && nMaxWeight > m_nvGraph[i][j]){

nMaxWeight = m_nvGraph[i][j];

nMaxIndexA = i;

nMaxIndexB = j;

}

}

++ i;

}

bFlag[nMaxIndexB] = true;

m_tnMSTree.push_back(TreeNode(nMaxIndexA,nMaxIndexB,nMaxWeight));

++ j;

}

// 輸出結果

/*for(vector::const_iterator ite = m_tnMSTree.begin();

ite != m_tnMSTree.end();

++ ite){

cout << (*ite).m_nVertexIndexA << "->"

<< (*ite).m_nVertexIndexB << " : "

<< (*ite).m_nWeight << endl;

}*/

}

private:

vector > m_nvGraph;// 無向連通圖

vectorm_tnMSTree;// 最小生成樹

intm_nNodeCount;

};

classAA_TSP

{

public:

AA_TSP(const vector >& vnGraph)

{

m_mstPrim.SetData(vnGraph);

}

void Get_AA_Path()

{

m_mstPrim.DoPrim();

vectormstree = m_mstPrim.GetMSTree();

vector >graph = m_mstPrim.GetGraph();

intiweight = 0;

for(vector::const_iterator ite = mstree.begin();

ite != mstree.end();

++ ite){

cout << (*ite).m_nVertexIndexA << "->"

<< (*ite).m_nVertexIndexB << " : "

<< (*ite).m_nWeight << endl;

iweight += (*ite).m_nWeight;

}

cout << mstree[mstree.size()-1].m_nVertexIndexB << "->"

<< mstree[0].m_nVertexIndexA << " : "

<< graph[mstree[0].m_nVertexIndexA][mstree[mstree.size()-1].m_nVertexIndexB]

<< endl;

iweight += graph[mstree[0].m_nVertexIndexA][mstree[mstree.size()-1].m_nVertexIndexB];

cout << "Total weight: " << iweight??<< endl;

}

private:

MST_Primm_mstPrim;

};

intmain()

{

const intcnNodeCount = 5;

vector > graph(cnNodeCount);

for(size_ti = 0;i < graph.size(); ++ i){

graph[i].resize(cnNodeCount,numeric_limits::max());

}

graph[0][1] = 5;

graph[0][2] = 1;

graph[0][3] = 2;

graph[0][4] = 3;

graph[1][0] = 5;

graph[1][2] = 4;

graph[1][3] = 2;

graph[1][4] = 2;

graph[2][1] = 4;

graph[2][0] = 1;

graph[2][3] = 5;

graph[2][4] = 3;

graph[3][1] = 2;

graph[3][2] = 5;

graph[3][0] = 2;

graph[3][4] = 2;

graph[4][1] = 2;

graph[4][2] = 3;

graph[4][3] = 2;

graph[4][0] = 3;

AA_TSP aa(graph);

aa.Get_AA_Path();

return0;

}

2 一般的旅行售貨員問題

在費用函數不一定滿足三角不等式的一般情況下,不存在具有常數性能比的解TSP問題的多項式時間近似算法,除非P=NP。換句話說,若P≠NP,則對任意常數ρ>1,不存在性能比為ρ的解旅行售貨員問題的多項式時間近似算法。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 圖靈機
    +關注

    關注

    1

    文章

    8

    瀏覽量

    2242

原文標題:NP 完全性理論與近似算法

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    李雅普諾夫穩(wěn)定性理論

    李雅普諾夫穩(wěn)定性理論1892年,俄國Lyapunov在《運動穩(wěn)定性的 一般問題》中提出了穩(wěn)定性理論主要內容:李氏第一法(間接法):求解特征方程   特征值李氏第二法(直接法):利用經驗和技巧來構造L函數
    發(fā)表于 05-26 11:50

    清華大學的線性理論

    清華大學的線性理論
    發(fā)表于 05-14 12:44

    ComputeColStats UDF中 近似算法的介紹

    的平衡。接下來的內容是關于目前在ComputeColStats中用的一些近似算法。二,收集的內容目前針對列主要會收集以下統(tǒng)計信息:cntRows : 列中總數據個數,包括nulll值avgColLen
    發(fā)表于 04-26 15:42

    開槽波導3次諧波回旋行波放大管非線性理論與數值模擬

    開槽波導3次諧波回旋行波放大管非線性理論與數值模擬 本文討論了開槽圓柱波導的高頻場分布,給出了注波互作用自洽非線性理論.在電子作大回旋
    發(fā)表于 10-21 22:13 ?1011次閱讀
    開槽波導3次諧波回旋行波放大管非線<b class='flag-5'>性理論</b>與數值模擬

    電源完整性理論基礎

    電源完整性理論基礎,很全面的經驗總結喲,電源完整性
    發(fā)表于 12-22 14:49 ?15次下載

    基于改進的多元自適應樣條回歸的全局近似算法_羅小玲

    基于改進的多元自適應樣條回歸的全局近似算法_羅小玲
    發(fā)表于 03-16 14:50 ?1次下載

    簡稱 PI(power integrity)電源完整性理論基礎

    簡稱 PI(power integrity)電源完整性理論基礎
    發(fā)表于 09-15 17:23 ?12次下載
    簡稱 PI(power integrity)電源完整<b class='flag-5'>性理論</b>基礎

    改進凸包插值算法結合大概率優(yōu)化的演化算法

    近似算法在解決超大規(guī)模旅行商問題時無法獲得高精度優(yōu)化解(或者次優(yōu)解),智能算法雖然可以獲得精度高于近似算法的解,很難在合理時間內獲得。采用改良的凸包近似算法構成初始解并結合大概率優(yōu)化策
    發(fā)表于 11-22 11:48 ?4次下載

    團圖點刪除問題的近似算法

    針對團圖點刪除問題的3一近似算法得到的近似解可能較大的問題,通過對團圖點刪除問題及團圖特性的分析,提出了該問題的一個新的近似算法。新算法通過考察圖中節(jié)點的一階和二階鄰點來計算節(jié)點關聯的
    發(fā)表于 01-04 14:58 ?0次下載

    如何使用Visual C++實現裝箱問題的BF算法

    c 的箱子里。采用不同裝箱方法所需的箱子數可能不同[1] 。要解決的問題是如何使用最少的箱子數將這 m 種貨品裝進去。裝箱問題是 NP 問題,這是不容易得到一個最佳的解決方案,為了比較快速得到滿意解,近似算法經常被使用。常見的算法
    發(fā)表于 05-13 08:00 ?1次下載
    如何使用Visual C++實現裝箱問題的BF<b class='flag-5'>算法</b>

    基于量子軟件的量子絕熱近似算法求解

    經典近似算法求解最大割問題時,時間復雜度與圖的復雜度呈正相關。為提高求解效率,使用量子絕熱近似算法求解無向圖最大割問題哈密頓量的基態(tài),其基態(tài)對應該問題的最優(yōu)解。該算法的時間復雜度不依賴于圖的頂點
    發(fā)表于 05-12 14:28 ?8次下載

    電磁彈性理論及其應用—電磁彈性結構力學的理論模型等

    介紹了電磁彈性理論及其應用—電磁彈性結構力學的理論模型、研究方法、定量分析程序
    發(fā)表于 02-13 10:39 ?2次下載

    反饋放大器的穩(wěn)定性理論及應用

    eetop.cn_反饋放大器的穩(wěn)定性理論及應用
    發(fā)表于 06-13 14:44 ?9次下載

    彈塑性理論

    彈塑性理論,介紹物體在受力作用下的彈塑性變形
    發(fā)表于 06-26 09:36 ?0次下載

    近似算法及對某些標準問題的適用性

      背景數學表達式的評估常伴隨常量、變量分析和方程的階,可用于衡量近似的復雜度。此類評估將問題分解為 P 和 NP 難問題。P 問題和 NP 問題的策略P 問題是指可以在多項式時間內求解的問題。
    的頭像 發(fā)表于 07-06 11:02 ?777次閱讀