1

我的问题是如何进行交叉并避免重复?

考虑一下p1 = {1, 2, 5, 6, 3, 4}p2 = {2, 6, 5, 4, 1, 3}

其中一个交叉是res = {1, 2, 5 , 6, 1 ,3}

如您所见,存在重复...

我们可以避免吗?



这是我的代码

private static Chromosome crossover(Chromosome chromosome1, Chromosome chromosome2) {
    Chromosome newChromosome = new Chromosome();
    for (int i = 0; i < chromosome1.size(); i++) {
        if (Math.random() < uniformRate) {
            newChromosome.addGene(chromosome1.getGene(i));
        } else {
            newChromosome.addGene(chromosome2.getGene(i));
        }
    }
    return newChromosome;
}
4

1 回答 1

0

根据问题,有不同的技术可以进行交叉。

问题是是否可以存在重复值。

您使用的方法允许重复值。为避免这种情况,我建议采用以下各种算法:

p1={1,2,3,4,5,6} 和 p2={a,b,c,d,e,f}

  1. 第一种方法:

    • mid选择一个限制在染色体 p( )长度数的随机索引

    • 将 p1 从 0 索引复制到mid索引到 p3

    • 然后循环 p2 并复制尚未在 p3 中的值

  2. 第二种方法

    • 选择2个随机索引(开始,结束)

    • 将 p1 值从starttoend索引复制到 p3

    • 遍历 p2 并复制尚未在 p3 中的值

因此,避免重复值的基本想法只是循环并检查该值是否已存在于数组中。

第二种方法更困难,因为您必须将 p1 从start索引复制到end索引并将其粘贴到 p3 的相同索引处,然后在 p3 上循环以获取空/空值并从 p2 复制不在 p3 中的值。

如果你真的对人工智能感兴趣,我想我会关注人工智能 StackExchange,尽管它仍处于阶段。

于 2016-05-31T07:31:34.443 回答