我试图在一个条件下将项目从列表复制到另一个列表。 我有三个清单。第一列表包含例如10个点列表,第二列表包含每个列表的总距离(成本或适合度)(10个列表 - > 10个总距离)。
这是一张图片: 第一个列表包含10个列表(每个列表包含点) - 第二个列表'健身' 第三个列表为空,应在一个条件下填充项目。首先,我在第二个列表中添加了所有值。 上面数字的示例: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)
,则第一个列表中的整个点列表将被复制到第三个列表。但是我要复制的是:具有“最好”的点数列表。健身。
我做错了什么?我完全没有线索,我已经尝试了一些变化,但它仍然无法正常工作。如果你能认为我是初学者,我将不胜感激。
答案 0 :(得分:0)
我找到了解决此问题的另一种方法。
我仍然有这些数据:
的List1:
List2:
我想要实现的目标是:获取具有最佳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]);}
希望这可以帮助那些面临同样问题的人。