3

我试图在 Python 中使用 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()]

Fi 和 Or 是变量。不仅仅是数字。

4

1 回答 1

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)and )更好的方法来获取整数的小数部分numpy.modf(x),但这不需要包导入。

请注意,您可以将阈值设置为 0.9999999999 而不仅仅是 0.9。cvxpy 的输出似乎int几乎可以达到 numpy 矩阵浮点数的全部精度。

(如果有人可以使这个想法更精确,请这样做)。

于 2017-07-19T16:29:02.697 回答