2016-06-27 30 views
0

私は問題を解決するための遺伝子アルゴリズムコードを持っています。問題のサイズが大きくなるとゆっくりと動作します。だから私は、同じGAの手順を実行しているマルチスレッドを使用して高速化する考えがあります。C#で同じメソッドを呼び出すマルチスレッドを扱うには?

しかし、私が4つのスレッドを使用したとき、最良の値を見つけるのが早すぎました。これはスレッド内で同じ変数を同時に扱うためだと思います。しかし、私はこれを解決する方法を知らない。

だから、スレッドごとにグローバル変数を含む同じメソッドを呼び出す正しい方法は何ですか?

私は助けるためにコードをクロップ:

public void Start() 
    { 
     CreateInitialPopulation(); 
     Task th1 = new Task(() => 
     { 
      Procedure(); 
     }); 
     Task th2 = new Task(() => 
     { 
      Procedure(); 
     }); 
     Task th3 = new Task(() => 
     { 
      Procedure(); 
     }); 
     Task th4 = new Task(() => 
     { 
      Procedure(); 
     }); 
     th1.Start(); 
     th2.Start(); 
     th3.Start(); 
     th4.Start(); 
    } 
    #endregion 

    void Procedure() 
    { 

     stopped = false; 
     while (produced < 10000000) 
     { 
      int[] nums = doSelection(); 

      Schedule mother = population[nums[0]]; 
      Schedule father = population[nums[1]]; 

      Schedule child1 = doCrossover(mother, father); 
      Schedule child2 = doCrossover(father, mother); 

      doMutation(child1); 
      doMutation(child2); 

      population[nums[nums.Length - 1]] = child1; 
      population[nums[nums.Length - 2]] = child2; 

      checkBestValueChanged(child1); 
      checkBestValueChanged(child2); 

      produced++; 
      nothingFound++; 
      if (nothingFound > 300000 && refresh) 
      { 
       addNewChromosomes(popSize/10); 
       nothingFound = 0; 
      } 

      Progress = double.Parse((produced * 100d/10000000).ToString("0.00")); 

      if (stopped) 
       break; 
     } 
    } 

UPDATE:を加えて、私はブロック全体のためにlockを使用する場合algorithymが良い動作しますが、その時点で、それは通常の速度で、一つのスレッドを使用してのように動作します。

+0

変数はグローバル変数です。あなたはどんな影響をもたらしましたか?少なくともスレッドセーフなアクセスを行う必要があります。 – Nikki9696

+0

また、スレッドは難しいです。あなたはこの問題を解決したいと思いますか?例えば、Nikki9696、 – Nikki9696

+0

。 'best'変数が1つあります。ループ内では、この変数は、より良いものが見つかった場合に変更することができます。 –

答えて

1

まず、いくつかのCPUを持っている場合にだけ、より多くのスレッドが本当にスピードを増やすことを理解する必要があります。

Parallel.For methodを使用することができますが、非常に大量のデータ、繰り返し回数が非常に多いサイクルなどでのみ有効です。

異なるロック(たとえばReaderWriterLockSlim)を使用する場合は、できるだけコードの一部を使用してスレッドを短時間ロックするようにしてください。

もちろん、グローバル変数がない場合はプログラムを書くようにしてください。

+0

スレッドは進行を高速化するために機能します。しかし、 'best'変数は報告されていないので、進捗は単なる数値です。 –

+0

@Ali Tor、そうですね、これは道徳的なものではなく、ただのアドバイスです。 paraller.forを試してみてください。 –

+2

Parallel.Forはまだスレッドセーフである必要がありますので、呼び出す関数をチェックしてください。渡されるか、グローバルを使用する場合は、スレッドセーフ変数も必要です。 – Nikki9696

関連する問題