Я считаю, что проблема в том, что вы даете Gurobi плотные версии своих ограничений, а не разреженные представления. Рассмотрим следующее ограничение:
error = GRBaddconstr(model, no_variable, ind, val, GRB_LESS_EQUAL, 0, "LOGICAL");
Здесь no_variable
равно 127940. Таким образом, при каждом вызове GRBaddconstr
вы передаете Gurobi значения коэффициента для всех 127940 переменных , несмотря на тот факт, что не более двух переменных в этом ограничении будут иметь ненулевые значения коэффициента. Это может занять много времени, если вы делаете это для каждого ограничения. Чтобы быть более эффективным, вы должны передавать информацию индекса / значения Gurobi только для переменных с ненулевыми коэффициентами. Обратитесь к документации для GRBaddconstr для получения более подробной информации об этом.
Это можно исправить с помощью нескольких небольших изменений кода. Вне ваших for
циклов определите два массива длины два, в которых будут храниться индексы и значения переменных с ненулевыми коэффициентами в конкретном «логическом» ограничении:
lInd = (int *) malloc(sizeof(int) * 2);
lVal = (double *) malloc(sizeof(double) * 2);
Затем в самом внутреннем for
l oop, установите соответствующие индексы и значения перед добавлением каждого ограничения:
lInd[0] = tmp_sabit + w;
lVal[0] = 1;
if (booking[orders[i]].o > 0) {
lInd[1] = tmp2;
lVal[1] = -1;
}
else if (t+1 < week_end) {
lInd[1] = tmp3;
lVal[1] = -1;
}
else {
lVal[1] = 0;
}
error = GRBaddconstr(model, 2, lInd, lVal, GRB_LESS_EQUAL, 0, NULL);
Наконец, обратите внимание, что ограничения должны иметь уникальные имена. Если ограничения имеют повторяющиеся имена, вы можете столкнуться с неожиданным поведением при попытке получить доступ к ограничениям по имени, прочитать / записать файл модели и т. Д. c.