首页 文章

当cplex预溶解为ON时,为什么MIP不可行?

提问于
浏览
1

我在c程序中使用cplex可调用库(版本12.6.3)来解决混合整数程序 . 代码的相关部分如下所示:

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(“没有解决方案存在”) . Solstat仍为0 .

However ,当预分解器关闭时(在第7行),似乎没有问题 . CPXmipopt以状态0结束,日志文件显示找到整数解,并且可以使用CPXsolution获得解决方案(solstat为104,如预期的那样) .

我的问题是:什么原因可能导致这种行为?为什么打开预处理器会导致找不到解决方案,如何解决?

1 回答

  • 1

    根据有用的评论,我发现我的问题确实是病态的 . 容差的差异(如评论和_2424629中所述)导致问题在预解决时关闭"feasible" .

    在重写我的问题后,无论是否开启预解决,它都是不可行的 .

相关问题