【问题标题】:Genetic Algorithm: Creating Offspring of Two HashMaps遗传算法:创建两个 HashMap 的后代
【发布时间】:2017-08-27 23:49:52
【问题描述】:

如果可能的话,我需要使用 HashMaps 从两个数组创建后代。

这是我的重现功能:

public Map<String, Integer> reproduce(Map<String, Integer> x, Map<String, Integer> y, int n){
Random rand = new Random();
int c = rand.nextInt(n);
!!CREATE OFFSPRING from x and y and store it into child!!
return(child);
}

例如,如果传递给函数的 x 和 y 值是:

x = {0=1} {1=0} {2=1}

和

y = {0=2} {1=1} {2=2}

我想复制使用这些地图来创建一个子地图,例如:

child = {0=1} {1=1} {2=2} 

孩子从 x 中取出第一个元组,从 y 中取出第二个和第三个元组。

它从x切换到y的点由随机数c决定。

如何在不将地图转换为数组的情况下做到这一点?

【问题讨论】:

  • 向我们展示您的代码。我们需要看看你尝试了什么。
  • 我完全不知道该怎么做。我正在寻找一种方法来做到这一点,即试图获得关于在!!创造后代!行
  • 我认为我需要做的是这样的事情:~~~ for(int i = 0; i
  • 请不要在 cmets 中添加代码。编辑您的问题
  • 我会在几个小时内阅读这个问题。表现出一些努力......

标签: java hashmap genetic-algorithm


【解决方案1】:

我相信你的话:你想要来自x 的第一个c 元组,其余来自y。按照String.compareTo() 定义的键的自然顺序。这比从x 或y 中随机获取每个元组要复杂一些。当然可以。

正如@Yossi Vainshtein 在另一个答案中已经指出的那样,映射通常不维护元组的顺序,因此向映射询问第一个c 元组是没有意义的。所以我们需要明确地对键进行排序。在对它们进行排序之前,我们需要将它们放在不同的数据结构、列表或数组中。因此,我将键取出并排序。因此,虽然没有将映射本身转换为数组,但我只将键集转换为一个列表,该列表在幕后是通过数组实现的。

这种方式只有在两个父映射具有相同键的情况下才能按预期工作。所以你的方法应该做的第一件事是检查是否是这种情况。

要从地图中取出键,请使用x.keySet(),y 类似。要将它们放入列表中,请使用new ArrayList&lt;&gt;(x.keySet())。要对列表进行排序,请使用Collections.sort()。要创建空子,请使用Map&lt;String, Integer&gt; child = new HashMap&lt;&gt;();。要填充它,遍历列表的第一个 c 元素并从 x 中填充相应的键和值;然后遍历剩余的键并从y 中填写键和值。然后你就完成了。

如果您不关心哪个c 元组从x 获取x,只要您从x 获取c 和从n - c 获取n - c,我们可以完全跳过列表和排序.

编辑:我从您的评论中了解到,密钥始终是 0 到 n - 1。在这种情况下,没有理由从地图中取出键并对其进行排序。只需遍历数字 0 到 c - 1。对于每个数字,将其转换为字符串,从x 中获取值并将字符串和值放入子项中。然后对数字c 到n - 1 和y 执行相同操作。比我上面概述的要简单一些。

链接: Answer by Yossi Vainshtein

【讨论】:

  • 谢谢我实现了这个解决方案。我已经用我使用的内容更新了问题。
【解决方案2】:

严格来说,java中的Map接口没有顺序访问的方法。 因此,您不能从地图中获取“x 个第一个元素”——它们之间没有顺序。 一些实现确实保证了排序 - SortedMap(按键排序)和 LinkedHashMap(按插入顺序排序)。

在这些情况下,您可以使用entryMap() 方法。

因此(假设 n 是两个映射的大小)如果您想从第一个中获取 x 元素,从第二个中获取 y 元素,您可以创建两个迭代器并从中获取,例如:

int c = rand.nextInt(n);
Iterator<Entry<String, Integer>> i1 = x.entrySet().iterator();
Iterator<Entry<String, Integer>> i2 = y.entrySet().iterator();
int i = 0;
Map<Integer, String> child = new HashMap<String, Integer>();
Entry<String, Integer> e1, e2;
while (i < n)
{ 
   if (i < c) {
     e1= i1.next();
     e2 = i2.next();
     child.add(e1.getKey(), e1.getValue());
   }
   else
   {
     e2 = i2.next();
     child.add(e2.getKey(), e2.getValue());
   }
   i++;
}

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 2012-01-22
    • 2012-02-23
    • 2021-11-21
    • 2019-06-22
    • 2016-11-04
    • 2013-02-15
    • 1970-01-01
    • 2014-06-17
    相关资源
    最近更新 更多