Scip 生成列时没有双重绑定

Scip 生成列时没有双重绑定,scip,Scip,我目前正在实现列生成(多商品流的变体)。 注意:我禁用了预解决,因为我认为它更易于原型化。 在这种情况下,定价工作正常:添加正确的变量,相应地修改约束条件,等等——当定价过程中没有发现更多变量时,SCIP在该轮之前给出的原始界限就是最佳目标值 我的问题是,每次迭代报告的对偶界都是“---”,SCIP不认为解决方案是最优的 我不太明白内部发生了什么,特别是因为SCIP在定价过程中给我的对偶解决方案(SCIPgetDualSolLinear())是正确的,一个想法是目标函数以某种方式退化 我能弄明白

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

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

我不太明白内部发生了什么,特别是因为SCIP在定价过程中给我的对偶解决方案(SCIPgetDualSolLinear())是正确的,一个想法是目标函数以某种方式退化

我能弄明白的唯一相关的事情是,它与预解约束和将约束标记为可修改约束有关

如果我没有将约束标记为可修改的,SCIP会报告一个适当的双重界限,但定价不起作用,因为SCIPgetDualSolLinear()失败-我猜将约束标记为可修改的是“使其可用于定价”吗?无论如何,我想知道,当变量实际添加到从SCIPgetTransformedCons()获取的约束中时,为什么原始约束应该标记为可修改

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

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

谢谢

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


edit2,附加信息:我正在读取.lp文件,并在调用activatePricerXyz()期间使用SCIPsetConsModifiable(),但在调用activatePricer()之前,解决方案通常是读取文档:)

在通常情况下,pricer要么添加一个新变量,要么确保没有其他具有负双重可行性的变量,结果指针应设置为SCIP_SUCCESS。仅当定价者在不创建新变量的情况下中止定价,但可能存在具有负双重可行性的其他变量时,结果指针应设置为SCIP_DIDNOTRUN。在这种情况下,有时被称为“早期分支”,LP解不会用作下限。但是,pricer可以在lowerbound指针中存储有效的下限


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

您的定价者是否将结果指针设置为SCIP_success?它在开始时将其设置为SCIP_DIDNOTRUN,如果添加了变量,则将其设置为SCIP_success,我刚刚复制了Binpacking示例中所做的工作。我刚才更深入地研究了这一点,并将其更改为始终是SCIP_成功,因为定价者可以保证最优解决方案,现在我在上次定价运行后得到了一个双界!谢谢你的提示。。。如果我有明确的答案,我会更新这个问题。另外,如果您有时间详细说明将约束设置为modifiable实际上做了什么,我将不胜感激