【问题标题】:SCIP unmodified LP-boundSCIP 未修改的 LP 绑定
【发布时间】: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。

我已经查看了统计输出,确实有一些事情可能有助于解决问题:

  1. 约束 #EnfoLP 将 1 列为积分(由于禁用了切割,这似乎很奇怪?)
  2. 转换后的问题似乎没问题。统计输出打印:

已解决的问题: 问题名称: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


    【解决方案1】:

    还有两件事可能会影响根节点处的 LP 界限:域传播和强分支。

    域传播是一种节点预处理,并试图根据当前的局部域和约束来减少变量域。强分支预先计算潜在子节点的 LP 边界以选择一个好的变量进行分支。如果检测到其中一个子节点不可行,则缩小其域。

    您可以通过设置禁用域传播

    propagating/maxrounds = 0
    propagating/maxroundsroot = 0
    

    可以通过为不应用强分支的分支规则设置高优先级来禁用强分支。例如,设置

    branching/pscost/priority = 100000000
    

    为了启用纯伪成本分支。

    通常,您应该检查 DomReds 列中非零值的统计信息。

    【讨论】:

      【解决方案2】:

      您可以将内部问题写入文件,然后将其与原始文件进行比较:

      SCIP> write transproblem
      

      您还应该彻底阅读 SCIP 的统计数据,以了解 SCIP 执行了什么样的“魔法”:

      SCIP> display statistics
      

      【讨论】:

        【解决方案3】:

        我几乎忘记了这个线程,然后又偶然发现它,并认为在自己找到答案后添加答案可能会很好: 在 cut 回调中(遗憾的是我没有提到我使用了一个)我使用了方法:

        SCIPisCutEfficacious
        

        它丢弃了一些与获得真正的 LP 界限相关的削减。不调用此方法会减慢求解过程,但至少可以保留结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-07
          • 1970-01-01
          • 1970-01-01
          • 2022-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-25
          相关资源
          最近更新 更多