轮盘选择的遗传算法

时间:2017-11-01 12:57:57

标签: java algorithm genetic-algorithm

我正在尝试为我正在研究的遗传算法创建不同的选择方法,但我在所有选择方法中遇到的一个问题是我的每个节点的适应性必须不同。这对我来说是一个问题,因为我的健身计算器非常基本,会产生几个相同的健身

public static Map<String, Double> calculateRouletteSelection(Map<String, Double> population) {
        String[] keys = new String[population.size()];
        Double[] values = new Double[population.size()];
        Double[] unsortedValues = new Double[population.size()];
        int index = 0;
        for(Map.Entry<String, Double> mapEntry : population.entrySet()) {
            keys[index] = mapEntry.getKey();
            values[index] = mapEntry.getValue();
            unsortedValues[index] = mapEntry.getValue();
            index++;
        }
        Arrays.sort(values);
        ArrayList<Integer> numbers = new ArrayList<>();
        while(numbers.size() < values.length/2) {
            int random = rnd.nextInt(values.length);
            if (!numbers.contains(random)) {
                numbers.add(random);
            }
        }

        HashMap<String, Double> finalHashMap = new HashMap<>();
        for(int i = 0; i<numbers.size(); i++) {
            for(int j = 0; j<values.length; j++) {
                if(values[numbers.get(i)] == unsortedValues[j]) {
                    finalHashMap.put(keys[j], unsortedValues[j]);
                }
            }
        }

        return finalHashMap;

    } 

我所有不同的选择方法中有90%是相同的,所以我确定我是否可以解决它,我可以为所有人解决它。 对我所做错的任何帮助都将不胜感激

编辑:我看到我的意思是发布正在发生的事情的一般行为,所以基本上该方法接受HashMap&lt;&gt;,根据它们的适应性对值进行排序,随机选取一半排序值并将这些值添加到新的的HashMap&LT;&GT;与他们相应的染色体。

2 个答案:

答案 0 :(得分:1)

我认为你使用集合类会好得多。

List<Map.Entry<String, Double>> sorted = new ArrayList<>(population.entrySet());
// sort by fitness
Collections.sort(sorted, Comparator.comparing(Map.Entry::getValue));

Set<Integer> usedIndices = new HashSet<>(); // keep track of used indices
Map<String, Double> result = new HashMap<>();
while (result.size() < sorted.size()/2) {
    int index = rnd.nextInt(sorted.size());
    if (!usedIndices.add(index)) {
        continue; // was already used
    }
    Map.Entry<String,Double> survivor = sorted.get(index);
    result.put(survivor.getKey(), survivor.getValue());
}
return result;

但是,正如谢尔盖所​​说,我不相信这是你的算法所需要的;你确实需要支持身体健康的人。

答案 1 :(得分:0)

如评论中所述,轮盘赌选择顺序并不重要,只有权重。轮盘赌轮就像一个饼图,不同的部分占据了磁盘的不同部分,但最后它们总计到单位面积(磁盘的面积)。

我不确定Java中是否存在等价物,但在C ++中你有std::discrete_distribution。它会生成一个分布[0,n),您可以使用权重来初始化,这些权重表示每个整数被挑选的概率。所以我通常做的是在数组中包含我的代理的ID以及在另一个数组中的相应适应值。只要指数匹配,订单就不重要了。我将适应值数组传递给离散分布,它返回一个可解释为数组索引的整数。然后我使用该整数从另一个数组中选择个体。