2016-07-06 10 views
1

とPythonでマルチスレッド私は、この関数では、リストR.を受け入れる機能を持って、私は「パルプ」を使用して最適化問題を定義している、これが私の関数である:パルプ

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) 

取得するには私は、forループの代わりにマルチスレッドを使用したい、

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) 

しかし:出力は、私は私の入力としてリストを使用し、出力は正しいです。

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の最適化を実行する必要があります。だから、マルチスレッドは大きな助けになります。

+0

"しかし、それは私にいくつかのエラーが発生します。" *エラーメッセージを追加してください。常に人々があなたを助けるのを助けます。 – MisterMiyagi

+0

@MisterMiyagiエラーを追加しました。ありがとう。 –

+0

スレッドと完全に関連していると確信していますか? http://stackoverflow.com/questions/32688324/pulpsolvererror-pulp-error-while-trying-to-execute-glpsol-in-python-2-7などのスレッドをチェックして、あらかじめエラーメッセージをデバッグしようとしてください。 – Tttt1228

答えて

1

私は、pulp.solvers.COIN_CMDthreadsという引数を持っていることが分かりましたが、ドキュメントは非常に不気味です。コードソースを見てみると、それは実際にスレッドをソルバに提供する方法のようです。

実際に名前が付いている場合は、関数の入力引数として特定の問題の名前インデックスを追加することを検討してください。

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)) 
関連する問題