我在 C++ 中使用 SCIP 实现了分支割除算法。我的优化问题有一个最小化目标函数,目前我的代码有一个错误,我正在努力修复它。我的问题的最优值为 100,但程序返回 101。
查看分支定界树(使用可视化工具),我看到 SCIP 正在修剪 LP 边界为 100 的节点。此外,经过一些进一步的研究,我发现确实,值为 100 的最优解应该是对于该节点来说是可行的。我还确认该节点没有被我的自定义约束处理程序修剪。
因此,为了调试这个,我一直在寻找一种方法来找出 SCIP 修剪这个特定节点的原因,有没有办法做到这一点?
我已经尝试使用“调试解决方案”功能,但由于我有自定义分支规则,因此它无法正常工作。每次分支时,它都会报告我的输入解决方案(最佳解决方案)违反了分支不等式之一。此外,它没有报告任何有关问题节点为何被修剪的信息。另外,当我创建分支约束时,我将检查标志设置为 FALSE。
非常感谢您抽出宝贵的时间,如果您对此主题有任何评论,我将不胜感激。
编辑:我还将变量锁定在自定义约束处理程序中,以便 SCIP 不会错误地修复某些变量。
啊,我在邮件列表中找到了你的问题。我研究了用于检查调试解决方案的代码,我认为 SCIP 处理调试解决方案的分支约束的方式存在错误(可能是因为没有人将分支约束与调试解决方案功能一起使用)。 仅检查绑定更改,而不检查分支约束,以确定调试解决方案是否与该节点相关。
isSolutionInNode
方法需要扩展以也考虑 node->conssetchg
。不幸的是,这意味着您无法使用调试解决方案功能来查找错误。
为了确定一下,现在你的分支不等式表明总和要么正好是 2,要么至少是 4,这是正确的吗? (因为你最多写了2个) 为什么这是您正在解决的问题的有效析取?
如果您在这一点上完全陷入困境,但在 SCIP 中还不够舒服,无法自己扩展
isSolutionNode
,我可以尝试为您编写补丁。