与背包问题不同,在求解TSP问题时,染色体编码采用整数编码而不是二进制编码,对于每个城市用一个整数来编号,一个路径就是一条染色体编码。在进行选择运算时,常采用类OX交叉算法,其思路为:
假设
父代 A 1250|436|798
父代 B 3097|654|281
对染色体切片后随机选择一个片段,比如父代B的中间片段654,作为子代的一个片段,在父代A中选择A中存在而父代B中选择的片段不存在的基因,将其作为子代的基因,由此得到子代染色体编码为1203|654|798实现代码为:
def cross(self, parent1, parent2):
index1 = random.randint(0, self.geneLenght - 1)
index2 = random.randint(index1, self.geneLenght - 1)
tempGene = parent2.gene[index1:index2] #交叉的基因片段
newGene = []
len = 0
for g in parent1.gene:
if len == index1:
newGene.extend(tempGene)# 插入基因片段
len += 1
if g not in tempGene:
newGene.append(g)
len += 1
self.crossCount += 1
return newGene