计算智能第三次大作业,用python实现。
用遗传算法(GA)解决旅行商问题(TSP)。遗传算法是模拟进化算法的一种,经典的仿生学算法。这个算法有毒,结果没有模拟退火好,而且好慢。
问题描述
TSP问题(旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。
转换为图论问题即:给定一个 $n$ 个节点的加权完全图 $d$ ,求一权重最小的哈密尔顿回路 $p$ 。
动态规划求解的经典问题。用遗传算法来实现。
要点
参数
- 问题条件符号
- 总共 $N$ 个节点,节点用数字编号 $0,1,\cdots,n-1$ 表示
- 任意两个节点距离用邻接矩阵 $ d[i,j] $ ,其中 $i,j\in {0,1,\cdots,n-1} $
- 遗传算法符号
- 种群规模 $M$ ,可取$M = 27N$
- 路径$p[i][0:N-1]$ 表示种群中第i个元素所对应的路径$[0:N-1]$
- 路径长度$l[i]$ 表示种群中第i个元素所对应的路径长度
- 归一化适应度 $p[i]$
- 变异概率 $P_m = 0.1= 10%$
- 杂交本次实验采用取父代的一半,母代的剩余部分,不需要参数
- 特殊符号
- 为了运行结果展示的方便,将全局的随机种子$seed = 1$。
细节介绍
遗传算法主要的操作有:杂交、变异、选择。对于每一代种群都进行这三种操作,如此往复,直到满足停止条件。
按程序写的顺序介绍一下每个函数实现的细节。顺便说一下停止条件。
杂交:hybrid
杂交分两步,第一步是适应度的计算,程序里用cal_adp()函数实现,第二步是杂交,让适应度越高的个体杂交的几率越大。
适应度函数计算:cal_adp()
适应度函数主要是给杂交操作提供数据,以便适应度越高的杂交计算当前种群的。主要的步骤就是:计算路径长度$l[i]$,取适应度$p[i] = \frac{1}{l[i]}$,然后归一化
$p[i] = \frac{p[i]}{\Sigma p[i]}$ ,将适应度作为杂交被选取到的概率。
杂交
根据适应度选取两个不同个体,然后各自作为父亲,取前一半路径,剩下一半取另外一个个体的剩余路径,生成两个子代。
进行$\frac{M}{2}$次这样的操作,产生$M$个子代。
变异:mutate
变异就是将杂交后生成的子代中每一个进行一个变异操作:若随机数小于变异概率,随机调换该个体中的两个节点。
选择:generate
生成下一代,这里不将杂交变异后的子代直接作为下一代,而是选取当前父代的一些最优解随机插入子代中代替子代的一部分。从而生成新的子代。
停止条件
如果连续一定代的遗传,其最优的解都没有变化,那么就将其视为收敛,这里设定为500。
python代码
1 | import numpy as np |