Java 在2个阵列之间交换对时出现问题

Java 在2个阵列之间交换对时出现问题,java,genetic-algorithm,Java,Genetic Algorithm,我正在为一个家庭作业项目做一个变异算法,我很困惑为什么我会在集合中得到重复。我正在尝试使用遗传变异启发法为旅行蚂蚁问题(寻找食物的最短路径)找到一个解决方案: private static ArrayList<Node> mutate(ArrayList<Node> mutator) { ArrayList<Node> mutant = new ArrayList<Node>(mutator); Collections.rotat

我正在为一个家庭作业项目做一个变异算法,我很困惑为什么我会在集合中得到重复。我正在尝试使用遗传变异启发法为旅行蚂蚁问题(寻找食物的最短路径)找到一个解决方案:

private static ArrayList<Node> mutate(ArrayList<Node> mutator) {
    ArrayList<Node> mutant = new ArrayList<Node>(mutator);

    Collections.rotate(mutant, 1);
    //Collections.shuffle(mutant, r);

    for (int i = 0; i < mutant.size() - 1; i++) {
        double mutantCoupleDistance     = mutant.get(i).getDistanceToNext(mutant.get(i+1));
        double mutatorCoupleDistance    = mutator.get(i).getDistanceToNext(mutator.get(i+1));

        if (mutantCoupleDistance < mutatorCoupleDistance) {
            // If the mutant gene has worse "fitness" then we'll take the good gene
            // from the mutator.
            Node tmp = mutant.get(i);
            mutant.set(i, mutator.get(i));
            mutator.set(i, tmp);

            tmp = mutant.get(i+1);
            mutant.set(i+1, mutator.get(i+1));
            mutator.set(i+1, tmp);
        }
    }

    return 
        mutant;
}
私有静态ArrayList mutate(ArrayList mutator){
ArrayList突变体=新的ArrayList(突变体);
集合。轮换(突变体,1);
//洗牌(突变体,r);
对于(int i=0;i
我传递给方法的数组是49999个元素。它的使用方式如下:

        long
            startTime = System.currentTimeMillis();

        do {
            nodeList = mutate(nodeList);
        } while (System.currentTimeMillis() - startTime < 500);
long
startTime=System.currentTimeMillis();
做{
节点列表=突变(节点列表);
}而(System.currentTimeMillis()-startTime<500);
当我从我的变异算法中删除交换代码时,我没有得到任何重复的代码,这是可以理解的。然而,我很难理解为什么在变异列表中会出现重复

节点列表开始时没有重复项。我用于报告重复项的代码如下:

    HashSet<Node> set = new HashSet<Node>(nodeList);

    if(set.size() < nodeList.size()){
        System.out.println("duplicates found Set:" + set.size() + " vs. NodeList:" + nodeList.size());
    }
HashSet=newhashset(nodeList);
if(set.size()

感谢您的帮助。

代码现在所做的是将副本旋转1。然后,在某些情况下,您可以在同一索引处交换副本和原始副本中的项。交换后,两个相等的元素相邻。例如,
a b c d
和旋转复制
d a b c

abcd
 ▲
 swap here
 ▼
dabc
给予

每一次交换都会产生一个副本。代码旋转数组并进行复制


从你的评论来看,这听起来像是你在用它来做一些接近现实的事情。但是,如果您想要GA,您需要大量的
ArrayList mutator
或工作路径,并将它们随机组合到新路径中

代码现在所做的是将副本旋转1。然后,在某些情况下,您可以在同一索引处交换副本和原始副本中的项。交换后,两个相等的元素相邻。例如,
a b c d
和旋转复制
d a b c

abcd
 ▲
 swap here
 ▼
dabc
给予

每一次交换都会产生一个副本。代码旋转数组并进行复制


从你的评论来看,这听起来像是你在用它来做一些接近现实的事情。但是,如果您想要GA,您需要大量的
ArrayList mutator
或工作路径,并将它们随机组合到新路径中

交换的技巧是
mutator.set(i,mutation.set(i,mutator.get(i))但我看不出有什么帮助。你多久会收到一次副本?你能在一个更小的集合上得到更容易管理的错误吗?问题是否可以复制,以便您可以在调试器中查看?因此,将副本旋转1。然后,在某些情况下,您可以在同一索引处交换副本和原始副本中的项。交换后,两个相等的元素相邻。例如,
a b c d
和旋转复制
d a b c
,并在索引1处交换,得到
a c d
d b c
。它怎么能不复制呢?@Peter Lawrey:谢谢你的提示:)@Ishtar:我明白了。谢谢你的例子,如果你发布它并找到另一种解决问题的方法,我会接受这个答案。我不经常使用遗传算法,但代码在我看来不像遗传算法。
NodeList突变子是染色体还是一代?什么是适应度函数?复制品有什么问题?或者你能解释一下代码应该做什么吗?交换的一个技巧是
mutator.set(i,mutator.set(i,mutator.get(i))但我看不出有什么帮助。你多久会收到一次副本?你能在一个更小的集合上得到更容易管理的错误吗?问题是否可以复制,以便您可以在调试器中查看?因此,将副本旋转1。然后,在某些情况下,您可以在同一索引处交换副本和原始副本中的项。交换后,两个相等的元素相邻。例如,
a b c d
和旋转复制
d a b c
,并在索引1处交换,得到
a c d
d b c
。它怎么能不复制呢?@Peter Lawrey:谢谢你的提示:)@Ishtar:我明白了。谢谢你的例子,如果你发布它并找到另一种解决问题的方法,我会接受这个答案。我不经常使用遗传算法,但代码在我看来不像遗传算法。
NodeList突变子是染色体还是一代?什么是适应度函数?复制品有什么问题?或者你能解释一下代码应该做什么吗?