2017-04-03 171 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