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并出现关键错误的主要内容,如果未能解决你的问题,请参考以下文章
使用多个 jdbc 连接运行并行查询的 Spring Boot 应用程序