我是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
为什么会发生这种情况的任何想法?谢谢!
答案 0 :(得分:1)
一些变量界限仍在进行中。要修复我需要添加的问题:
SCIPsetBoolParam(_scip, "lp/presolving", FALSE);
这解决了大多数问题,但以下内容也有助于解决一些“检查解决方案”问题:
SCIPsetIntParam(_scip, "propagating/maxrounds", 0);
SCIPsetIntParam(_scip, "propagating/maxroundsroot", 0);
答案 1 :(得分:1)
SCIP中的传播可能会考虑到目前为止已知的最佳解决方案并进行减少,这些减少仅对找到比此更好的解决方案的问题有效。
例如,如果您的n个变量x_1,...,x_n
与目标系数c_1,...,c_n >= 0
存在最小化问题,并且已经找到了x_1 = 1, x_2 = ... = x_n = 0
的解决方案,那么传播将全局修复x_1
到{{ 1}},因为0
的任何解决方案的目标都至少与您已找到的解决方案的目标一样大。
这意味着到目前为止找到的解决方案对于剩下的问题(寻找严格更好的解决方案)可能不再可行。
为了检查解决方案,您应该在原始问题空间中进行检查,您可以使用x_1 = 1
进行检查。
禁用预先传播传播可能有所帮助,但不能保证不会更改全局预解决问题。在LP求解器中进行预处理应该不是问题,但可能已经改变了报告的最优LP解(如果存在多个最优),因此导致求解过程发生变化。在这种情况下,这可能避免了您的问题,但可能是纯粹的运气,问题可能仍然会在其他实例上再次出现。此外,您禁用的功能越多,这将对您的性能产生负面影响。
但是,您可以轻松解决问题:您可以使用SCIPcheckSolOrig()
复制原始未更改的问题。