2017-04-03 72 views
0

我想使用Python中cvxpy強迫一個變量是一個整數(整數約束),但結果一直是一個浮動:強制一個變量是一個整數CVXPY

from cvxpy import * 

Fi = Int() 
Or = Int() 

constr = [Fi <= 3000, 
       Or <= 3000, 
       Or >= 1000, 
       1.25*Or - Fi >= 0, 
       Fi >= 0, 
       Or >= 0] 

obj= Maximize(50000*Fi + 25000*Or) 

prob = Problem(obj, constr) 
prob.solve() 

print ("Status: ", prob.status) 

print ("Fi: ", Fi.value) 
print ("Or: ", Or.value) 

print ("Obj: ", obj.value) 

結果:

Status: optimal 
Fi: 2999.9999999 
Or: 2999.99999989 
Obj: 224999999.992 

我能做些什麼來強制它?

我曾嘗試過:

Fi = Variable() 
Or = Variable() 

constr = [Fi <= 3000, 
       Or <= 3000, 
       Or >= 1000, 
       1.25*Or - Fi >= 0, 
       Fi >= 0, 
       Or >= 0, 
       Fi == Int(), 
       Or == Int()] 

網絡連接,或者是變量。不只是數字。

+0

@nico我也嘗試過'Fi = Variable()'並添加約束條件'Fi == Int()',我不能重複。在那個問題中,他們沒有使用cvxpy – Aleharu

+0

在你的約束條件下,1.25 *。你如何期望結果是Int? http://www.cvxpy.org/en/latest/tutorial/intro/index.html – ADL

+0

@ADL Fi不能超過Or的125%。這並不意味着Fi必須浮動 – Aleharu

回答

1

我有同樣的問題(與更多的變量)!我認爲cvxpy將解決方案存儲爲numpy.matrix變量以節省空間,哪種類型將每種解決方案都作爲浮點運算。我只是將我的輸出設置爲int。這應該爲你工作:

Fi_val = int(Fi.value)+(1 if (Fi.value - int(Fi.value)) >0.9 else 0) 
Or_val = int(Or.value)+(1 if (Or.value - int(Or.value)) >0.9 else 0) 

有更好的方法來獲得一個整數x的小數部分比x-int(x)(如Math.modf(x)numpy.modf(x)),但是這需要沒有包裝的產品進口。

請注意,您可以將閾值設置爲0.9999999999而不是0.9。 cvxpy的輸出似乎是一個int,幾乎達到了numpy矩陣浮點數的全部精度。

(如果有人可以使這個想法更精確,請做)。

+0

Hi Zach,這是真的。結果是距離int最近的浮點數。我只是圍繞它。 – Aleharu

相關問題