【Matlab】 遗传算法求解TSP问题

文章目录

  • 【Matlab】 遗传算法求解TSP问题
  • 前言
  • 一、问题描述
  • 二、实验设计
    • 1.问题案例
    • 2.读入数据
    • 3.适应度计算
    • 4. 选择子代
    • 5. 结果输出
  • 总结

前言

个人实验的一次记录,如有不当欢迎批评指正

TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长,到目前为止还未找到一个多项式时间的有效算法。在现实生活中,TSP问题广泛应用于货物零件加工顺序、汽配件喷涂顺序、仓储系统拣货路径规划、光伏板清洁等领域。
自20世纪80年代以来,基于启发式规则的智能优化算法兴起并被快速应用于求解TSP问题,如遗传算法、模拟退火算法、蜂群算法、蚁群算法、萤火虫算法、粒子群算法等,它们普遍具有快速搜索和求解能力,对规模更大的TSP问题也有明显效果。其中,以达尔文进化论、孟德尔遗传变异理论、模式理论为基础的遗传算法逐渐受到重视,它是一种自适应全局优化的概率搜索算法,具有较强的鲁棒性、并行性,容易与其他算法结合等优点,但也存在交叉算子不易操作、容易过早收敛而陷入局部最优、收敛速度慢等缺点

一、问题描述

TSP问题可描述为:已知mmm个城市相互之间的距离,某一旅行商从某个城市出发访问每个城市有且仅有一次,最后回到出发城市,如何安排才使其所走路线距离最短。也就是寻找一条最短的遍历nnn个城市的路径,或者说搜索自然子集X={1,2,⋯,n}(X的元素表示对n个城市的编号)的一个排列X=\left\{ 1,2,\cdots ,n \right\} \left( X\text{的元素表示对}n\text{个城市的编号} \right) \text{的一个排列}X={1,2,⋯,n}(X的元素表示对n个城市的编号)的一个排列
π(X)={V1,V2,⋯,Vn}使得\pi \left( X \right) =\left\{ V_1,V_2,\cdots ,V_{\mathrm{n}} \right\} \text{使得}π(X)={V1​,V2​,⋯,Vn​}使得 Td=∑i=1n+1d(Vi,Vi+1)+d(Vn,V1)T_{\mathrm{d}}=\sum_{i=1}^{n+1}{d\left( V_{\mathrm{i}},V_{\mathrm{i}+1} \right) +d\left( V_{\mathrm{n}},V_1 \right)}Td​=∑i=1n+1​d(Vi​,Vi+1​)+d(Vn​,V1​)取得最小值,其中d(Vi,Vi+1)d\left( V_{\mathrm{i}},V_{\mathrm{i}+1} \right)d(Vi​,Vi+1​)表示城市ViV_{\mathrm{i}}Vi​到城市Vi+1V_{\mathrm{i+1}}Vi+1​的距离。

二、实验设计

1.问题案例

本案例以14个城市为例,假定14个城市的位置坐标如表1所列。寻找出一条最短的遍历14个城市的路径。具体如下:

编号 X坐标 Y坐标 编号 X坐标 Y坐标
1 16.47 96.10 8 17.20 96.29
2 16.47 94.44 9 16.30 97.38
3 20.09 92.54 10 14.05 98.12
4 22.39 93.37 11 16.53 97.38
5 25.23 97.24 12 21.52 95.59
6 22.00 96.05 13 19.41 97.13
7 20.47 97.02 14 20.09 94.55

2.读入数据

代码如下(示例):

function [popinit,distmat,Villes] = file_init(nbrpop)
%读取包含城市坐标的文件
[FileName,~] = uigetfile('*.txt','选择文本文件');fid = fopen(FileName,'r');Villes = dlmread(FileName,'%d%10.4f%10.4f'); %将文件中的值存储在Cities数组中[nbrville,~] = size(Villes);fclose(fid);distmat = zeros(nbrville,nbrville); %距离矩阵
popinit = zeros(nbrpop,nbrville);   %初始种群矩阵%创建初始种群(随机)
for i=1:nbrpoppopinit(i,:) = randperm(nbrville);
end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 欧式距离 %
%填充距离矩阵
for i=1:nbrvillefor j=1:nbrvilledistmat(i,j) = sqrt( (Villes(i,2)-Villes(j,2))^2 + (Villes(i,3)-Villes(j,3))^2 );end
endend

将表格内数据保存为文本格式 中间以空格形式隔开,即可通过该函数读入相关信息。

3.适应度计算


% vectfit:向量包含每次行程的总距离(成本)
% best:向量包含迭代中得到的最佳路径当前的
% minVal:本次行程对应的最佳值(最佳)function [vectfit,best,minVal,indxBest]=calcFitness (nbrpop ,nbrville, distmat ,popinit)vectfit = zeros(1,nbrpop);%计算的适应度向量for i=1:nbrpoptmp = popinit(i,:);for j=1:nbrvilleif j==length(tmp)vectfit(i) = vectfit(i) + distmat(tmp(j),tmp(1));break;endvectfit(i) = vectfit(i) + distmat(tmp(j),tmp(j+1));endend[minVal,indxBest]=min(vectfit) ; %min() 给了我们两个值:最小值和这个值的索引
best=popinit(indxBest , : ) ;end

我们通过欧氏距离矩阵直接获取各个点之间的距离关系,通过距离换算出其适应度,用于后续的计算。

4. 选择子代


