Я решал некоторые пластинки с gurobi, и я заметил, что для большинства случаев, с которыми я сталкиваюсь, построение модели занимает больше времени, чем фактически ее решение. Возможно, это стандартно, но для меня это кажется странным.Gurobi долгое время строил модель для LP
Один конкретный экземпляр занял 1,75 секунд, чтобы решить, но следующий участок кода для построения модели взяли 13,6 секунды:
for (int i = 0; i < numSeq2; ++i) {
expr = new GRBLinExpr();
//expr.clear();
for (int j = 0; j < numSeq1; ++j)
expr.addTerm(-1 * A[j][i], x[j]);
for (int j = 0; j < numIS2; ++j)
expr.addTerm(-1 * F[j][i], q[j]);
duals[i] = model.addConstr(expr, GRB.LESS_EQUAL, 0, "");
}
В примере, описанном выше, numSeq1 = 7475, numSeq2 = 7475, numIS2 = 2517, а окончательный LP имел 9992 строки и 9992 столбца. Я знаю, что это довольно большой, но, похоже, странно, что для создания модели требуется почти 10 раз больше времени, чем для ее решения.
Я попробовал expr.clear() вместо создания нового GRBLinExpr для каждого ограничения (закомментировал), и это не помогло.
Есть ли какой-нибудь способ сделать модельную конструкцию гуроби быстрее? Будет ли cplex лучше, чем gurobi в этом отношении, если узкое место строит модель?
Спасибо!
Tarik: Предположим, что я сейчас только забочусь о скорости (а не изящество или лаконичность), как вы думаете, эти другие языки помогут? – beserious
Нет: правильно написанный код с интерпретированным языком моделирования не будет быстрее, чем правильно написанный код, используя API-интерфейс решателя. Незначительная причина этого заключается в том, что сами системы моделирования называют решающие API. –
Я честно не знаю. Если кто-то не испытывает опыта с Gurobi, я не думаю, что вам следует ожидать большой части ответа на этом сайте. Тем не менее, хотя и большой, ваша проблема кажется довольно простой, и было бы не так много времени для изучения альтернатив, таких как создание входных файлов MPS, которые бывают в текстовой форме и не потребуют значительной части кривой обучения. – Tarik