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

相关问题