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