【发布时间】:2014-06-24 06:07:57
【问题描述】:
我使用 SCIP 3.0.2 和 cplex 12.6 作为 LP 求解器。我的模型需要列生成。我已经在 CPLEX 中实现了它,但由于 CPLEX 只能在根节点中进行 CG,因此我使用 SCIP 来进行 Branch-and-Price。 在 CPLEX 中,关闭启发式、切割和预处理/探测是有益的。我在 SCIP 中设置了以下内容:
SCIP_CALL( SCIPsetBoolParam(scip, "lp/presolving", FALSE) );
SCIPsetSeparating(scip, SCIP_PARAMSETTING_OFF, true); //disable cuts
SCIPsetHeuristics(scip, SCIP_PARAMSETTING_OFF, true); //disable heuristics
SCIPsetPresolving(scip, SCIP_PARAMSETTING_OFF, true); //disable presolving
我的参数文件如下所示:
display/primalbound/active = 1
presolving/maxrounds = 0
separating/maxrounds = 0
separating/maxroundsroot = 0
separating/maxcuts = 0
separating/maxcutsroot = 0
lp/initalgorithm = d
lp/resolvealgorithm = d
lp/fastmip = 1
lp/threads = 1
limits/time = 7200
limits/memory = 2900
limits/absgap = 0
#display/verblevel = 5
#display/freq = 10
为了检查模型是否相同,我在 SCIP 中求解了 CPLEX 模型(没有 CG),我获得了与使用 SCIP 生成的模型相同的 LP 边界,但与使用 CPLEX 求解时的 LP 边界不同。
似乎 SCIP 仍在使用一些我尚未停用的“魔法”。所以我的问题是我必须停用什么才能获得仅依赖于我的模型的 LP-bound。
我已经查看了统计输出,确实有一些事情可能有助于解决问题:
- 约束 #EnfoLP 将 1 列为积分(由于禁用了切割,这似乎很奇怪?)
- 转换后的问题似乎没问题。统计输出打印:
已解决的问题: 问题名称:t_ARLP 变量:969(806二进制,0整数,0隐式整数,163连续) 约束:初始 9311,最大 9311
在迭代开始之前,我得到以下信息:
LP Solver : 基的行表示不可用 -- SCIP 参数 lp/rowrepswitch 无效 转换后的问题有 897 个变量(806 bin, 0 int, 0 impl, 91 cont)和 9311 个约束
9311 类型
预解决: 预解(0轮): 0 个已删除变量、0 个已删除约束、0 个添加约束、0 个收紧边界、0 个添加孔、0 个更改边、0 个更改系数 0 个影响,0 个派系 预先解决的问题有 897 个变量(806 bin, 0 int, 0 impl, 91 cont)和 9311 个约束
9311 类型
预求解时间:0.00
我添加了 72 列:91 原始 +72 添加 = 总共 163。这似乎没问题。
我添加了建议的参数。似乎域传播以前没有使用过,但已经有了强大的分支。不幸的是,参数没有任何变化。
除了添加参数之外,我还尝试改用 SCIP 3.0.1。这将我的界限从 670.194 提高到了 699.203,但这与 754.348 的 cplex 界限仍然有很大不同。我知道求解器的数值参数有很多差异,但我猜差异太大而不是由这些参数引起的?
【问题讨论】:
标签: scip