我有一个遗传算法代码来解决问题。当问题规模变大时,它会缓慢运行。所以我有一个想法是使用运行相同GA程序的多线程来加快速度。
但是当我使用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
作为整个块时,算法运行良好但当时它的工作方式就像使用一个线程一样,正常速度。
答案 0 :(得分:1)
嗯,首先你应该明白,只有你拥有多个CPU,更多的线程才会给你更多的速度。
对于您的程序,您可以使用Parallel.For method,但请记住,它仅适用于大量数据,具有大量迭代的循环等等。
如果您使用不同的锁(例如ReaderWriterLockSlim),请尝试将它们用作代码的一小部分,以便在更短的时间内锁定线程。
当然,如果真的是
,请尝试编写没有全局变量的程序