A、B、C、D为城市,A-B-C、A-D为路径,我若是把城市看做基因,路径看作染色体,如何给染色体编码使染色体长度一致呢
1、基于序号编码:
2、基于二进制编码:
import copy
a = [1, 2, 3, 4, ['a', 'b']]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(5)
a[4].append('c')
首先我们看看a这个list在电脑里实际的存储情况:
们再看看b的情况,b实际上和a指向的是同一个值,就好比人的大名和小名,只是叫法不同,但还是同一个人:
接下来再看看c的情况,c的情况和a.copy()的情况是一样的,都是我们所谓的浅拷贝(浅复制),浅拷贝只会拷贝父对象,不会拷贝子对象,通俗的说就是只会拷贝到第二层:
若父对象发生变化,c不会变化,因为它已经复制的所有父对象,假如子对象发生变化则c会变,比如c[4]和a[4]实际都是一个变量list,他们都指向子对象,若子对象发生变化,他们必然都变化,比如变成[“a”,“d”],那它们指向的值也就变成了a、d。
再看看d的情况,这就是我们所说的深复制,不管a进行什么操作,都不会改变d了,他们已经指向不同的值(这里是指在内存中存储的位置不同了)。
问题分析: 给定四个城市A、B、C、D,其中A-B-C、A-D为两条路径,需要对染色体进行编码,使得染色体长度保持一致。
解决方案: 1. 首先,需要确定染色体的基因表示方式。由于城市视为基因,路径视为染色体,我们可以使用整数来表示城市,例如A表示为1,B表示为2,C表示为3,D表示为4。 2. 确定染色体的长度。因为A-B-C和A-D这两条路径都有两个城市,所以染色体的长度为2。 3. 对于A-B-C这条路径,可以用一个长度为2的整数数组来表示染色体。例如,[1, 2]表示A-B,[2, 3]表示B-C。 4. 对于A-D这条路径,同样使用一个长度为2的整数数组来表示染色体。例如,[1, 4]表示A-D。 5. 这样,无论是A-B-C还是A-D这两条路径,都可以用长度为2的染色体来表示。
代码示例:
# 创建一个二维数组来表示染色体
chromosome_AB_C = [[1, 2], [2, 3]] # A-B-C的染色体表示
chromosome_A_D = [[1, 4]] # A-D的染色体表示
# 获取染色体长度
chromosome_length = len(chromosome_AB_C[0])
# 打印染色体表示
print("A-B-C的染色体表示:", chromosome_AB_C)
print("A-D的染色体表示:", chromosome_A_D)
print("染色体长度:", chromosome_length)
输出结果:
A-B-C的染色体表示: [[1, 2], [2, 3]]
A-D的染色体表示: [[1, 4]]
染色体长度: 2
通过以上步骤,我们可以保证染色体的长度一致,并且每个染色体都可以准确地表示对应的城市路径。