SCIP 使用旧代码

SCIP using old code

我是 SCIP 的新手。我想使用 SCIP 作为分支和价格框架。我已经用 C++ 编写了问题代码,并将定价器或列生成实现为一个函数。事实上,我已经通过将 Cplex.dll 链接到项目来实现根节点的 BP 算法,现在需要对分支树进行编码,并决定为此使用 SCIP。 我想知道使用 SCIP 和我拥有的旧代码解决问题的最快方法是什么?或者也许使用 GCG 是更好更快的方法? 我已经阅读了 GCG 文档,但不明白我是否应该自己再次实施定价器?事实上,我不明白这两者(SCIP 和 GCG)之间的区别。 谢谢。

在GCG中,您不需要自己实现任何东西。它是分支价格的通用求解器。您必须提供紧凑的公式,即在应用 Dantzig-Wolfe 重构后导致您要解决的主要问题的模型。重新制定还提供了定价问题的 MIP 制定,因此 GCG 可以将其作为定价的子 MIP 来解决。但是,可以在 GCG 中插入一个定价求解器,将要求解的定价 MIP 传递给该求解器(具有与当前定价回合对应的 objective 函数)。然后,定价求解器可以使用任何特定于问题的算法解决此问题,并将解决方案传回 GCG。

另一方面,在 SCIP 中,您创建要解决的主问题并实施定价器,该定价器从 LP 获取对偶值并解决相应的定价问题。这可能与您已有的非常相似。

另外,如果你想做分支价格,你需要一个分支规则。 GCG 带有一些通用的,在 SCIP 中你必须自己实现一个(因为分支决定必须在你的定价过程中考虑)。

总的来说,SCIP是一个branch-and-price的框架,即提供了树管理、LP求解和更新等功能,但是有些东西需要自己实现,比如reader,定价器和分支规则。 GCG 是一个通用求解器,因此您只需插入一个紧凑的模型,该模型将以通用方式重新制定和求解。重新制定要么由您通过输入文件提供,要么您可以尝试让 GCG 检测适当的结构。您不需要执行任何操作。它已经提供了一些不错的功能,例如利用重新制定的原始启发式算法、自动管理何时解决哪个定价问题等等。另一方面,与 SCIP 相比,进一步扩展它的可能性(例如通过定价求解器和分支规则)受到限制,因为您必须坚持 GCG 定义的结构。

我会说使用 SCIP 并添加您的定价器可能是更简单的方法,并且与您已有的更相似(您不需要制定紧凑模型)。如果您已经知道您的分支应该如何工作,那么在 SCIP 中实现它应该也不会太难。