Почему MIP невозможен, когда cplex presolve включен?

Я использую вызываемую библиотеку cplex (версия 12.6.3) в программе на c ++ для решения смешанной целочисленной программы. Соответствующая часть кода выглядит следующим образом:

loadSubProblem();

double TimeLimit = 999999;
double MipGap = 0.00;
double NbMipSol = 999999;

//status = CPXsetintparam(subenv, CPX_PARAM_PREIND, CPX_OFF); // set presolve on/off
status = CPXsetdblparam(subenv, CPX_PARAM_TILIM, TimeLimit);   // time limit of ... (s)
status = CPXsetintparam(subenv, CPX_PARAM_INTSOLLIM, 1); // stop after 1 solution
status = CPXsetintparam(subenv, CPXPARAM_MIP_Strategy_File, 3); // 0    No node file  // 1  Node file in memory and compressed; default // 2    Node file on disk // 3  Node file on disk and compressed (see: https://www.ibm.com/support/knowledgecenter/de/SSSA5P_12.7.0/ilog.odms.cplex.help/CPLEX/Parameters/topics/NodeFileInd.html)

FILE * fp;
fp = CPXfopen("logfile_sub.log", "w");
status = CPXsetlogfile(subenv, fp);

status = CPXmipopt(subenv, subproblem);
status = CPXgetstat(subenv, subproblem);
// close log file
status = CPXsetlogfile(subenv, NULL);

int cur_numcols = CPXgetnumcols(subenv, subproblem);

// Obtain solution
double objval;
double best_bound;
solstat = 0; // reset solstat
status = CPXgetbestobjval(subenv, subproblem, &best_bound);
status = CPXsolution(subenv, subproblem, &solstat, &objval, primalsolution_subproblem, NULL, NULL, NULL);

Первая строка правильно строит подзадачу, как я могу проверить из lp-файла. Состояние CPXmipopt равно 0. Однако, согласно лог-файлу, решатель, кажется, останавливается преждевременно, и целочисленное решение не найдено. CPXgetstat возвращает статус 103 («целое число неосуществимо»). Следовательно, ошибка возникает в последней строке, где статус 1217 («решения не существует»). Солстат по-прежнему 0.

тем не мение, когда пресолвер выключен (в строке 7), проблема, похоже, не возникает. CPXmipopt завершается со статусом 0, файл журнала показывает, что найдено целочисленное решение, и решение может быть получено с использованием CPXsolution (solstat равен 104, как и ожидалось).

Мой вопрос таков: какие причины могут быть причиной такого поведения? Почему включение препроцессора приводит к невозможности найти решение и как его можно решить?

1

Решение

Основываясь на полезных комментариях, я понял, что моя проблема действительно плохо обусловлена. Различия в допусках (как описано в комментариях и техническая записка), проблема стала «выполнимой», когда отключена функция предварительного разрешения.

Переписав мою проблему, она оказывается неосуществимой, независимо от того, включена или выключена функция предварительного разрешения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]