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突变子是染色体还是一代?什么是适应度函数?复制品有什么问题?或者你能解释一下代码应该做什么吗?