java - 遗传算法 - 我需要什么数据结构?

标签 java dictionary data-structures processing genetic-algorithm

我希望这里允许这样一个开放式问题。我正在研究一个简单的 GA,它将演变一个字符串输出以匹配给定的目标字符串。因此,每一代都将创建 N 个字符串的群体,每个字符串都将根据其与目标字符串的汉明距离分配一个适合度。然后我需要某种方式来存储和排序这些信息。我正在处理,但 Java 中的解决方案几乎总是可以在这种语言中使用导入。

由于我所追求的是模糊的键值结构,我的直觉是我想要某种字典,但我对使用这些的经验很少。还有一些复杂情况使我们无法理解字典的工作原理。我想做以下事情:

  • 存储每个字符串及其关联的适应度。 这两者的副本必须是可能的 .
  • 按值对结构进行排序,即按适应度的降序列出总体。
  • 剔除底层 50% 的人口。可能最简单的方法是直接用适合人群的后代替换不适合人群。

  • 访问时间/计算效率不是特别关注的问题。

    昨晚我尝试使用 HashMap 解决这个问题,但我一直遇到诸如在此结构下不允许重复键之类的问题,而且我找不到一种简单的方法来遍历 HashMap 并仅更改底部的 X%按值输入。

    总而言之,我需要一个结构,其中 每个条目由一个字符串和一个整数 组成,可以存储每个 的重复项,结构可以是按整数值降序排序 因此 可以对顶部或底部 X% 的条目进行操作 不影响其余。

    非常感谢您的时间,任何帮助将不胜感激。

    最佳答案

    有很多方法可以解决这个问题。就个人而言,我会尝试最简单的解决方案。我不知道您项目的整个背景及其愿景,但是,根据您提供给我们的信息,我将发布我会选择的解决方案。

    备注 : 以下类(class)可能不完整。您可能需要添加更多方法才能更轻松地使用它们。这只是一个解决方案的想法,在代码中提出,可能对你有用。
    Pair类对一对字符串及其适应值进行建模。 Population class 模拟特定世代的人口。它将其成员保存在列表中并提供操作列表的方法。它还允许重复对。您可以选择顶部或底部 X人口的成员,并对他们进行操作。

    public class Pair implements Comparable<Pair>{
        private final String value;
        private final int fitness;
    
        public Pair(String value, int fitness) {
            this.value = value;
            this.fitness = fitness;
        }
    
        public String getValue() {
            return value;
        }
    
        public int getFitness() {
            return fitness;
        }
    
        @Override
        public int compareTo(Pair pair) {
            return -Integer.compare(this.fitness, pair.fitness);
        }
    
        @Override
        public String toString() {
            return "Pair{" + "value='" + value + '\'' + ", fitness=" + fitness + '}';
        }
    }
    
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class Population {
        private final List<Pair> members = new ArrayList<>();
    
        public void addMember(Pair pair) {
            members.add(pair);
        }
    
        public List<Pair> getTop(int x) {
            return members.stream().sorted().limit(x).collect(Collectors.toList());
        }
    
        public List<Pair> getBottom(int x) {
            return  members.stream().sorted(Comparator.reverseOrder()).limit(x).collect(Collectors.toList());
        }
    }
    

    这是一个不全面的测试类:
    import static org.junit.jupiter.api.Assertions.assertEquals;
    import static org.junit.jupiter.api.Assertions.assertTrue;
    
    import java.util.List;
    
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    
    class PopulationTest {
        Population population = new Population();
    
        @BeforeEach
        void populate() {
            population.addMember(new Pair("test", 5));
            population.addMember(new Pair("abc", 13));
            population.addMember(new Pair("xyz", 8));
            population.addMember(new Pair("abc", 20));
        }
    
        @Test
        void testSortDescending() {
            List<Pair> members = population.getTop(4);
            for (int i = 0; i < members.size() - 1; i++) {
                assertTrue(members.get(i).getFitness() >= members.get(i + 1).getFitness());
            }
        }
    
        @Test
        void testGetTop() {
            List<Pair> top = population.getTop(2);
    
            assertEquals(20, top.get(0).getFitness());
            assertEquals(13, top.get(1).getFitness());
        }
    
        @Test
        void testGetBottom() {
            List<Pair> bottom = population.getBottom(2);
    
            assertEquals(5, bottom.get(0).getFitness());
            assertEquals(8, bottom.get(1).getFitness());
        }
    }
    

    关于java - 遗传算法 - 我需要什么数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62445166/

    相关文章:

    java - 以表格格式打印 LinkedHashMap

    c# - 字典的反序列化问题

    java - 简单的 map 投影

    javascript - 编写一个反射(reflect)堆栈行为的函数,但带有队列......?

    java - 如何在某些 JUnit 测试之前调用设置方法

    java - 在 Eclipse 中仅使用特定类型的参数替换方法

    algorithm - 生成这些序列的有效方法

    algorithm - 给出了三种算法的时间复杂度。对于大的 N 值,哪个应该执行最慢?

    java - 替换 "^"字符

    javascript - 每两个元素映射一个数组