Я пытаюсь решить некоторые задачи квадратичного линейного программирования, используя gurobi и python, но с ошибкой типа
gurobipy.GurobiError: Objective Q не PSD (требуется корректировка по диагонали 1.0e+00)
У меня проблема с этой ошибкой.
Итак, я попробовал простой пример, например..
Минимизировать x1 * x2
При условии
x1 ‹= 30 и x1 >= 20
х2 ‹= 30 и х2 >= 20
и
Максимум x1 * x2
При условии
x1 ‹= 30 и x1 >= 20
х2 ‹= 30 и х2 >= 20
Гуроби может решить первое, но не второе.
from gurobipy import *
m = Model()
#variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, lb=20, ub=30, name="x1")
x2 = m.addVar(vtype=GRB.CONTINUOUS, lb=20, ub=30, name="x2")
m.update()
m.setObjective(x1 * x2, GRB.MINIMIZE) # or GRB.MAXIMIZE
m.update()
m.optimize()
Я изменил MINIMIZE на MAXIMIZE, надеясь получить оптимальную цель 900, но гуроби не может справиться с этой проблемой. Вот мой результат.
Свернуть случай
Optimize a model with 0 rows, 2 columns and 0 nonzeros
Model has 1 quadratic objective term
Coefficient statistics:
Matrix range [0e+00, 0e+00]
Objective range [0e+00, 0e+00]
QObjective range [2e+00, 2e+00]
Bounds range [2e+01, 3e+01]
RHS range [0e+00, 0e+00]
Presolve removed 0 rows and 2 columns
Presolve time: 0.00s
Presolve: All rows and columns removed
Barrier solved model in 0 iterations and 0.00 seconds
Optimal objective 4.00000000e+02
МАКСИМИЗИРОВАТЬ дело
Optimize a model with 0 rows, 2 columns and 0 nonzeros
Model has 1 quadratic objective term
Coefficient statistics:
Matrix range [0e+00, 0e+00]
Objective range [0e+00, 0e+00]
QObjective range [2e+00, 2e+00]
Bounds range [2e+01, 3e+01]
RHS range [0e+00, 0e+00]
Traceback (most recent call last):
File "C:\Users\encl1\.conda\envs\kicarus\lib\site- packages\IPython\core\interactiveshell.py", line 3296, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-98-df9d183baafd>", line 16, in <module>
m.optimize()
File "model.pxi", line 727, in gurobipy.Model.optimize (../../src/python/gurobipy.c:57790)
gurobipy.GurobiError: Objective Q not PSD (diagonal adjustment of 1.0e+00 would be required)
Пожалуйста, объясните, почему MAXIMIZE не работает, хотя MINIMIZE работает.