代码之家  ›  专栏  ›  技术社区  ›  JNMN

轮盘赌轮选择的遗传算法

  •  4
  • JNMN  · 技术社区  · 7 年前

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

    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<&燃气轮机;与它们相应的染色体。

    2 回复  |  直到 7 年前
        1
  •  1
  •   daniu    7 年前

    我认为你最好使用集合类。

    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;
    

    但是,正如谢尔盖所说,我不相信这是你的算法所需要的;你确实需要偏爱身体素质较高的人。

        2
  •  1
  •   cantordust    7 年前

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

    我不确定Java中是否有对等的语言,但在C++中你有 std::discrete_distribution . 它生成一个分布 [0,n)