2017-06-28 14 views
1

私はグローバル最適を見つける機会を増やすために、いくつかの異なる初期条件を使用する最適化アルゴリズムを書いています。マルチプロセッシングライブラリを使用してコードを高速化し、さまざまなプロセスで最適化を実行するようにしています。ネストされたオブジェクトを使用するPythonマルチプロセッシング

これは私のコードは基本的に今取り組んでいる方法です。

from multiprocessing import Process, Queue 
from SupportCostModel.SupportStructure import SupportStructure, SupportType 

# Method the processes will execute 
def optimizeAlgoritm(optimizeObject, qOut): 

    optimizeObject.Optimize() 
    qOut.put(optimizeObject) 

# Method the main thread will execute 
def getOptimumalObject(n): 

    for i in range(n): 

     # Create a new process with a new nested object that should be optimized 
     p = Process(target = optimizeAlgoritm, args = (SupportStructure(SupportType.Monopile), qOut)) 
     processes.append(p) 
     p.deamon = True 
     p.start() 

# Part the main thread is running   
if __name__ == '__main__': 

    qOut = Queue() 
    processes = [] 

    # Run the code on 6 processes 
    getOptimumalObject(6) 

    for i in range(len(processes)): 
     processes[i].join() 

    # Get the best optimized object and print the resulting value 
    minimum = 1000000000000000000000000. 

    while not qOut.empty(): 

     optimizeObject = qOut.get() 

     if optimizeObject.GetTotalMass() < minimum: 

      bestObject = optimizeObject 
      minumum = optimizeObject.GetTotalMass() 

    print(bestObject.GetTotalMass()) 

このコードは、限り、私は唯一の4つのプロセスを使用して動作します。この例のように4を超えるコードを実行すると、コードの最後に2つのプロセスが停止し、メインスレッドが依然としてprocesses[i].join()になっているため、コードは実行を停止しません。私は2つのプロセスがのoptimizeAlgorithmに問題があると思います。 qOut.put()を削除すると、コードが終了し、bestObjectが存在しないというエラーが発生します。しかし、奇妙なことは、例えば、印刷すると、オブジェクトがqOut.put()の後に最低限必要であるということです。しかし、プロセスは私のCPUの0%を使って生き続けるでしょう。これにより、メインコードも強制的に生き残ります。

私は、マルチプロセッシングとOOPとマルチプロセッシングがいつもうまく連携しているわけではないことを読んだことで、かなり新しいです。ここで間違ったアプローチをしていますか?それはほとんど動作しますが、4つ以上のプロセスでは動作しません。

ありがとうございます!

+0

さて、あなたの現在の例では、実行することはできません。構文エラーがあります。さらに悪いことに、メインコードの 'processes'へのアクセス権がありません。これは関数呼び出しでしか定義されていないからです。それを修正して問題を解決できるようにしてください – JohanL

+0

申し訳ありませんが、私はここにコードを書いていますので、実際にはいくつかの構文エラーがありました。私はそれを編集して削除した。私のネストされたオブジェクトは、ここに入れることが複雑です。私のコードの基本的な考え方はこのように正しいのですか? –

+0

端末からコードを実行しようとしましたか?私はPycharm対話型コンソールでマルチプロセスを実行しているときに同様の問題を抱えていました。投稿したコードには他にも目に見える問題がいくつかありますが、それはちょうどミスタイプであると思います。 – gionni

答えて

0

パイプを使用してオブジェクトを送信するようになったのです!

これは私が使用するコードです:

from multiprocessing import Process, Pipe 
from SupportCostModel.SupportStructure import SupportStructure, SupportType 
import random 

# Method the processes will execute 
def optimizeAlgoritm(optimizeObject, conn): 

    optimizeObject.Optimize() 

    # Send the optimized object 
    conn.send(optimizeObject) 

# Method the main thread will execute 
def getOptimumalObject(n): 

    connections = [] 

    for i in range(n): 

     # Create a pipe for each of the processes that is started 
     parent_conn, child_conn = Pipe() 

     # Save the parent connections 
     connections.append(parent_conn) 

     # Create objects that needs to by optimized using different initial conditions 
     if i == 0: 
      structure = SupportStructure(SupportType.Monopile) 
     else: 
      structure = SupportStructure(SupportType.Monopile) 
      structure.properties.D_mp = random.randrange(4., 10.) 
      structure.properties.Dtrat_tower = random.randrange(90., 120.) 
      structure.properties.Dtrat_mud = random.randrange(60., 100.) 
      structure.properties.Dtrat_mp = random.randrange(60., 100.) 
      structure.UpdateAll() 

     # Create a new process with a new nested object that should be optimized 
     p = Process(target = optimizeAlgoritm, args = (structure, child_conn)) 
     processes.append(p) 
     p.deamon = True 
     p.start() 

    # Receive the optimized objects 
    for i in range(n): 
     optimizedObjects.append(connections[i].recv()) 

# Part the main thread is running   
if __name__ == '__main__': 

    processes = [] 
    optimizedObjects = [] 

    # Run the code on 6 processes 
    getOptimumalObject(6) 

    for i in range(len(processes)): 
     processes[i].join() 

    # Get the best optimized object and print the resulting value 
    minimum = 1000000000000000000000000. 

    for i in range(len(optimizedObjects)): 

     optimizeObject = optimizedObjects[i] 

     if optimizeObject.GetTotalMass() < minimum: 

      bestObject = optimizeObject 
      minumum = optimizeObject.GetTotalMass() 

    print(bestObject.GetTotalMass()) 
関連する問題