在某些情况下,您可能有兴趣与Gurobi优化并行运行启发式。为此,您需要建立两件事:
- 单独的流程/线程为启发式和gurobi
- 队列或共享内存将在两个进程/线程之间传递信息
这种过程的Python示例是:
将GUROBIPY作为GP
来自Gurobipy Import Grb
从多处理导入过程,队列
def add_solution(m,where):
如果其中== grb.callback.mipnode而不是m._new_solution.empty():
m.cbsetsoluth(vars,m._new_solution.pop())
def run_gurobi(队列):
m =#定义模型
m._new_solution =队列#将队列添加到模型对象
m.Optimize(add_solution)#添加回调
def run_heuristic(队列):
queue.put([])
procs = []
q = queue()
#定义Gurobi进程
proc = process(target = run_gurobi,args =(q,))
procs.append(proc)
proc.start()
#定义启发式过程
proc = process(target = run_heuristic,args =(q,))
procs.append(proc)
proc.start()
#合并流程
对于procs的p:
p.join()
笔记
这里,队列用于共享进程之间的数据。每当队列不为空时,可以通过内容访问内容queue.get()
方法。有关更多信息,请参阅Python文manbet体育手机客户端档(注意queue.queue.
和多处理.queue.
几乎是相同的)。
自从以来cbsetsolution()
方法仅适用于此mipnode.
回调,这种方法通常被调用。此外,使用队列
可能会产生非琐碎量的开销。Gurobi报告回调的时间花了多少时间。如果在这个回调中花费太多时间,那么更低的级别概念,如共享内存值得调查。