2016-06-27 48 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

+0

@ Nikki9696,例如有一個「最佳」變量,在循環中,如果找到更好的變量,這個變量可以被改變。 –

回答

1

首先,你應該明白,只有當你有多個CPU時,更多的線程纔會給你更多的速度。

對於您的程序,您可以使用Parallel.For method,但請記住,它只適用於大量數據,循環以及大量迭代等。

如果您使用不同的鎖(例如ReaderWriterLockSlim),儘可能使用它們作爲代碼的一小部分,以鎖定線程以縮短時間。

當然,如果它是真實的,試着給你編寫沒有全局變量的程序

+0

線程有助於加快進度。但它沒有報告「最佳」變量,所以進展只是一個數字。 –

+0

@Ali Tor,是的,這不是道德的,只是建議。嘗試paraller.for,我認爲它會幫助 –

+2

Parallel.For仍然需要一切線程安全,所以檢查你打電話的功能。如果它們傳入或使用全局變量,它們也需要線程安全變量。 – Nikki9696

相關問題