SCIP求解器给模型变量赋初值

最近在项目中使用到scip求解器(公司没有商业版求解器),因为规模比较大,模型求解时间比较长,分析求解日志,发现求解器在初始可行解的寻找部分耗时较多,思考:如果我这边给求解器提供初始值,是否能加速求解器对模型的求解?基于此,就开始求解器求解优化。
解决问题过程:
(1)使用启发式对模型求解,得到可行解;
(2)将启发式得到的可行解,赋值给求解器中变量的初始值;

那么问题来了,gurobi中可以参考张一白等在运小筹的文章,已经写的很好了,可是现实很骨感,我这边是SCIP,没有值得参考的文章,甚至问过很多人,都说是行不通的,郁闷中就在论坛中找到Joao-Dionisio 这个老哥,他刚好做过这块,就给一个比较好的方式,今天就整理一下。
原问题:
先看看求解器自己寻找初始值的过程:
SCIP求解器给模型变量赋初值_第1张图片在小规模上测试中,求解器进行初始值寻找的过程就花费32s;
优化后的求解过程
SCIP求解器给模型变量赋初值_第2张图片将启发式得到的可行解作为求解器求解过程中的初始值,可以看到在开始求解时就已经得到一个比较好的可行解,自己认为这么做,可以大大提升求解器的求解速度。
如果上面两个对比没有疑问的话,就可以看怎么实现了:
SCIP版本需在4.0之上

md = Model("schedule")
mcp = md.createPartialSol() 
md.setSolVal(mcp,x,values)
md.addSol(mcp)
md.optimize()

代码是什么意思就不过多解释,如果有疑问,可以分享一下我最近正在学习的SCIP的doc.
希望对使用scip求解器的各位有帮助!

如需使用,希望标明出处!

你可能感兴趣的:(求解器,启发式,python,算法)