实验内容与步骤
TSP 问题是一个经典的 NP 问题,很难得到最优解,利用遗传算法,可以比较快的找到近似最优。本实验采用 TSPLIB 的数据,利用遗传算法进行求解。
染色体设计
染色体设计是遗传算法的关键之一,在本实验中,采用基于路径的方法进行设计,即一条完整合法的路径为一个染色体。如 12345678 或 51834762 (以 8 个城市为例)。
交叉编码方式设计
在本实验中采用部分交叉编码方式,编码过程如下:
根据两个父代染色体建立基因对应规则
确定父代中交叉的起始位置、结束位置
互换需要交叉的编码得到子代,对于每一个子代,如果交叉的部分已经在存在,则根据基因对应规则对寻找替换基因
示例:父代 1 : 12345678; 父代 2: 51834762
步骤 1、确定基因对应规则。
父代 1 视角: 1->5、 2->1、 3->8、 4->3、 5->4、 6->7、 7->6、8->2
父代 2 视角: 5->1、 1->2、 8->3、 3->4、 4->5、 7->6、 6->7、2->8
步骤 2、确定交叉起始位置为 4,结束位置为 6。
父代 1 中需要交换的基因为 456
父代 2 中需要交换的基因为 347
步骤 3、通过互换基因得到子代。
子代 1 生成过程:父代 1 中前 3 个基因和后 2 个基因无需互换,遗传给子代 1,得到 123***78
第四个基因 4 需要交换,对应的基因为 3,得到 1233##78。由于基因 3 已经存在于子代 1(位置 3)中,因此将该基因根据对应规则修改为 8,得到1283##78,但基因 8 也已经存在,根据规则修改为 2,得到 1223##78; 2 同样存在,修改为 1,得到 1213##78; 1 也存在,修改为 5,得到 1253##78;
第五个基因 5 需要交换,对应的基因为 4,得到 12534*78;
第六个基因 6 需要交换,对应的基因为 7,得到 12534778,基因 7 已经存在,根据规则修改为 6,得到 12534768,子代 1 编码完成;
用同样的方式编码子代 2(用父代 2 视角的对应规则)。
编码原则
如果交换得到的基因已经存在,保留交换得到的基因、修改由父代遗传下来的基因。基因修改可能会有多次(由于多次冲突),但都只在同一位置进行。
变异编码规则设计
本实验采用交换变异,即在自身染色体中随机挑选两个基因,然后互换位置。
程序实现
1.设定种群数量
2.随机初始化种群染色体并计算适应度
3.根据适应度选择父代进行遗传(根据交叉概率决定是否交叉染色体)
4.根据变异率进行变异操作
5.计算适应度,如达到要求或达到迭代次数则终止算法,否则跳转到第3步
1