Skip to main content
 首页 » 编程设计

python之使用 pulp 在 Python 中实现多线程

2025年04月02日31zhengyun_ustc

我有一个接受列表 R 的函数。在这个函数中,我使用“pulp”定义了一个优化问题,这是我的函数:

import pulp 
from multiprocessing.dummy import Pool as ThreadPool 
 
def optimize(R): 
 
    variables = ["x1","x2","x3","x4"] 
 
    costs = {"x1":R[0], "x2":R[1], "x3":R[2], "x4":R[3]} 
 
    constraint = {"x1":5, "x2":7, "x3":4, "x4":3} 
 
    prob_variables = pulp.LpVariable.dicts("Intg",variables, 
                              lowBound=0, 
                              upBound=1, 
                              cat=pulp.LpInteger) 
 
 
    prob = pulp.LpProblem("test1", pulp.LpMaximize) 
 
    # defines the constraints 
    prob += pulp.lpSum([constraint[i]*prob_variables[i] for i in variables]) <= 14 
 
    # defines the objective function to maximize 
    prob += pulp.lpSum([costs[i]*prob_variables[i] for i in variables]) 
 
    pulp.GLPK().solve(prob) 
 
    # Solution 
    return pulp.value(prob.objective) 

为了得到输出,我使用了一个列表作为输入,输出是正确的:

my_input = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] 
 
results =[] 
for i in range(0,len(my_input)): 
    results.append(optimize(my_input[i])) 
 
    print("*"*20) 
    print(results) 

但是,我想使用多线程而不是 for 循环。所以,我用了:

my_input = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] 
pool = ThreadPool(4) 
results = pool.map(optimize, my_input)  

但它给了我一些错误:

Traceback (most recent call last): 
  File "/Users/Mohammad/PycharmProjects/untitled10/multi_thread.py", line 35, in <module> 
    results = pool.map(optimize, my_input) 
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/pool.py", line 260, in map 
    return self._map_async(func, iterable, mapstar, chunksize).get() 
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/pool.py", line 608, in get 
    raise self._value 
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/pool.py", line 119, in worker 
    result = (True, func(*args, **kwds)) 
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/pool.py", line 44, in mapstar 
    return list(map(*args)) 
  File "/Users/Mohammad/PycharmProjects/untitled10/multi_thread.py", line 27, in optimize 
    pulp.GLPK().solve(prob) 
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PuLP-1.6.1-py3.5.egg/pulp/solvers.py", line 179, in solve 
    return lp.solve(self) 
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PuLP-1.6.1-py3.5.egg/pulp/pulp.py", line 1643, in solve 
    status = solver.actualSolve(self, **kwargs) 
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PuLP-1.6.1-py3.5.egg/pulp/solvers.py", line 377, in actualSolve 
    raise PulpSolverError("PuLP: Error while executing "+self.path) 
pulp.solvers.PulpSolverError: PuLP: Error while executing glpsol 

有人能帮帮我吗? 在我的实际代码中,my_input 列表的长度为 27(而不是上面代码中的 4),对于每个列表,在我的函数中我必须执行 80k 优化(而不是上面代码中的一个)。所以,多线程对我帮助很大。

请您参考如下方法:

我看过那个课pulp.solvers.COIN_CMD有一个 threads 参数,尽管文档非常简洁。看了一下源码,好像确实是给求解器提供线程的一种方式。

如果命名确实是问题,请考虑将给定问题所需的名称索引添加为函数的输入参数。像这样的东西:

def optimize(tup): # here, tup contains (idx, R), so as to be callable using pool.map 
    ... 
    prob = pulp.LpProblem('test'+str(idx), pulp.LpMaximize) 
    ... 

然后是这样的:

my_input = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] 
pool = ThreadPool(4) 
results = pool.map(optimize, enumerate(my_input))