遗传算法中两条染色体交叉思想简单,实现略微复杂,所以借鉴https://blog.csdn.net/weixin_41606064/article/details/100862016重新封装了一下,并对其中不完善的地方做了修改,步骤如下:

  • step1:从采用自然数编码的种群中,获取两条染色体,作为父代染色体;
  • step2:随机产生两个随机数满足0≤k1<k2≤LINDLIND为染色体的长度,如k1 = 3k2 =6作为截取染色体片段的起始位置,再将截取到的两个片段进行位置交换
  • step3: 解决编码重复性的冲突问题。根据映射关系,对重复基因进行修改。
    def cross(chrom1: [], chrom2: []):
        i = np.random.randint(low=0, high=len(chrom1) - 3)
        j = i + 2
        chrom1 = 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])]
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