如何用整數規划求解NP完全問題


如何用整數規划求解NP完全問題

一、NP完全問題

NP完全問題是一類具有非常高難度的組合最優化問題, 所有NP完全問題都是NP難問題。雖然P問題是比較容易的問題, NP問題卻不一定是困難問題,必須看見NP完全或者NP難這樣的字才能說這個問題求解起來很困難。

經常聽磚家說,NP完全/NP難問題不能用整數規划求解。實際情況怎樣?實事證明磚家的話只能信一半:)。這里咱就看看用整數規划求解一個NP完全問題行也不行。

這里有一個貨真價實的整數規划問題——划分問題(The partition problem)。問題是:給定一個大小不等的整數集合,問是否可以把這些整數划分成兩個集合,任何一個整數或者在集合S1中或者在S2中,但不能同時在兩個集合中;對任意給的一個整數集合,請設計算法,解決是否存在一個划分,使得S1種整數之和恰好等於S2集合的整數之和。

二、建立整數規划模型

對每個整數定義一個0-1變量xi, xi=1 表示第i個整數位於集合S1中, xi=0表示第i個整數位於S2中。用s1表示第一集合的整數之和,用s2表示第二個集合里的整數之和。即:

       

 

 

設d是s1和s2之間差的絕對值。於是:

 

           

 

我們只要極小化d就可以了,即:

        

完整模型:

                                

 三、上面的模型的文本表達

 上面的模型不只是用來擺擺看的,還可以真的被求解哈。我們需要把模型寫成文本格式(Leapms建模語言格式),讓計算機理解。目標函數就寫成

min d

加上其余約束部分(注意西格瑪符合的寫法)

subject to
    s1=sum{i=1,...,n}x[i]S[i]
    s2=sum{i=1,...,n}((1-x[i])S[i])
    d>=s1-s2
    d>=s2-s1

加上符號說明(符號必須說明,不然計算機不知道哪些是常數,哪些是變量)

where
    n is an integer
    S is a set
    s1,s2,d are variables of number
    x[i] is a variable of binary|i=1,...,n

加上數據(注意整數個數是從集合S上自己數出來的)

 

 

data_relation
    n=_$(S)
data
    S={11,47,159,137,85,47,142,35,119,61,88,175,13,96,-11,176,126,15,98,46,163}

四、求解

把如下完整模型貼到記事本上,保存為 partition.leap文件。(注意如果是partition.txt不行啊)。

min d
subject to
    s1=sum{i=1,...,n}x[i]S[i]
    s2=sum{i=1,...,n}((1-x[i])S[i])
    d>=s1-s2
    d>=s2-s1

where
    n is an integer
    S is a set
    s1,s2,d are variables of number
    x[i] is a variable of binary|i=1,...,n
data_relation
    n=_$(S)
data
    S={11,47,159,137,85,47,142,35,119,61,88,175,13,96,-11,176,126,15,98,46,163}

啟動leapms,依次打入load, partion, mip命令,即可得到解

 

 

 

如果需要用cplex求解,打入cplex命令即可。如果你的leapms版本不支持直接cplex調用,使用savemps命令把模型保存成mps格式而后用cplex求解(見 https://www.cnblogs.com/leapms/p/11843946.html)。

 五、結果分析

上面的結果d=0, s1=s2=914。顯然對給出的數據來說,有划分。

整數規划成功求解了一個NP完全問題。

 

 


免責聲明!

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



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