Заставить переменную быть целым числом CVXPY

Я пытаюсь заставить переменную быть целым числом (целочисленное ограничение), используя cvxpy в Python, но результат остается с плавающей запятой:

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 — переменные. Не только цифры.


person Aleharu    schedule 03.04.2017    source источник


Ответы (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 почти с полной точностью матричного числа с плавающей запятой.

(Если кто-то может уточнить эту мысль, пожалуйста).

person Zach Siegel    schedule 19.07.2017
comment
Привет, Зак, это правда. Результатом является ближайшее число с плавающей запятой к int. Я просто округляю. - person Aleharu; 07.09.2017
comment
Похоже, что последняя версия CVXPY решила эту проблему напрямую. См. cvxpy.org/tutorial/advanced/index.html. - person user1757436; 13.03.2019
comment
Думаю, вы имеете в виду аргумент ключевого слова integer=True. Хорошее обновление @user1757436 - person Zach Siegel; 13.03.2019