实现修复某些变量的原始启发式的最佳方法

Best way to implement a primal heuristic that fixes certain Variables

我正在使用 PySCIPOpt 并且有一个带有一些二次约束的 MIP(有效)。现在,我想实现一个原始启发式算法(在预求解之前应该 运行 一次),它可以修复某些变量并在之后进行优化。

伪代码类似于:

For x in ToFIX:
    model.fixVar(x, my_guess(x))
model.optimize()
*Any found solution is used as solution of the original problem*
For x in ToFIX:
    model.unFixVar(x)

我通过创建第二个模型解决了这个问题,解决了这个问题,通过名称识别变量并使用 model.trySol()。 这主要是可行的,但速度很慢,而且肯定不是它应该实现的方式。

任何提示,使用哪些功能表示赞赏。

抱歉,这需要一段时间才能回答。

您要实现的是 sub-scip 启发式。这当然是可能的,但如果你想在 PySCIPOpt 中做到这一点,你可能必须包装 C-API.

中缺少的一些方法

我建议你看一下SCIP代码中的heur_rens.c。您需要包装的方法可能是 SCIPcopyLargeNeighborhoodSearchSCIPtranslateSubSol,这应该会为您省去很多麻烦。请参阅 PySCIPopt 自述文件中的 extending the interface 部分。