python中并行解决多个独立LP并出现关键错误

Posted

技术标签:

【中文标题】python中并行解决多个独立LP并出现关键错误【英文标题】:Solving multiple independent LPs parallel in python and key error occurs 【发布时间】:2020-07-04 14:18:51 【问题描述】:

我叫博宇。我是python和Gurobi的大学生和新手。目前,我的模型的一个步骤是解决 5 个独立的 LP。这些 LP 是独立的,并且每个 LP 都具有相同数量的变量和约束。这些 LP 之间的唯一区别是系数的值,它们在运行模型之前都是已知的。

首先,我开始依次构建 5 个 LP:

from gurobipy import *
from gurobipy import GRB

a=1:2,2:2,3:8,4:7,5:3
b=1:3,2:5,3:6,4:8,5:5
c=1:4,2:2,3:3,4:5,5:7
d=1:1,2:7,3:3,4:2,5:9
object_val=
x=
y=
z=
m=

for i in [1,2,3,4,5]:
# Create a new model
    m[i]=Model()

# Create variables
x[i] = m[i].addVar(vtype=GRB.CONTINUOUS)
y[i] = m[i].addVar(vtype=GRB.CONTINUOUS)
z[i] = m[i].addVar(vtype=GRB.CONTINUOUS)

# Set objective
m[i].setObjective(x[i] + y[i] + 2 * z[i] , GRB.MAXIMIZE)

# Add constraint: x + a y + b z <= c
m[i].addConstr(x[i] + a[i] * y[i] + b[i] * z[i] <= c[i])

# Add constraint: x + y >= 1
m[i].addConstr(x[i] + y[i] >= d[i])

其次,我定义了求解单个LP模型的函数并将其保存为“test.py”:

def test(i):
# Optimize model
    m=i[1]
    m.optimize()
    return m.objVal

第三,我为函数创建输入数据将被并行求解:

inputs=[]
for i in [1,2,3,4,5]:
    inputs.append([i,m[i]])

最后,我尝试使用“multiprocessing”包并行解决这5个LP:

import test
import multiprocessing
if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    pool.map(test.test, inputs)
    pool.close()
    pool.join()
    print('done')

但是,发生错误,它说“KeyError:'getstate'”

KeyError                                  Traceback (most recent call last)
<ipython-input-17-0b3639c06eb3> in <module>()
      1 if __name__ == '__main__':
      2     pool = multiprocessing.Pool(processes=4)
----> 3     pool.map(test.test, inputs)
      4     pool.close()
      5     pool.join()

C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py in map(self, func, iterable, chunksize)
    264         in a list that is returned.
    265         '''
--> 266         return self._map_async(func, iterable, mapstar, chunksize).get()
    267 
    268     def starmap(self, func, iterable, chunksize=None):

C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py in get(self, timeout)
    642             return self._value
    643         else:
--> 644             raise self._value
    645 
    646     def _set(self, i, obj):

C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py in _handle_tasks(taskqueue, put, outqueue, pool, cache)
    422                         break
    423                     try:
--> 424                         put(task)
    425                     except Exception as e:
    426                         job, idx = task[:2]

C:\ProgramData\Anaconda3\lib\multiprocessing\connection.py in send(self, obj)
    204         self._check_closed()
    205         self._check_writable()
--> 206         self._send_bytes(_ForkingPickler.dumps(obj))
    207 
    208     def recv_bytes(self, maxlength=None):

C:\ProgramData\Anaconda3\lib\multiprocessing\reduction.py in dumps(cls, obj, protocol)
     49     def dumps(cls, obj, protocol=None):
     50         buf = io.BytesIO()
---> 51         cls(buf, protocol).dump(obj)
     52         return buf.getbuffer()
     53 

model.pxi in gurobipy.Model.__getattr__()

KeyError: '__getstate__'

有人可以帮我解决这个问题吗?我是 gurobi 和 python 的新手,如果有人能给我一些帮助,我将不胜感激。

谢谢。

博宇

【问题讨论】:

首先,你应该在for循环下缩进“变量”、“约束”和“目标”部分。 【参考方案1】:

您需要为每个模型实例创建一个单独的环境。

# Assuming: import gurobipy as gp

m[i] = gp.Model(env=gp.Env(""))

进一步参考:

https://groups.google.com/forum/#!topic/gurobi/_LztwSqj-14

https://www.gurobi.com/documentation/9.0/refman/py_env2.html

【讨论】:

以上是关于python中并行解决多个独立LP并出现关键错误的主要内容,如果未能解决你的问题,请参考以下文章

Python并行编程:基于线程的并行

使用多个 jdbc 连接运行并行查询的 Spring Boot 应用程序

如何并行化具有多个参数的简单 python def [重复]

如何并行删除多个表

使用 Python 多处理解决令人尴尬的并行问题

02python 中的线程