你可以尝试一种统一的交叉。
一般Uniform Crossover使用两个亲本之间的固定混合比,操作员评估亲本染色体中的每个基因以进行交换,概率为0.5。
使用 Python 语法:
import random
p = [['a','b','c','d'], ['e','f','a','b']] # parents
for i in range(len(p[0])):
offspring.append(p[random.randint(0, 1)][i])
鉴于唯一性约束,必须修改基本方案:
import random
p = [['a','b','c','d'], ['e','f','a','b']] # parents
for i in range(len(p[0])):
if p[1][i] in p[0]: # cannot risk crossover, keep basic gene
offspring.append(p[0][i])
else: # standard uniform crossover
offspring.append(p[random.randint(0, 1)][i])
“自动”满足约束条件,您的搜索空间更小。
请注意,交叉在某种程度上与第一个父级 (p[0]) 绑定,我们得到的变体数量有限:
CHROMOSOME FREQUENCY
abcd *************************
efcd ************************
ebcd ************************
afcd ************************
在这方面的一个小改进是:
if p[1][i] in offspring or p[1][i] in p[0][i:]:
offspring.append(p[0][i])
else:
offspring.append(p[random.randint(0, 1)][i])
和
CHROMOSOME FREQUENCY
efcd ******
afcd ************
efad ******
ebcd ************
efcb ******
efab ******
ebad ************
abcd *************************
afcb ************
但“诀窍”只对某些父母有效。例如。切换父母:
p = [['e','f','a','b'], ['a','b','c','d']]
你又来了:
CHROMOSOME FREQUENCY
efcd *************************
efcb ************************
efad *************************
efab ************************
edge recombination operator 是另一种可能性:
ERO 通过查看边而不是顶点来创建类似于一组现有路径(父路径)的路径。它的主要应用是遗传算法中的交叉,当需要具有非重复基因序列的基因型时,例如旅行商问题。
(不确定是不是你的情况)