遗传算法交叉操作

时间:2013-07-18 16:33:51

标签: genetic-algorithm crossover

我正在尝试在MATLAB中实现一个基本的遗传算法。我对交叉操作有一些疑问。我正在阅读材料,我发现总是选择两个父母进行交叉操作。

  1. 如果我碰巧有一个奇数的父母会怎么样?

  2. 假设我有父母A,父母B&父母C和我将父母A与B和父母B与C交叉以产生后代,即使这样我也得到4个后代。拒绝其中一个的标准是什么,因为我的人口总值应始终保持不变?我应该拒绝适度值最低的后代吗?

  3. 父母之间的算术运算,如假设OR或AND操作可以被认为是一个好的交叉操作吗?我发现有些网站将它们列为交叉操作,但我不确定。

  4. 如何在多个父母之间进行交叉?

2 个答案:

答案 0 :(得分:1)

“Crossover”并不是一个明确定义的运算符,而是一般的想法,即采用父母的方面并使用它们以某种方式产生类似于每个父母的后代。因此,对于如何进行交叉的问题,没有真正正确的答案。

在实践中,您应该对问题域和编码做任何有意义的事情。对于像二元编码个体的两个父重组这样的事情,有一些明显的选择 - 例如n点和均匀交叉。对于实值编码,从严格的生物学角度来看,像SBX这样的东西并不是真正合理的。相反,它们被简单地设计成具有一些预定的属性。类似地,排列编码提供了许多众所周知的运算符(顺序交叉,循环交叉,边缘装配交叉等),这也是分析父母有哪些特征使得特定问题域可以遗传的结果。< / p>

你可以自由地做同样的事情。如果你有三个父母(有一些像二进制这样的离散编码),你可以做类似以下的事情:

child = new chromosome(L)
for i=1 to L
    switch(rand(3))
        case 0:
            child[i] = parentA[i]
        case 1:
            child[i] = parentB[i]
        case 2:
            child[i] = parentC[i]

这是否是一个好的运算符将取决于几个因素(问题域,编码的解释等),但它是产生后代的完全合法的方式。您还可以创建自己更复杂的方法,例如,对多个父项的每个等位基因值进行加权平均,执行AND和OR等布尔运算。如果您喜欢哪种不同,您还可以构建一个更“结构化”的运算符父母有特定的角色。基本差分进化算法选择三个父项a,b和c,并计算与a + F(b - c)(带有一些函数F)大致对应于后代的更新。

答案 1 :(得分:0)

考虑阅读以下学术文章:

    DEli,Kalyanmoy等。快速精英的多目标遗传算法:NSGA-II。 IEEE进化计算交易,第6卷,第9页。 2,第2002年12月18日。
  • DEB,Kalyanmoy;拉格拉·布珊(Ram Bhushan)农业。用于连续搜索空间的模拟二进制交叉。复杂系统,第9版,n。 2,第第115-148页,1995年。

对于SBX,@ deong提到的交叉和变异子代的方法,请参见答案simulated-binary-crossover-sbx-crossover-operator-example

遗传算法不具有确定的任意形式。提出了许多方法。但通常,适用于所有步骤的步骤如下:

  1. 通过抽签或任何其他方法生成随机种群
  2. 跨父母抚养孩子
  3. 静音
  4. 评估孩子和父母
  5. 仅根据孩子或孩子和父母来生成新人口(存在不同的方法)
  6. 返回项目2

上面引用的DEB是NSGA-II,它是使用最广泛的遗传算法之一。查看文章中的流程图片:

enter image description here