Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 当原始模型可行时,为什么SCIPcopy模型不可行?_Optimization_Scip - Fatal编程技术网

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

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的新手,所以我不确定这是一个bug还是我只是做错了什么

我有一个MIP实例,它使用SCIP完美地解决了问题,但是当我试图解决模型的副本时,SCIP说它是不可行的。当“预解”处于禁用状态时,它似乎更为明显

我正在使用预装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
可能相关的事情(对我来说似乎很奇怪)是,在解决了原始问题(并得到了可行的解决方案)之后,检查解决方案会报告一个不可行的结果。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()
复制原始的未更改问题