实现修复某些变量的原始启发式的最佳方法
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
。您需要包装的方法可能是 SCIPcopyLargeNeighborhoodSearch
和 SCIPtranslateSubSol
,这应该会为您省去很多麻烦。请参阅 PySCIPopt 自述文件中的 extending the interface
部分。
我正在使用 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
。您需要包装的方法可能是 SCIPcopyLargeNeighborhoodSearch
和 SCIPtranslateSubSol
,这应该会为您省去很多麻烦。请参阅 PySCIPopt 自述文件中的 extending the interface
部分。