首页 文章

当原始模型可行时,为什么SCIPcopy模型不可行?

提问于
浏览
1

我是SCIP的新手,所以我不确定这是一个错误还是我做错了什么 .

我有一个完全使用SCIP解决的MIP实例,但是当我试图解决模型的副本时,SCIP说这是不可行的 . 当关闭presolve时,它似乎更明显 .

我正在使用预先构建的SCIP v3.2.0的Windows . 该模型只有二进制和整数变量 .

以下代码概述了我的尝试:

SCIP* _scip, subscip;
SCIPcreate(&_scip);
SCIPincludeDefaultPlugins(_scip);
SCIPcreateProbBasic(_scip, "interval_solver"));     // create an empty problem
SCIPsetPresolving(_scip, SCIP_PARAMSETTING_OFF, true);   //disable presolving

// build model (snipped)

SCIPsolve(_scip);  // succeeds and gives feasible solution

SCIP_Bool valid = FALSE;
SCIPcreate(&subscip);
SCIPcopy(_scip, subscip, NULL, NULL, "1", TRUE, FALSE, TRUE, &valid);

SCIPsolve(subscip);  // infeasible

可能与我相关的东西(对我而言似乎很奇怪)是在解决了原始问题(并获得可行解决方案)后,检查解决方案会报告不可行的结果 . 即

SCIP_SOL* sol = SCIPgetBestSol(_scip);
SCIPcheckSol(_scip, sol, TRUE, TRUE, TRUE, TRUE, &valid);

得到:

solution value 1 violates bounds of <t_x71_(6,1275,6805)_(9,1275,6805)>[-0,0] by 1

任何想法为什么会发生这种情况?谢谢!

2 回答

  • 1

    SCIP中的传播可以考虑到目前为止已知的最佳解决方案并且进行减少,这仅对于找到比此更好的解决方案的问题有效 . 例如,如果你有一个带有客观系数 c_1,...,c_n >= 0 的n个变量 x_1,...,x_n 的最小化问题,并且已经找到了 x_1 = 1, x_2 = ... = x_n = 0 的解决方案,那么传播将全局修复 x_10 ,因为任何具有 x_1 = 1 的解决方案的目标将至少与你已经找到的解决方案的目标 .

    这意味着到目前为止找到的解决方案对于剩下的问题(寻找严格更好的解决方案)可能不再可行 . 为了检查解决方案,您应该在原始问题空间中检查它,您可以使用 SCIPcheckSolOrig() 进行检查 .

    禁用预先传播传播可能会有所帮助,但不能保证全局预解决问题不会发生变化 . 在LP求解器中进行预处理应该不是问题,但可能已经改变了报告的最优LP解(如果存在多个最优),因此导致求解过程发生变化 . 在这种情况下,这可能避免了您的问题,但可能是纯粹的运气,问题可能仍然会在其他实例上再次出现 . 此外,您禁用的功能越多,这将对您的性能产生负面影响 .

    但是,您可以轻松解决问题:您可以使用 SCIPcopyOrig() 复制原始未更改的问题 .

  • 1

    一些变量界限仍在进行中 . 要修复我需要添加的问题:

    SCIPsetBoolParam(_scip, "lp/presolving", FALSE);
    

    这解决了大多数问题,但以下内容也有助于修复一些“检查解决方案”问题:

    SCIPsetIntParam(_scip, "propagating/maxrounds", 0);
    SCIPsetIntParam(_scip, "propagating/maxroundsroot", 0);
    

相关问题