0

我正在尝试在一种情况下将项目从列表复制到另一个列表。我有三个清单。第一个列表包含例如 10 个点列表,第二个列表包含每个列表的总距离(成本或适应度)(10 个列表 -> 10 个总距离)。

这是一张图片:第一个列表包含 10 个列表(每个列表包含点)-第二个列表“健身” 在此处输入图像描述 第三个列表是空的,应该在一个条件下填充项目。首先,我将第二个列表中的所有值加起来。上面的数字示例:totalFitness = 4847 + 5153 + 5577 + 5324...

将第一个列表中的点列表添加到第三个列表的条件是:例如 ----------> (Fitness[0] / totalFitness) <= ratio。

但它不起作用,在这里你可以看到我尝试过的代码:

class  RunGA 
{
  public static List<List<Point3d>> createGenerations(List<List<Point3d>> firstGeneration, List<int> firstFitness, int generationSize)
  {
   List<List<Point3d>> currentGeneration = new List<List<Point3d>>();

   int totalFitness;
   int actualFitness;
   totalFitness = firstFitness[0] + firstFitness[1];
   double ratio = 1 / 10;

   for(int k = 2; k < firstFitness.Count; k++)
   {
    actualFitness = firstFitness[k];
    totalFitness += actualFitness;
   }

   for(int i = 0; i < firstFitness.Count; i++)
   {
    double selected = firstFitness[i] / totalFitness;
    if(selected < ratio)
    {
     currentGeneration.Add(firstGeneration[i]);
    }
   }
   return currentGeneration;
  }
}

第三个列表仍然是空的。如果我将条件更改为:if(selected <= ratio) 那么第一个列表中的整个点列表将被复制到第三个列表中。但是我要复制的是:具有“最佳”适应度的点列表。

我做错了什么?我完全不知道,我已经尝试了一些更改,但它仍然无法正常工作。如果您能认为我是初学者,我将不胜感激。

4

1 回答 1

0

我为这个问题找到了另一种解决方案。

我还有这些数据:

清单 1:

  1. ListOfPoints = 一个
  2. ListOfPoints = b
  3. ListOfPoints = c
  4. ListOfPoints = d

清单 2:

  1. 一个健身
  2. b的健身
  3. c的适应度
  4. d的健身

我想要实现的是:将那些具有最佳Fitness 的ListOfPoints 放入List3。所有其余的ListOfPoints,将它们放入另一个List4。

这是我想到的解决方案:将 List1 作为键和 List2 作为值放入字典并通过 LINQ 对其进行排序。现在将排序后的键转移到 List3 中。使用 for 循环将排序后的 List 的前半部分放入 List4,将后半部分放入 List5。

这是我的代码:

List<List<Point3d>> currentGeneration = handoverPopulation.ToList();
List<double> currentFitness = handoverFitness.ToList();
Dictionary<List<Point3d>, double> dict = new Dictionary<List<Point3d>, double>();
foreach(List<Point3d> key in currentGeneration)
{
  foreach(double valuee in currentFitness)
  {
    if(!dict.ContainsKey(key))
    {
      if(!dict.ContainsValue(valuee))
      {dict.Add(key, valuee);}
    }
  }
}
var item = from pair in dict orderby pair.Value ascending select pair;
List<List<Point3d>> currentGenerationSorted = new List<List<Point3d>>();
currentGenerationSorted = item.Select(kvp => kvp.Key).ToList();

List<List<Point3d>> newGeneration = new List<List<Point3d>>();
List<List<Point3d>> newGenerationExtra = new List<List<Point3d>>();

int p = currentGenerationSorted.Count / 2;
for(int i = 0; i < p; i++)
{newGeneration.Add(currentGenerationSorted[i]);}

for(int j = p; j < currentGenerationSorted.Count; j++)
{newGenerationExtra.Add(currentGenerationSorted[j]);}

希望这可以帮助其他面临同样问题的人。

于 2016-09-05T19:28:57.027 回答