遗传算法中两条染色体交叉思想简单,实现略微复杂,所以借鉴https://blog.csdn.net/weixin_41606064/article/details/100862016重新封装了一下,并对其中不完善的地方做了修改,步骤如下:
- step1:从采用自然数编码的种群中,获取两条染色体,作为父代染色体;
- step2:随机产生两个随机数满足
0≤k1<k2≤LIND
,LIND
为染色体的长度,如k1 = 3
,k2 =6
作为截取染色体片段的起始位置,再将截取到的两个片段进行位置交换 - step3: 解决编码重复性的冲突问题。根据映射关系,对重复基因进行修改。
def cross(chrom1: [], chrom2: []):i = np.random.randint(low=0, high=len(chrom1) - 3)j = i + 2chrom1 = chrom1.tolist()chrom2 = chrom2.tolist()key = chrom1[i:j]val = chrom2[i:j]duplicates = []for e in key:if e in val:duplicates.append(e)for e in duplicates:key.remove(e)val.remove(e)chrom1[i:j], chrom2[i:j] = chrom2[i:j], chrom1[i:j]for k in range(i):if chrom1[k] in val:chrom1[k] = key[val.index(chrom1[k])]if chrom2[k] in key:chrom2[k] = val[key.index(chrom2[k])]for l in range(j, len(chrom1)):if chrom1[l] in val:chrom1[l] = key[val.index(chrom1[l])]if chrom2[l] in key:chrom2[l] = val[key.index(chrom2[l])]