日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NP完全性理论与近似算法

發布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NP完全性理论与近似算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


一、圖靈機


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


  • 改變有限狀態控制器中的狀態。

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

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


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


  • Q是有限個狀態的集合。

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

  • I是輸入符號的集合

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

  • q0是初始狀態。?? ???

  • qf是終止(或接受)狀態。

  • δ是移動函數。


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


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


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


    確定型圖靈機



    有限狀態集Q,狀態q0:初始狀態;qy:接受狀態;狀態qn:不接受狀態。


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


    轉換功能:



    輸入x = 101000b


    執行順序:


    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完全問題都還沒有多項式時間算法。


    對于這類問題,通常可采取以下幾種解題策略。


  • 只對問題的特殊實例求解

  • 用動態規劃法或分支限界法求解

  • 用概率算法求解

  • 只求近似解

  • 用啟發式方法求解


  • 近似算法的性能


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


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


    該近似算法的相對誤差定義為:。若對問題的輸入規模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的最小生成樹的算法設計找近似最優的旅行售貨員回路的算法。


    void approxTSP (Graph g)

    {

  • 選擇g的任一頂點r;

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

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

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

  • }

    ???

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

    ?

    實現


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

    *?作者:chinazhangjie

    *?郵箱:chinajiezhang@gmail.com

    *?開發語言:?C++

    *?開發環境:?Virsual?Studio?2005

    *?時間:?2010.12.06

    */

    ?

    #include <iostream>

    #include <vector>

    #include <limits>

    using namespace?std?;

    ?

    struct?TreeNode

    {

    public:

    ????TreeNode?(int?nVertexIndexA?=?0,?int?nVertexIndexB?=?0,?int?nWeight?=?0)

    ????????:?m_nVertexIndexA?(nVertexIndexA),

    ????????m_nVertexIndexB?(nVertexIndexB),

    ????????m_nWeight?(nWeight)

    ????{?}

    public:

    ????int?m_nVertexIndexA?;

    ????int?m_nVertexIndexB?;

    ????int?m_nWeight?;

    }?;

    ?

    class?MST_Prim

    {

    public:

    ????MST_Prim?()

    ????{}

    ????MST_Prim?(const?vector<vector<int> >&?vnGraph)

    ????{

    ????????m_nvGraph?=?vnGraph?;

    ????????m_nNodeCount?=?(int)m_nvGraph.size?()?;

    ????}

    ????void SetData?(const?vector<vector<int> >&?vnGraph)

    ????{

    ????????m_nvGraph?=?vnGraph?;

    ????????m_nNodeCount?=?(int)m_nvGraph.size?()?;

    ????}

    ????//

    ????const?vector<TreeNode>&?GetMSTree?()?const

    ????{

    ????????return?m_tnMSTree?;

    ????}

    ????//

    ????const?vector<vector<int> >&?GetGraph?()?const

    ????{

    ????????return????m_nvGraph?;

    ????}

    ????void DoPrim?()

    ????{

    ????????//?是否被訪問標志

    ????????vector<bool>?bFlag?(m_nNodeCount,?false)?;

    ????????bFlag[0]?=?true?;

    ?

    ????????int?nMaxIndexA?;

    ????????int?nMaxIndexB?;

    ????????int?j?=?0?;

    ????????while?(j?<?m_nNodeCount?-?1)?{

    ????????????int?nMaxWeight?=?numeric_limits<int>::max?()?;

    ????????????//?找到當前最短路徑

    ????????????int?i?=?0?;

    ????????????while?(i?<?m_nNodeCount)?{

    ????????????????if?(!bFlag[i])?{

    ????????????????????++?i?;

    ????????????????????continue?;

    ????????????????}

    ????????????????for?(int?j?=?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<TreeNode>::const_iterator?ite?=?m_tnMSTree.begin()?;

    ????????????????ite?!=?m_tnMSTree.end()?;

    ????????????????++?ite?)?{

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

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

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

    ????????}*/

    ????}

    ?

    private:

    ????vector<vector<int> >?m_nvGraph?;????//?無向連通圖

    ????vector<TreeNode>????m_tnMSTree?;????//?最小生成樹

    ????int????m_nNodeCount?;

    }?;

    ?

    ?

    class?AA_TSP

    {

    public:

    ????AA_TSP?(const?vector<vector<int> >&?vnGraph)

    ????{

    ????????m_mstPrim.SetData(vnGraph)?;

    ????}

    ????void Get_AA_Path?()

    ????{

    ????????m_mstPrim.DoPrim?()?;

    ????????vector<TreeNode>????????mstree?=?m_mstPrim.GetMSTree?()?;

    ????????vector<vector<int> >????graph?=?m_mstPrim.GetGraph()?;

    ????????int?iweight?=?0?;

    ????????for?(vector<TreeNode>::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_Prim????m_mstPrim?;

    };

    int?main()

    {

    ????const int?cnNodeCount?=?5?;

    ????vector<vector<int> >?graph?(cnNodeCount)?;

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

    ????????graph[i].resize?(cnNodeCount,?numeric_limits<int>::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?()?;

    ?????return?0?;

    }


    • 2 一般的旅行售貨員問題

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


    來源:獨酌逸醉

    www.cnblogs.com/chinazhangjie/archive/2010/12/06/1898070.html



    總結

    以上是生活随笔為你收集整理的NP完全性理论与近似算法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 成人毛片基地 | bbbbbbbbb毛片大片按摩 | 欧美一区二区三区久久妖精 | 97操操| 日韩欧美福利视频 | 久久国产精品影视 | 国产www在线观看 | 三级男人添奶爽爽爽视频 | 朝桐光在线观看 | 亚洲熟女乱综合一区二区三区 | 国产91福利 | 欧美精品久久久久久 | 伦理黄色片| 中日韩精品在线 | 2018天天操| 五月天久久久 | 亚洲va在线观看 | 久久久影视 | 潘金莲黄色一级片 | 日本久久高清 | 日韩国产精品一区二区 | 国产aⅴ精品一区二区三区久久 | 羞羞漫画在线 | 日韩影院一区二区 | 黄网址在线| 亚洲综合一二三 | 成人午夜影视 | av自拍 | 国产成人精品免费网站 | 一区二区高清在线 | 国产精品久久久久久人妻精品动漫 | 国产又粗又长又大视频 | 亚洲婷婷综合网 | 越南少妇做受xxx片 亚洲av综合色区无码一二三区 | 欧美亚韩一区二区三区 | 久热久 | 亚洲色成人网站www永久四虎 | 五月天久久久久 | 啪啪综合网 | 亚洲videos | 美女黄视频大全 | 久久久久99精品成人片试看 | 成年人网站免费 | 先锋影音av中文字幕 | 国产成人影视 | 亚洲国产欧美日韩 | 国产午夜一级片 | 我们的2018在线观看免费高清 | 岛国免费视频 | 综合99 | 亚洲欧美日韩色 | 日本日韩欧美 | 精品久久久久亚洲 | 久久午夜激情 | 最新毛片网 | 成人免费无遮挡无码黄漫视频 | 成人黄色免费网址 | 国产又爽又黄又嫩又猛又粗 | 亚洲AV无码一区二区三区蜜桃 | 人人爽久久涩噜噜噜网站 | 亚洲精品国产91 | 深田咏美中文字幕 | 五月天超碰| 国产精品欧美一区二区 | 亚洲黄色一区二区 | 无码国产精品高潮久久99 | 在线免费看污片 | 成人免费视频播放 | 国产欧美日韩精品一区 | 重口另类| 日本做爰三级床戏 | 国产一级久久 | 黄色香港三级三级三级 | 超碰人人99 | 在线视频精品一区 | 色猫咪av | 激情视频亚洲 | 91网站免费观看 | 日韩在线视频播放 | 欧美cccc极品丰满hd | www.avcao| 国产情侣久久久久aⅴ免费 caoporn成人 | 国产视频一二 | 国产又黄又猛又粗 | 国产成人精品视频一区二区 | 国产高清不卡一区 | chinese中国性按摩hd | 国产精品主播在线 | 中文字幕在线一区 | 成人入口 | 欧美精品激情 | 国产真实乱人偷精品视频 | 男女一级特黄 | 天天干人人 | 亚洲精品一区二区二区 | 一级久久久久久 | 久久久亚洲国产 | 岛国视频一区 | 在线观视频免费观看 |