[英]copy items from a list on one condition
我试图在一种情况下将项目从列表复制到另一个列表。 我有三个清单。 第一个列表包含例如10个点列表,第二个列表包含每个列表的总距离(成本或适用性)(10个列表-> 10个总距离)。
这是一张图片:第一个列表包含10个列表(每个列表包含点)-第二个列表“健身” 第三个列表为空,应在一种情况下填充项目。 首先,我将第二个列表中的所有值相加。 上面数字的示例:totalFitness = 4847 + 5153 + 5577 + 5324 ...
将第一个列表中的点列表添加到第三个列表中的条件是:例如---------->(Fitness [0] / totalFitness)<=比率。
但这不起作用,在这里您可以看到我尝试的代码:
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:
清单2:
我要实现的目标是:选择具有最佳适应性的ListOfPoints并将它们放入List3。 将所有其余的ListOfPoints放入另一个List4中。
这是我想到的解决方案:将List1作为键,将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]);}
希望这可以帮助面临相同问题的其他人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.