一、获取代码方式

获取代码方式1:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

获取代码方式2:
完整代码已上传我的资源:【MTSP】基于matlab遗传算法求解多旅行商问题【含Matlab源码 1325期】

备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、TSP简介

旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
TSP的数学模型

三、遗传算法简介

1 引言


2 遗传算法理论
2.1 遗传算法的生物学基础


2.2 遗传算法的理论基础




2.3 遗传算法的基本概念






2.4 标准的遗传算法


2.5 遗传算法的特点


2.6 遗传算法的改进方向

3 遗传算法流程



4 关键参数说明

四、案例及部分源代码

1 案例
35个城市,5个旅行商。找到最小路径。

2 部分源代码

n = 35;    %设置城市个数
xy = 10*rand(n,2);   %随机产生城市的坐标,实际应用中可以自己输入坐标。主要用以画图,真正起作用的是距离矩阵啦。
salesmen = 5;   %设置旅行商的人数
min_tour = 3;    %设置每个旅行商至少走过三个城市(除去起始点和终止点的话就是一个城市)
pop_size = 80;    %设置种群的个数,必须是8的倍数,因为代码中以 8 做为步骤 2 的分组个数
num_iter = 5e3;   %设置迭代总次数, i.e. 5000次
a = meshgrid(1:n);   %用以计算距离矩阵。
dmat = reshape(sqrt(sum((xy(a,:)-xy(a',:)).^2,2)),n,n);   %计算距离矩阵(欧式距离),可以自己输入。
[opt_rte,opt_brk,min_dist] = mtspof_ga(xy,dmat,salesmen,min_tour, ...pop_size,num_iter,1,1);  %运行代码
function varargout = mtspofs_ga(xy,dmat,salesmen,min_tour,pop_size,num_iter,show_prog,show_res)
% MTSPOFS_GA Fixed Start Open Multiple Traveling Salesmen Problem (M-TSP) Genetic Algorithm (GA)
%   Finds a (near) optimal solution to a variation of the "open" M-TSP by
%   setting up a GA to search for the shortest route (least distance needed
%   for each salesman to travel from the start location to unique individual
%   cities without returning to the starting location)
%
% Summary:
%     1. Each salesman starts at the first point, but travels to a unique
%        set of cities after that (and none of them close their loops by
%        returning to their starting points)
%     2. Except for the first, each city is visited by exactly one salesman
%
% Note: The Fixed Start is taken to be the first XY point
%
% Input:
%     xy (float):城市坐标,可以 2 维或者 3 维。
%     dmat (float) 距离矩阵 N X N 维
%     salesman (scalar integer) 旅行商个数。
%     min_tour (scalar integer) 不包含起始点,每个旅行商最少应该 travel 的数量。
%     pop_size (scalar integer) 遗传算法中个体的数量。
%     num_iter (scalar integer) 算法一共迭代的次数
%     show_prog (scalar logical) 如果等于1,就将迭代过程画出来
%     show_res (scalar logical) 如果等于1,就将算法最后的结果展示出来
%
% Output:
%     opt_rte (integer array) 输出最优个体的路径基因型
%     opt_brk (integer array) 输出最优个体的中断点基因型
%     min_dist (scalar float) 最有个体代表的所有旅行商的距离之和。
%
%
% Author: Joseph Kirk
% Email: jdkirk630@gmail.com
% Release: 1.3
% Release Date: 6/2/09
% commenter: zhuo%检测输入参数,如果某些参数没有输入,那么改段代码就自动帮你加了。
nargs = 8;
for k = nargin:nargs-1switch kcase 0xy = 10*rand(40,2);  % 设置城市坐标的默认值为 40 个,随机产生 2 维坐标case 1N = size(xy,1);      %设置城市数目 N = size(xy,1)a = meshgrid(1:N);  dmat = reshape(sqrt(sum((xy(a,:)-xy(a',:)).^2,2)),N,N);  %产生相应的距离矩阵。case 2salesmen = 5;   %旅行商个数的默认值为 5 个。case 3min_tour = 2;   %默认每个旅行商至少走 2 个城市case 4pop_size = 80;case 5num_iter = 5e3;case 6show_prog = 1;case 7show_res = 1;otherwiseend
end%验证输入是否可行,验证原理为城市个数 N 是否和 距离矩阵的 size相等
[N,dims] = size(xy);
[nr,nc] = size(dmat);
if N ~= nr || N ~= ncerror('Invalid XY or DMAT inputs!')
end
n = N - 1; % 除去了起始点% Sanity Checks    还是验证输入:可以不看
salesmen = max(1,min(n,round(real(salesmen(1)))));
%验证输入的旅行商个数是不是大于1,并且是整数,否则帮你四舍五入改了
min_tour = max(1,min(floor(n/salesmen),round(real(min_tour(1)))));
%验证输入的minTour是不是大于1,并且是整数,否则帮你四舍五入改了
pop_size = max(8,8*ceil(pop_size(1)/8));
%验证输入的个体数是否为8的整数(因为后面的分组8个为一组),否则帮你用ceil函数改了
num_iter = max(1,round(real(num_iter(1))));
%验证输入的迭代次数是否大于1,否则帮改了
show_prog = logical(show_prog(1));
%验证是否为1或0,不然帮你改了,下同。
show_res = logical(show_res(1));num_brks = salesmen-1;   % 设置中断点的个数,下面可以不看。
dof = n - min_tour*salesmen;
addto = ones(1,dof+1);
for k = 2:num_brksaddto = cumsum(addto);
end
cum_prob = cumsum(addto)/sum(addto);% Initialize the Populations
pop_rte = zeros(pop_size,n);          % 所有个体的路径基因型
pop_brk = zeros(pop_size,num_brks);   % 所有个体的中断点基因型
for k = 1:pop_sizepop_rte(k,:) = randperm(n)+1;    %初始化所有个体的路径基因型。%这里为什么加 1 呢?因为我们 n=N-1=34 ,因此产生的路径基因型必须在[2,35]中产生。pop_brk(k,:) = randbreaks();   %产生中断点,函数代码在下方(子函数)
end% 选择画图时的颜色(不同旅行商的路径画在图上要用不同颜色呀)
clr = [1 0 0; 0 0 1; 0.67 0 1; 0 1 0; 1 0.5 0];
if salesmen > 5clr = hsv(salesmen);
end% Run the GA
global_min = Inf;
total_dist = zeros(1,pop_size);   %每个个体的总距离构成的 1X80 维的向量
dist_history = zeros(1,num_iter);   %每一次迭代个数中最优个体的总距离构成的 1X5000 维的向量。
tmp_pop_rte = zeros(8,n);   %暂时变量,用完就丢。用于产生新个体的,(路径的基因型)
tmp_pop_brk = zeros(8,num_brks);    %同上,用于产生新的中断点的基因型
new_pop_rte = zeros(pop_size,n);    %新生代的路径基因型,为一个 80X34 的矩阵,每一行代表每一个个体。
new_pop_brk = zeros(pop_size,num_brks); %同上,用于中断点基因型 80X4 的矩阵。
if show_progpfig = figure('Name','MTSPOFS_GA | Current Best Solution','Numbertitle','off');
end
for iter = 1:num_iter     %计算一次迭代过程中,每一个个体的总距离for p = 1:pop_sized = 0;p_rte = pop_rte(p,:);p_brk = pop_brk(p,:);rng = [[1 p_brk+1];[p_brk n]]';for s = 1:salesmend = d + dmat(1,p_rte(rng(s,1))); % 加上起点到第二个城市的距离%计算路径中城市的总距离:for k = rng(s,1):rng(s,2)-1d = d + dmat(p_rte(k),p_rte(k+1));endendtotal_dist(p) = d;  %将每一个个体的距离存入到矩阵中。end

五、运行结果


六、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

【MTSP】基于matlab遗传算法求解多旅行商问题【含Matlab源码 1325期】相关推荐

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

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

  2. 【Matlab验证码识别】遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别【含GUI源码 1694期】

    一.代码运行视频(哔哩哔哩) [Matlab验证码识别]遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别[含GUI源码 1694期] 二.matlab版本及参考文献 1 matlab ...

  3. 【Matlab路径规划】改进的遗传算法机器人避障路径规划【含GUI源码 703期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]改进的遗传算法机器人避障路径规划[含GUI源码 703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  4. 【Matlab生物电信号】生物电信号仿真【含GUI源码 684期】

    一.代码运行视频(哔哩哔哩) [Matlab生物电信号]生物电信号仿真[含GUI源码 684期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]董兵,超于毅,李 ...

  5. 【Matlab语音分析】语音信号分析【含GUI源码 1718期】

    一.代码运行视频(哔哩哔哩) [Matlab语音分析]语音信号分析[含GUI源码 1718期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊,郑铁 ...

  6. 【Matlab人脸识别】BP神经网络人脸识别(含识别率)【含GUI源码 891期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]BP神经网络人脸识别(含识别率)[含GUI源码 891期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  7. 【Matlab人脸识别】形态学教室人数统计(带面板)【含GUI源码 1703期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]形态学教室人数统计(带面板)[含GUI源码 1703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟 ...

  8. 【Matlab人脸识别】人脸实时检测与跟踪【含GUI源码 673期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]人脸实时检测与跟踪[含GUI源码 673期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟逸凡,柳益君 ...

  9. 【Matlab图像融合】小波变换遥感图像融合【含GUI源码 744期】

    一.代码运行视频(哔哩哔哩) [Matlab图像融合]小波变换遥感图像融合[含GUI源码 744期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  10. 【Matlab语音加密】语音信号加密解密(带面板)【含GUI源码 181期】

    一.代码运行视频(哔哩哔哩) [Matlab语音加密]语音信号加密解密(带面板)[含GUI源码 181期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆 ...

最新文章

  1. 大规模1.4亿中文知识图谱数据,我把它开源了
  2. TensorFlow 教程——基本分类:对服装图像进行分类
  3. ESP3 + ESP-IDF | 串口1 - 简单的串口回环测试
  4. Physical Plausible Shading
  5. 微信防撤回补丁来了!更新也不会失效
  6. opencms整合到java项目里_java-将标签云添加到OpenCMS网站
  7. 学习Vue电商后台管理系统剩余功能模块的bug
  8. 计算机分盘介质受写入保护,“介质受写入保护”的解决(适用于U盘或移动硬盘)...
  9. 知名互联网公司架构图
  10. OpenCvSharp工作学习笔记5-图片缩放
  11. Jikes 研究虚拟机(RVM)一 设计和实现问题
  12. 如何使用启动盘PE桌面工具安装原版win7系统?
  13. 【C++】洛谷P1330 封锁阳光大学
  14. 打印表格留标题怎么设置_打印如何添加标题?内容一页打不下?—关于Excel文档打印的那些事-excel打印区域怎么设置...
  15. Windows PC连接苹果LG UltraFine 4K显示器教程
  16. 分布式跟踪系统(SpringCloudSluth+OpenZipkin)
  17. 2020,我用Python写春联
  18. 前端学习-盒模型和怪异盒模型
  19. 东集PDA连接USB被AndroidStudio识别
  20. 编程经典书籍:龙书、虎书、魔法书

热门文章

  1. OO第四单元UML作业总结暨OO课程总结
  2. android注解处理技术APT
  3. kubeadm安装k8s测试环境
  4. nyoj Color the fence
  5. php以及Yii里面的常量收集
  6. 浅谈网络游戏的设计——服务器端编程 (2)
  7. 2020-12-05
  8. 20191216每日一句
  9. Prefer rather than 喜欢 Prefer to
  10. Atitit 提升记忆效率 有损压缩原理总结 目录 1. 常见方法 1 1.1. 抽象化提升一层 概念化 1 1.2. 骨架 ,目录化 大纲化 归纳整理 1 1.3. 提取关键词 ,摘要 ,