我正在尝试学习遗传算法,目前正在研究“交叉”两个“基因”。
基因是一个整数数组,由一和零组成。为了说明我的问题,假设我们有两个基因。
int[] geneA = {1,0,0,0,0};
int[] geneB = {0,1,1,1,0};
跨界(例如在位置3)的预期结果将是:
geneA = [1,0,0,1,0]
geneB = [0,1,1,0,0]
意味着索引为3或更高的每个元素都将与另一个基因的等效元素交换。为此,我编写了以下方法:
private void crossOver(int[] geneA, int[] geneB, int pos) {
int copyA[];
int copyB[];
copyA = geneA;
copyB = geneB;
for(int i = pos; i < geneA.length; i++) {
geneA[i] = copyB[i];
geneB[i] = copyA[i];
}
System.out.println(Arrays.toString(geneA);
System.out.println(Arrays.toString(geneB);
}
但是,似乎geneB的元素只是简单地以3或更高的索引复制到geneA中。
控制台输出如下:
[1, 0, 0, 1, 0]
[0, 1, 1, 1, 0]
任何解释或帮助都将受到高度赞赏。提前致谢!
参考方案
copyA = geneA
不会创建副本。现在,两个变量都引用相同的数组。
无需在复制整个阵列上浪费时间和空间。
交换值时,只需将值之一存储在一个临时变量中。
private static void crossOver(int[] geneA, int[] geneB, int pos) {
for (int i = pos; i < geneA.length; i++) {
int temp = geneA[i];
geneA[i] = geneB[i];
geneB[i] = temp;
}
}
这将就地更新数组,因此调用方将看到更改。
int[] geneA = {1,0,0,0,0};
int[] geneB = {0,1,1,1,0};
crossOver(geneA, geneB, 3);
System.out.println(Arrays.toString(geneA));
System.out.println(Arrays.toString(geneB));
输出量
[1, 0, 0, 1, 0]
[0, 1, 1, 0, 0]
Java-固定大小的列表与指定初始容量的列表之间的差异 - java我在理解这一点上遇到了问题。当我们做 List<Integer> list = Arrays.asList(array); 我们不能在该列表上使用添加,删除之类的方法。我知道Arrays.asList()返回固定大小的列表。我不明白的是,如果我们创建一个具有指定初始容量的列表,例如List<Integer> list2 = new A…
Java-搜索字符串数组中的字符串 - java在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…
从方法返回数组-Java - javaprivate static Coordinate[] getCircleCoordintaes() { Coordinate coordinates[] = {new Coordinate(0, 0)}; return coordinates; } 以上程序工作正常。在上面的程序中,返回的坐标数组首先初始化了数组使用这条线Coordinate coordi…
JAVA:如何检查对象数组中的所有对象是否都是子类的对象? - java我有一个对象数组。现在,我要检查所有这些对象是否都是MyObject的实例。有没有比这更好的选择:boolean check = true; for (Object o : justAList){ if (!(o instanceof MyObject)){ check = false; break; } } java大神给出的解决方案 如果您不喜欢循环,则…
Java:线程池如何将线程映射到可运行对象 - java试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …