替代字典允许重复

时间:2016-10-07 16:22:01

标签: c# genetic-algorithm traveling-salesman grasshopper

我需要字典的备用,因为需要重复。原因是: 我需要寻找最佳路线。为此,我创建了一个拥有20个人的人口。每个人都有自己的路线,每条路线都是健身计算的。为了能够通过健身对路线进行排序,我正在创建一本字典。现在,我正在迭代几代,同时对字典进行排序,并在每次迭代时为其添加新路由。但是字典正在删除重复项,因为代码可能会多次抛出最佳路由,所以不应该这样做。

我已经阅读了一些关于查找和链接列表的内容,但实际上并不了解它。或者也许是一个元组?谁知道哪些可能会有所帮助?

这是我的代码:好吧,它不是只显示字典的漏洞代码,以避免误解。

List<List<Point3d>> currentGeneration = new List<List<Point3d>>(cGP.Count);
cGP.ForEach((item) => {currentGeneration.Add(new List<Point3d>(item));});

List<double> currentFitness = cGF.ToList();

Dictionary<List<Point3d>, double> dictionary = new Dictionary<List<Point3d>, double>();
foreach(List<Point3d> individual in currentGeneration)
{
 foreach(double individualsFitness in currentFitness)
 {
  if(!dictionary.ContainsKey(individual))
  {
   if(!dictionary.ContainsValue(individualsFitness))
   {
    dictionary.Add(individual, individualsFitness);
   }
  }
 }
}

2 个答案:

答案 0 :(得分:4)

  

我需要字典的备用字符,因为需要重复

Lookup。这本质上是一个允许重复的字典。

来自文档:

  

表示每个映射到一个或多个值的键集合。

     

区别在于Dictionary将键映射到单个值,而Lookup将键映射到值集合。

     

您可以通过在实现IEnumerable的对象上调用ToLookup来创建Lookup实例。

答案 1 :(得分:0)

好的,我已经找到了我要搜索的内容。

List<KeyValuePair>不会删除重复项,并且可以按值或按键对其进行排序,这两种情况都是可能的。

这是我的代码,适合像我这样的编程新手:

List<List<Point3d>> handoverPopulation = createPopulation(pts, p);
List<double> handoverFitness = calculateFitness(handoverPopulation, p0);

List<KeyValuePair<List<Point3d>, double>> list = new List<KeyValuePair<List<Point3d>, double>>();
for(int i = 0; i < handoverFitness.Count; i++)
{
 list.Add(new KeyValuePair<List<Point3d>, double>(handoverPopulation[i], handoverFitness[i]));
}
list.Sort((x, y) => x.Value.CompareTo(y.Value));

Yeeyy高兴:)