0

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

  1. 如果我碰巧有奇数个父母怎么办?

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

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

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

4

2 回答 2

1

“Crossover”与其说是一个定义明确的运算符,不如说是一个通用的想法,即获取父母的各个方面并使用它们在某些方面产生与每个父母相似的后代。因此,对于应该如何进行交叉的问题没有真正正确的答案。

在实践中,你应该做任何对你的问题域和编码有意义的事情。对于像二进制编码个体的两个父重组这样的事情,有一些明显的选择——例如,像 n 点和统一交叉这样的事情。对于实值编码,如果从严格的生物学角度来看,SBX 之类的东西并不是很明智。相反,它们被简单地设计为具有一些预定的属性。类似地,置换编码提供了许多著名的运算符(顺序交叉、循环交叉、边缘组装交叉等),它们再次是分析父项中哪些特征对特定问题域具有可遗传意义的结果。

你可以自由地做同样的事情。如果您有三个父母(使用一些离散编码,如二进制),您可以执行以下操作:

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)大致对应于一个后代。

于 2013-07-25T11:58:08.240 回答
0

考虑阅读以下学术文章:

  • DEB,Kalyanmoy 等人。一种快速且精英的多目标遗传算法:NSGA-II。IEEE 进化计算交易,第 6 卷,第 3 期。2,第 182-197, 2002。
  • DEB,卡利安莫伊;阿格拉瓦尔,拉姆·布尚。连续搜索空间的模拟二元交叉。复杂系统,v. 9,n。2,第 115-148,1995。

对于 SBX,@deong 提到的交叉和变异子代的方法,请参见答案模拟二进制交叉操作-sbx-交叉操作-示例

遗传算法没有任意和确定的形式。提出了很多方法。但一般来说,适用于所有的是以下步骤:

  1. 通过批次或任何其他方法生成随机种群
  2. 跨父母抚养孩子
  3. 变异
  4. 评价孩子和家长
  5. 仅基于孩子或孩子和父母生成新人口(存在不同的方法)
  6. 返回第 2 项

NSGA-II,即上面引用的 DEB,是最广泛使用和知名的遗传算法之一。查看从文章中获取的流程图像:

在此处输入图像描述

于 2019-11-15T14:50:39.587 回答