///
/// 更新下一代;
/// 基于轮盘选择选择方法,进行基因型的选择;
///
private static void UpdateNext()
{
// 获取总的fit;
double totalFitValue = 0;
for (int i = 0; i < chromosomes.Count; i++)
{
//适应度为负数的取0;
if (chromosomes[i].fitValue <= 0)
{
totalFitValue += 0;
}
else
{
totalFitValue += chromosomes[i].fitValue;
}
}
Console.WriteLine("totalFitValue " + totalFitValue);
//算出每个的fit percent;
for (int i = 0; i < chromosomes.Count; i++)
{
if (chromosomes[i].fitValue <= 0)
{
chromosomes[i].fitValuePercent = 0;
}
else
{
chromosomes[i].fitValuePercent = chromosomes[i].fitValue / totalFitValue;
}
Console.WriteLine("fitValuePercent " + i + " " + chromosomes[i].fitValuePercent);
}
计算累积概率;
第一个的累计概率就是自己的概率;
chromosomes[0].probability = chromosomes[0].fitValuePercent;
Console.WriteLine("probability 0 " + chromosomes[0].probability);
double probability = chromosomes[0].probability;
for (int i = 1; i < chromosomes.Count; i++)
{
if (chromosomes[i].fitValuePercent != 0)
{
chromosomes[i].probability = chromosomes[i].fitValuePercent + probability;
probability = chromosomes[i].probability;
}
Console.WriteLine("probability " + i + " " + chromosomes[i].probability);
}
chromosomesChild.Clear();
//轮盘选择选择方法,用于选出前两个;
for (int i = 0; i < chromosomes.Count; i++)
{
//产生0-1之前的随机数;
//int seed = i * 100 / 3;
double rand = random.NextDouble();//0.0-1.0
Console.WriteLine("挑选的rand " + rand);
if (rand < chromosomes[0].probability)
{
chromosomesChild.Add(chromosomes[0].Clone());
}
else
{
for (int j = 0; j < chromosomes.Count - 1; j++)
{
if (chromosomes[j].probability <= rand && rand <= chromosomes[j + 1].probability)
{
chromosomesChild.Add(chromosomes[j + 1].Clone());
}
}
}
}
for (int i = 0; i < chromosomes.Count; i++)
{
chromosomes[i] = chromosomesChild[i];
}
}