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

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

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

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

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

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

Python中,Scipy优化库(主要是其最核心的`scipy.optimize`模块)本身并不直接支持多线程计算。Scipy主要用于数值算法、插值、拟合等科学计算任务,而不涉及并行处理或分布式计算。 然而,如果你需要在Scipy求过程中利用多线程,通常会通过结合其他库来实现,比如NumPy(用于数组运算)、multiprocessing模块或者joblib这样的并行计算工具。例如,你可以将求过程分为多个独立的任务,然后在每个任务内部使用Scipy函数,外部通过线程池或进程池调度这些任务。 以下是一个简单的例子,展示了如何使用multiprocessing模块: ```python from scipy.optimize import minimize import multiprocessing def worker(args): # 这里是你的求函数,传入args作为参数 result = minimize(*args) return result # 函数列表或参数元组,你需要并行求的问题 problems = [...] with multiprocessing.Pool() as pool: results = pool.map(worker, problems) # results就是所有求结果的列表 ``` 在这个例子中,`worker`函数会接受Scipy `minimize`函数所需的参数,并在单独的线程或进程中执行求。`Pool.map`会并发地调用这些任务。 请注意,实际使用时,你需要考虑Scipy函数是否能安全地并行化,因为有些算法可能不适合或有并发限制。此外,多线程在Python中可能会受到全局释器锁(GIL)的影响,对于CPU密集型任务来说,多进程可能会更有效。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值