0

我叫博宇。我是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 的新手,如果有人能给我一些帮助,我将不胜感激。

谢谢。

博宇

4

1 回答 1

0

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

# 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

于 2020-04-28T01:07:45.473 回答