Я пишу программу на Java для решения проблемы MIP с Gurobi. Эта проблема требует множества ограничений и переменных, но первые из них не могут быть добавлены в мою модель. Глубже в проблеме, когда я пытаюсь добавить ограничение, модель показывает его (читается через отладку), но row_no
равно -1. Перво-наперво:
Создайте многомерную матрицу переменных:
GRBVar[][] x = new GRBVar[iMax][jMax]; for (int i = 0; i < iMax; i++) { for (int j = 0; j < jMax; j++) { x[i][j] = model.addVar(0.0, GRB.INFINITY, 0.0, GRB.SEMIINT, "xi" + i + "j" + j); } }
Добавьте ограничения (выглядит как Xij ‹10):
for (int i = 0; i < iMax; i++) { for (int j = 0; j < jMax; j++) { GRBLinExpr lhs = new GRBLinExpr(); GRBLinExpr rhs = new GRBLinExpr(); lhs.addTerm(1.0, x[i][j]]); rhs.addConstant(10); model.addConstr(lhs, GRB.LESS_EQUAL, rhs, "Vi" + i + "j" + j); } }
Отладка проекта: есть
iMax * jMax
столбца,iMax * jMax
переменные,iMax * jMax
ограничения (сrow_no
= -1) и 0 строк.
Любая идея?
РЕДАКТИРОВАТЬ
Я не уверен в использовании row_no
, но полагаю, что Gurobi (с абстрактной точки зрения) организует данные в псевдоматрицу, где переменные хранятся в виде столбцов, а ограничения - в виде строк. Почему я так говорю? Поскольку каждый раз, когда я добавляю переменную, счетчик столбцов увеличивается на 1, а его col_no
связаны с конкретным столбцом, вместо этого, когда я добавляю ограничение, счетчик строк не изменяется.
Столбцы: http://www.gurobi.com/documentation/6.0/refman/java_grbmodel_getcol.html Строки: http://www.gurobi.com/documentation/6.0/refman/java_grbmodel_getrow.html
РЕДАКТИРОВАТЬ 2
У меня нет проблем со столбцами, строками или чем-то еще, но когда я пытаюсь решить расслабленную модель, Гуроби показывает следующий результат:
Optimize a model with 0 rows, 1475400 columns and 0 nonzeros
Coefficient statistics:
Matrix range [0e+00, 0e+00]
Objective range [0e+00, 0e+00]
Bounds range [1e+00, 1e+03]
RHS range [0e+00, 0e+00]
Presolve removed 0 rows and 1475400 columns
Presolve time: 0.36s
Presolve: All rows and columns removed
Iteration Objective Primal Inf. Dual Inf. Time
0 0.0000000e+00 0.000000e+00 0.000000e+00 1s
Solved in 0 iterations and 0.72 seconds
Optimal objective 0.000000000e+00
Решение возможно, но не может показать никакой полезной информации. Я подумал, что мне следует обновлять модель только после добавления переменных, а не ограничений. Кроме того, я прочитал из документации Gurobi, что если модель необходимо обновить, она выдает исключение (не в моем случае):
«Наиболее частым признаком отсутствия обновления является исключение NOT_IN_MODEL, которое указывает на то, что объект, на который вы пытаетесь сослаться, еще не включен в модель»
РЕДАКТИРОВАТЬ 3
Я следил за вашим предложением обновить модель (после добавления ограничений), и все работает правильно. Я предположил, что это не было обязательным, но, в отличие от документации (и примеров кода), это так.