java - 使用轮盘赌选择的遗传算法

标签 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<>,根据它们的适合度对值进行排序,随机选择半排序值并将它们添加到新的 HashMap <> 及其相应的染色体。

最佳答案

我认为使用集合类会更好。

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;

但是,正如 Sergey 所说,我认为这不是您的算法所需要的;你确实需要偏爱适应度更高的个体。

关于java - 使用轮盘赌选择的遗传算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47055439/

相关文章:

java - 在 Java 中替换字符串的首字母?

c++ - 通过解析文件构建逻辑语句

artificial-intelligence - 人工智能领域有哪些令人印象深刻的算法或软件?

algorithm - 为遗传算法创建 "crossover"函数以改进网络路径

java - 热衷于使用可选参数对 JSNI 函数进行建模?

java - <- 在 Java 中是什么意思?

java - Java 可变参数的接收顺序是否与它们的接收顺序相同?

algorithm - 在小内存(小于 50 MB)中存储大量二进制数的最佳方法是什么

c++ - 这个程序的复杂度是多少

genetic-algorithm - 为什么这个遗传算法停滞不前?