生成列时没有双重限制

No dual bound when doing column generation

我目前正在实施列生成(多商品流的变体)。 注意:我禁用了预求解,因为我认为原型制作会更容易。 在这种情况下,定价工作正常:添加了正确的变量,相应地修改了约束等等——当在定价过程中没有发现更多变量时,SCIP 在该轮之前给出的原始边界是最优 objective 值.

我的问题是报告的双边界每次迭代都是“---”,SCIP 不认为解决方案是最优的。

我不太明白内部发生了什么,特别是因为 SCIP 在定价期间给我的双重解决方案 (SCIPgetDualSolLinear()) 是正确的,一个想法是 objective 功能以某种方式退化。

我能弄清楚的唯一相关的事情是它与预求解约束和将约束标记为可修改有关。

如果我不将约束标记为可修改,SCIP 会报告正确的双重绑定,但定价不起作用,因为 SCIPgetDualSolLinear() 失败 - 我的猜测是将约束标记为 'keeps it available for usage in pricing' 的可修改类型吗?无论如何,我想知道为什么原始约束应标记为可修改,当变量实际添加到从 SCIPgetTransformedCons().

获得的约束中时

无论预求解是打开还是关闭,不将约束标记为可修改会使 SCIP 产生双重边界,但如前所述,定价失败。唯一的例外是:如果我 运行 已经添加了所有变量的程序 并且 iff 预求解关闭,SCIPgetDualSolLinear() 会不会失败,即使约束未标记为可修改。在这种情况下,还会报告双重绑定。我想这支持了可修改标志与 'preserving structure'.

有关的想法

我希望这个描述是可以理解的,并且有人可以指出我正确的方向,我真的不知道如何继续。

谢谢

编辑:我只是尝试将从 SCIPgetTransformedCons() 获得的约束设置为可修改的,而不是原始的,但结果显然保持不变。

edit2,附加信息:我正在阅读 .lp 文件并在调用 activatePricerXyz() 期间使用 SCIPsetConsModifiable(),但在调用 activatePricer().

之前

好吧,大多数情况下,解决方案是阅读文档 :)

In the usual case that the pricer either adds a new variable or ensures that there are no further variables with negative dual feasibility, the result pointer should be set to SCIP_SUCCESS. Only if the pricer aborts pricing without creating a new variable, but there might exist additional variables with negative dual feasibility, the result pointer should be set to SCIP_DIDNOTRUN. In this case, which sometimes is referred to as "early branching", the LP solution will not be used as a lower bound. The pricer can, however, store a valid lower bound in the lowerbound pointer.

在我的例子中,成功指针设置为 SCIP_DIDNOTRUN,即使定价者可以保证最优。