java - 如何使用两个整数数组执行 "cross-over"

标签 java arrays genetic-algorithm crossover

我正在尝试学习遗传算法,目前正在研究“交叉”两个“基因”。 基因是一个整数数组,由 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/

相关文章:

javascript - 根据未用作其他评论 ID 的数字生成 ID

java - 从字符串中的byte[]到字符串?

java - 如何在后台线程中正确执行SQL查询?

java - 已安装 JDK 但浏览器(FF、IE)无法运行 Java 应用程序

php - 遍历 Doctrine 的 changeSet

mathematical-optimization - 遗传算法

java - 多次迭代函数中使用的 JPA 查询优化

java - 这种选择 `parent`像 `gambling roulette `的方法可行吗?

JavaPreparedStatement 在 SQL 查询中将小写字符串名称传递给区分大小写的 PostgreSQL 数据库

java - 递归 BST 插入不设置根 Java