Optimization 当原始模型可行时,为什么SCIPcopy模型不可行?
我是SCIP的新手,所以我不确定这是一个bug还是我只是做错了什么 我有一个MIP实例,它使用SCIP完美地解决了问题,但是当我试图解决模型的副本时,SCIP说它是不可行的。当“预解”处于禁用状态时,它似乎更为明显 我正在使用预装SCIP v3.2.0的windows。该模型只有二进制和整数变量 以下代码概述了我的尝试:Optimization 当原始模型可行时,为什么SCIPcopy模型不可行?,optimization,scip,Optimization,Scip,我是SCIP的新手,所以我不确定这是一个bug还是我只是做错了什么 我有一个MIP实例,它使用SCIP完美地解决了问题,但是当我试图解决模型的副本时,SCIP说它是不可行的。当“预解”处于禁用状态时,它似乎更为明显 我正在使用预装SCIP v3.2.0的windows。该模型只有二进制和整数变量 以下代码概述了我的尝试: SCIP* _scip, subscip; SCIPcreate(&_scip); SCIPincludeDefaultPlugins(_scip); SCIPcrea
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
可能相关的事情(对我来说似乎很奇怪)是,在解决了原始问题(并得到了可行的解决方案)之后,检查解决方案会报告一个不可行的结果。i、 e
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
解决方案值1违反[-0,0]的界限1
你知道为什么会这样吗?谢谢 一些变量边界仍在预先解决中。要解决此问题,我需要添加:
SCIPsetBoolParam(_scip, "lp/presolving", FALSE);
这解决了大多数问题,但以下内容也有助于解决一些“检查解决方案”问题:
SCIPsetIntParam(_scip, "propagating/maxrounds", 0);
SCIPsetIntParam(_scip, "propagating/maxroundsroot", 0);
SCIP中的传播可能会考虑到迄今为止已知的最佳解决方案,并且只对找到比此更好的解决方案的问题有效。 例如,如果您有一个最小化问题,其中n个变量
x_1,…,x_n
具有目标系数c_1,…,c_n>=0
,并且已经找到了x_1=1,x_2=…=x_n=0
,则传播将全局地将x_1
固定到0
,因为任何x_1=1
的解决方案的目标至少与您已经找到的解决方案的目标一样大
这意味着到目前为止找到的解决方案对于剩下的问题可能不再可行(这将寻找一个更好的解决方案)。
为了检查解决方案,您应该在原始问题空间中进行检查,您可以使用SCIPcheckSolOrig()
执行此操作
禁用传播预解可能会有所帮助,但不能保证全局预解问题不会更改。LP解算器中的预解不应成为问题,但可能会改变报告的最优LP解(如果存在多个最优解),从而导致解算过程发生变化。在这种情况下,这可能避免了您的问题,但可能纯粹是运气使然,而且该问题可能还会在其他情况下再次出现。此外,禁用的功能越多,对性能的负面影响就越大
但是,您的问题有一个简单的解决方案:您可以使用SCIPcopyOrig()
复制原始的未更改问题