私は問題を解決するための遺伝子アルゴリズムコードを持っています。問題のサイズが大きくなるとゆっくりと動作します。だから私は、同じ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が良い動作しますが、その時点で、それは通常の速度で、一つのスレッドを使用してのように動作します。
変数はグローバル変数です。あなたはどんな影響をもたらしましたか?少なくともスレッドセーフなアクセスを行う必要があります。 – Nikki9696
また、スレッドは難しいです。あなたはこの問題を解決したいと思いますか?例えば、Nikki9696、 – Nikki9696
。 'best'変数が1つあります。ループ内では、この変数は、より良いものが見つかった場合に変更することができます。 –