matlab使用遗传算法解决旅行商tsp问题

编码目的和解析

  • 旅行商问题:
    • 地图上有n个点,旅行商要求从一个点出发,经过每个城市一次且仅一次并最终回到出发城市,求最短路径
  • 使用matlab作为编程工具,采用遗传算法对tsp(旅行商)问题进行基本编码实现和优化解答,最终控制误差在一定范围内,或者找到旅行商问题的最优解。

注:旅行商问题的已知最优解是通过遍历得到的,不可能通过智能算法得到更短的距离,除非计算公式出错或者数据出现问题。

数据获取

所需工具/软件/数据

软件:matlab

日志:csdn博客

资料来源:百度搜索的结果页面链接

搜索到的资料及其网址

  1. 《TSP的已知最优解》:百度文库网址 该文档的上传日期为2014年,该文档最后一行显示的时间点为2007年。

  2. oschina中的数据集下载网址:MP-TESTDATA - The TSPLIB Symmetric Traveling Salesman Problem Instances

数据集和代码已经上传到csdn中,欢迎学习和交流

  1. 遇到的第一个问题是距离的计算问题,具体可以通过下载这个文件去查看具体数据集的距离计算公式: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]
  • 随后获得一个随机数 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; %变异概率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%存储
  • 10
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值