编码目的和解析
- 旅行商问题:
- 地图上有n个点,旅行商要求从一个点出发,经过每个城市一次且仅一次并最终回到出发城市,求最短路径
- 使用matlab作为编程工具,采用遗传算法对tsp(旅行商)问题进行基本编码实现和优化解答,最终控制误差在一定范围内,或者找到旅行商问题的最优解。
注:旅行商问题的已知最优解是通过遍历得到的,不可能通过智能算法得到更短的距离,除非计算公式出错或者数据出现问题。
数据获取
所需工具/软件/数据
软件:matlab
日志:csdn博客
资料来源:百度搜索的结果页面链接
搜索到的资料及其网址
-
《TSP的已知最优解》:百度文库网址 该文档的上传日期为2014年,该文档最后一行显示的时间点为2007年。
-
oschina中的数据集下载网址:MP-TESTDATA - The TSPLIB Symmetric Traveling Salesman Problem Instances
数据集和代码已经上传到csdn中,欢迎学习和交流
-
遇到的第一个问题是距离的计算问题,具体可以通过下载这个文件去查看具体数据集的距离计算公式:http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/tsp95.pdf
文件第九页有每种问题的对应距离计算方法,再通过该方法找到具体的措施即可
举个例子:
a280数据集(图片中的第一个),可以找到Type为EUC_2D,在pdf文件中搜索该类型,即可找到对应的计算公式如下:
原理解析
种群确定与基本操作
- 首先要确定每个个体的元素和一个规模合适的种群
- tsp问题每个个体其实可以看做n个城市的链条
- 比如n = 5,<1,2,3,4,5>的排列顺序可以看成一个个体
- 1 2 3 4 5就是一个一个基因片段,后续重组变异也是基于此实现
- 确定种群的规模
- 和个体的基因数有关,一般规模不大时设置为100-1000即可
- 注意:规模越大,可能导致运算时间过长
- 到这里,对应实现种群的初始化即可
- 比如一千个个体,每个个体48个基因(n=48)随机排列
选择
- 是挑选父代的个体作为随后重组、变异的来源
- 主要有两种方法:轮盘赌和锦标赛(试验效果更好)
- 生成一个个体所需的父代一般是两个
- 所以使用两次算法得出两个个体参与重组、变异即可
轮盘赌:
- 结合tsp算法进行解释:
- 适应度:粗略理解为该个体生存下去的可能性的大小
- 在tsp问题中,可以理解为距离越小,适应度越高
- 所以可以取距离的倒数
- 求出父代每个个体的适应度,并进行累加得到max
- 这里需要生成一个数组,存放自第一个到第m个个体的累积适应度
- 例如有三个个体,适应度为0.2,0.5,0.7
- 生成的数组就是[0.2,0.7,1.4]
- 这里需要生成一个数组,存放自第一个到第m个个体的累积适应度
- 随后获得一个随机数 ran 在0-max之间
- 看看这个ran小于哪个累计数(0.2,0.7,1.4)就选择哪个个体
- 例如ran=0.6,则选择第二个个体,因为0.6>0.2且0.6<0.7
锦标赛
- 选择m个个体,选择适应度最高的个体作为父代
- 这个很简单,理解为在n个个体中选择m个个体,再比较这m个个体,选择距离最短的那个个体就行
- 例如种群数量有10个,随机选择5个个体(n=10,m=5)
- 这五个个体距离为:100,200,300,400,500
- 选择第一个个体,因为距离最小
重组
- 通过筛选出来的两个个体,即可进行重组运算
- 生物学上:重组就是选择父代两个相同位置的片段,交换上面的基因,形成新的个体
- 在tsp问题中,也是一样的,但是要考虑到如果交换了,可能出现某些城市出现了两次的情况
- 所以交换的时候采用以下的方法进行交换,看图解:
变异
- 随机选择两个基因进行交换即可
- 例如上图子代1的1和8交换,就变成了
- 3 5 6 9 2 8 7 1 4
- 变异的概率要控制好
- 太高的话,容易无法收敛到局部最优解
- 太低的话,收敛后无法跳出
代码解析
看不懂没关系,后面《最终代码》有更详细的代码,或者下载页面末尾的代码连接,下载到自己的电脑上,运行一下,看一下代码逻辑就懂了
页面读取逻辑
首先是一个初始化的参数设置
clear;
clc; %清空其他程序残留的变量
tStart = tic; % 算法计时器
%%%%%%%%%%%%自定义参数%%%%%%%%%%%%%
[cityNum,cities] = Read('att48.tsp');%读取tsp文件中的数据
cities = cities';%读取数据后进行反转
%cityNum = 100;
maxGEN = 1000;%设置迭代的次数
popSize = 1000; % 遗传算法种群大小
crossoverProbabilty = 0.9; %交叉概率
mutationProbabilty = 0.3; %变异概率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%存储