% matelec:包含选择进行繁殖的个体的矩阵function matselec = rouletteSelect(vectfit,popinit)Ps = 0.5;[nbrpop,nbrville] = size(popinit);nbrpopS = floor(nbrpop*Ps);           % 我们选择 Ps*100% 的个人matselec = zeros(nbrpopS,nbrville);
cumProb = zeros(1,length(vectfit));     % 包含累积适应度的向量s = 0;% 累积概率计算for j=1:length(vectfit)cumProb(j) = s + vectfit(j);s = cumProb(j);end% 填充选择矩阵进行育种for i=1:nbrpopSr = (max(cumProb)-min(cumProb))*rand() + min(cumProb); % min(cumProb) <= r <= max(cumProb)for j=1:length(cumProb)if r <= cumProb(j)matselec(i,:) = popinit(j,:);break;endendendend

采取精英策略选择相关的适应度较高的个体用于后续的迭代,通过这种方法,不断的迭代直到满足迭代次数或者达到相关精度。

5. 结果输出


对应轨迹图

其迭代过程如上
实验源码点击此处


总结

对于实际问题,我们需要采取不同的策略与手段,根据实际问题的需求,设计合理的求解方法,不断地深入的分析问题的本质,才有助于我们解决这些问题。

【Matlab】 遗传算法求解TSP问题相关推荐

  1. 【建模算法】基于遗传算法求解TSP问题(matlab求解)

    [建模算法]基于遗传算法求解TSP问题(matlab求解) TSP (traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增 ...

  2. 【GA TSP】基于matlab遗传算法求解旅行商问题【含Matlab源码 1337期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab遗传算法求解旅行商问题[含Matlab源码 1337期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  3. 【老生谈算法】matlab实现遗传算法求解TSP问题——TSP问题

    遗传算法求解TSP问题MATLAB实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]遗传算法求解TSP问题MATLAB实现 ...

  4. 【GA TSP】基于matlab遗传算法求解旅行商问题【含Matlab源码 1909期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[GA TSP]基于matlab遗传算法求解旅行商问题[含Matlab源码 1909期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  5. 【GA MTSP】基于matlab遗传算法求解多旅行商问题(多且同始终点)【含Matlab源码 1339期】

    一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[MTSP]基于matlab遗传算法求解多旅行商问题[ ...

  6. 人工智能导论——遗传算法求解TSP问题实验

    一.实验目的: 熟悉和掌握遗传算法的原理.流程和编码策略,并利用遗传算法求解组合优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响. 二.实验原理: 旅行商问题,即TSP问题(Traveli ...

  7. 【生产优化】基于matlab遗传算法求解帐篷工序问题【含Matlab源码 2145期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [生产优化]基于matlab遗传算法求解帐篷工序问题[含Matlab源码 2145期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  8. 局部搜索、模拟退火和遗传算法求解TSP问题

    模拟退火和遗传算法求解TSP问题 源代码传送门:GITHUB 数据传送门:TSPLIB 文章目录 模拟退火和遗传算法求解TSP问题 摘要 1 导言 1.1 问题重述 1.2 TSP问题选择 1.3 思 ...

  9. 基于遗传算法求解TSP问题(旅游路径规划,Python实现,超详细,可视化,结果分析)

    ps:作者是很用心写的,如果觉得不错,请给作者一点鼓励噢!(点赞收藏评论噢) 基于遗传算法求解TSP问题 摘要 巡回旅行商问题(TSP)是组合优化中的经典问题.常见的TSP问题求解算法例如穷举法.贪心 ...

最新文章

  1. Java数据结构 反转链表
  2. 职业-把工作当作职业 or 事业?
  3. Qt修炼手册6_图形:图形视图框架
  4. IntrospectorCleanupListener作用
  5. openjdk platform binary是什么进程_基于pytest实现appium多进程兼容性测试
  6. CVTE2016校招试题摘选
  7. ORACLE查询表最近更改的数据
  8. 5渲染判断_先渲染再对焦,KeyShot 深度通道在 Photoshop 中的对接
  9. 关于流(文件)的输入,输出与调用(fprintf,fscanf)
  10. POJ 3087 Shuffle'm Up(水题)
  11. 配置eclipse插件
  12. python爬取招聘网站源码及数据分析_Python爬取招聘网站进行数据分析,福利待遇一清二楚,高薪很简单...
  13. html怎么做出相框的效果,使用html5 svg和css3制作边框运动的动画效果
  14. mysql 日志重做,設置MySQL重做日志大小
  15. Gartner技术成熟曲线详解
  16. React基础(叁)———事件处理
  17. Spring Boot HTTP over JSON 的错误码异常处理
  18. 谷歌地图获取点击时候的具体经纬度api
  19. Linux MMC原理及框架详解
  20. Windos下安装nexus私服(nexus-2.12.0-01)

热门文章

  1. 7784-54-5,1,3,4,6-tetra-O-acetyl-2-deoxy-2-acetamido-α-D-glucopyranose结构式解析
  2. STM32 4SPI模式点OLED(SSD1306驱动)屏
  3. 关于一加手机出现 qualcomm crashdump mode 解决办法
  4. vue3 + ts + pinia + vite + vueRouter4的基本配置和使用
  5. jsp的forword标签
  6. 面试——Spring中的循环依赖
  7. 使用rman nocatalog方式备份Oracle - NetBackup配置方法
  8. hdu1242 Rscue hdu 1253胜利大逃亡
  9. QML ListView 实现下拉刷新 上拉加载
  10. 创建霍夫曼树,霍夫曼编码以及使用霍夫曼编码压缩文件