我正在尝试学习遗传算法,目前正在研究“交叉”两个“基因”。 基因是一个整数数组,由 1 和 0 组成。为了举例说明我的问题,假设我们有两个基因。
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 - 如何使用两个整数数组执行 "cross-over",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52843830/