在一个条件

时间:2016-08-23 20:37:34

标签: c# list genetic-algorithm grasshopper

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

这是一张图片: 第一个列表包含10个列表(每个列表包含点) - 第二个列表'健身' enter image description here 第三个列表为空,应在一个条件下填充项目。首先,我在第二个列表中添加了所有值。 上面数字的示例:totalFitness = 4847 + 5153 + 5577 + 5324 ...

将第一个List中的点列表添加到第三个列表的条件是: 例如----------> (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) ,则第一个列表中的整个点列表将被复制到第三个列表。但是我要复制的是:具有“最好”的点数列表。健身。

我做错了什么?我完全没有线索,我已经尝试了一些变化,但它仍然无法正常工作。如果你能认为我是初学者,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我找到了解决此问题的另一种方法。

我仍然有这些数据:

的List1:

  1. ListOfPoints = a
  2. ListOfPoints = b
  3. ListOfPoints = c
  4. ListOfPoints = d
  5. List2:

    1. 适合
    2. b的健身
    3. c的健身
    4. 健身d
    5. 我想要实现的目标是:获取具有最佳Fitness的ListOfPoints并将它们放入List3中。所有其余的ListOfPoints,将它们放入另一个List4中。

      这是我想到的解决方案: 将List1作为Keys,将List2作为值放入字典并通过LINQ对其进行排序。现在将已排序的密钥转移到List3中。使用for循环将排序列表的前半部分放入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]);}
      

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