10

我想解決整數編程問題。我都試過使用SCIPLPSolve解決整數線性規劃:爲什麼求解器求解可解實例是不可行的?

例如,假設A和B的最終值,我想在下面的C#代碼來解決瓦拉:

Int32 a = 0, b = 0; 
a = a*-6 + b + 0x74FA - valA; 
b = b/3 + a + 0x81BE - valA; 
a = a*-6 + b + 0x74FA - valA; 
b = b/3 + a + 0x81BE - valA; 
// a == -86561, b == -32299 

其中我實現這個整數在LP格式程序(捨去除法引起併發症少):

min: ; 
+valA >= 0; 
+valA < 92; 
remAA_sign >= 0; 
remAA_sign <= 1; 
remAA <= 2; 
remAA >= -2; 
remAA +2 remAA_sign >= 0; 
remAA +2 remAA_sign <= 2; 
remAA +4294967296 remAA_range >= -2147483648; 
remAA +4294967296 remAA_range <= 2147483647; 
remAA +4294967296 remAA_range +2147483648 remAA_sign >= 0; 
remAA +4294967296 remAA_range +2147483648 remAA_sign <= 2147483648; 
-1 remAA +4294967296 remAA_range +3 remAA_mul3 = 0; 
remAB_sign >= 0; 
remAB_sign <= 1; 
remAB <= 2; 
remAB >= -2; 
remAB +2 remAB_sign >= 0; 
remAB +2 remAB_sign <= 2; 
remAB +4294967296 remAB_range >= -2147483648; 
remAB +4294967296 remAB_range <= 2147483647; 
remAB +4294967296 remAB_range +2147483648 remAB_sign >= 0; 
remAB +4294967296 remAB_range +2147483648 remAB_sign <= 2147483648; 
+1431655765 remAA +1 offA -2 valA +1 offB -1 remAB +4294967296 remAB_range +3 remAB_mul3 = 0; 
a = -86561; 
b = -32299; 
offA = 29946; 
offB = 33214; 
-4 offA +3 valA +1431655765 remAA +1 offB +4294967296 Fa - a = 0; 
+477218588 remAA -1431655769 offA -1431655764 valA -1431655763 offB +1431655765 remAB +4294967296 Fb - b = 0; 
int valA; 
int remAA; 
int remAA_range; 
int remAA_sign; 
int remAA_mul3; 
int remAB; 
int remAB_range; 
int remAB_sign; 
int remAB_mul3; 
int Fa; 
int Fb; 
int offA; 
int offB; 
int a; 
int b; 

,然後試圖解決這個問題:

The model is INFEASIBLE 

但是,我知道有一個可行的解決方案,因爲我知道一個可行的變量賦值。 添加下列條件使溶液被發現:

a = -86561; 
b = -32299; 
offA = 29946; 
offB = 33214; 
valA = 3; 
remAA = 0; 
remAA_range = 0; 
remAA_sign = 0; 
remAA_mul3 = 0; 
remAB = 1; 
remAB_range = 0; 
remAB_sign = 0; 
remAB_mul3 = -21051; 
Fa = 0; 
Fb = 21054; 

兩個不同的解算器都聲稱這是可行的問題是不可行的。我違反了一些不成文的條件嗎?這是怎麼回事?有解決方案能夠真正解決問題嗎?

+0

如果您構建模型,請導出.lp文件並將其發送給我,我將通過CPLEX運行它。它有很好的衝突(不可行性)信息。我的電子郵件地址是我在gmail dot com的用戶名。我想你也可以把它放在Pastebin或類似的東西上。 – raoulcousins

+0

@raoul我通過電子郵件發送了與scip一起使用的lp-cplex文件。 –

+0

我用CPLEX解決了這個問題,這是可行的。最優解有一個目標函數值爲零。這與LP弛豫相同,其具有條件編號(kappa)爲3.4的基礎矩陣。有了額外的約束,目標函數是一樣的;條件編號爲4.6。我不確定CPLEX在這個問題上的做法與SCIP不同。您可以使用neos-server.org解決您的模型並使用CPLEX嗎? – raoulcousins

回答

14

MIP求解器使用浮點數據。對於數據量級差異很大的問題,這會導致舍入誤差。任何LP求解器都必須對這些數據執行操作,這可能會放大問題。在某些情況下,比如你的問題,這可以使解算器得出結論,當問題不存在時,問題是不可行的。當您修復變量時,解算器執行的浮點操作更少。

Gurobi或cplex這樣的商業解算器解算器通常可以更好地處理像您這樣的數字難度較大的數據。 Gurobi的參數QuadPrecision適用於更高精度的浮點數。大多數解算器都有一個參數,可以使求解器在數值難度的數據下更好地工作。例如,LPSolve有一個參數epsint,這將使它放鬆它認爲是一個整數的東西。該參數的默認值是10e-7,因此0.9999999將被視爲整數,但0.9999998不會。您可以增大此值,但您可能會收到不可接受的結果。您正在遇到leaky abstrction。您的問題在技術上屬於混合整數編程的範圍,但MIP解算器不是爲解決此問題而設計的。混合整數編程是一個NP難題。在所有輸入上快速可靠地運行解算器是不可能的。 MIP解決方案試圖很好地處理來自不同領域的問題,例如組合優化,供應鏈計劃和網絡流。它們不是爲了解決密碼學問題而設計的。

0

您還可以看看SCIP 3.1.0,特別是其擴展的精度算術功能。使用GMP,LP解決方案可以被計算到一個非常高的準確度。

相關問題