本篇文章是利用遗传算法来解决MTSP或者MVRP问题的,至于遗传算法较为详尽的介绍的话,在我上一篇文章中有介绍,这里就不再啰嗦了。

1、问题简述

在本文中,MTSP问题就是有一组旅行者需要遍历完给定的所有城市,并且回到起点,要求其总体的旅行距离为最小;MVRP问题就是把一组旅行者变为一组机器人而已。在本文中所有旅行者的起点是不确定的,也就是说旅行者可以随机从一个城市出发,并且在最后要回到起点城市。假设旅行者人数为nSalesmen = k,城市位置为xy,那么整体的图会有K个回路,且K个回路中没有子回路了。

城市位置分布图

2、染色体编码问题

染色体编码方式采用的仍然是十进制编码方式,与TSP问题不同的是:每一个个体都会有一个与之相对应的染色体分隔点的集合。把染色体进行分隔的目的是区别每一个旅行者的路径。如下图所示,假设有3个机器人,需要去访问14个城市,则染色体就是14个城市序号的随机排列,3个机器人则对应有两个分隔点标记,如图产生的两个分隔点标记为5和11的位置。

染色体分隔演示

若每一个旅行者有最小旅行城市的限制的话,也就是每一个旅行者至少需要旅行minTour个城市的话,染色体分隔点会有所不同。集中在染色体前端的位置作为分隔点的概率会小很多,且分隔点与分隔点之前必须要有minTour个城市,则需要根据概率来限制分隔点的选择了。

3、遗传算法流程

重新回顾一下遗传算法的流程吧!

GA流程

在本文中问题的初始解包括旅行者初始路线的初始化和染色体分隔点的初始化,两者是一一对应的关系。

4、Matlab代码及其结果

function varargout = mtsp_ga(xy,dmat,nSalesmen,minTour,popSize,numIter,showProg,showResult)
%若无参数输入,参数初始化
nargs = 8;
for k = nargin:nargs-1switch kcase 0xy = 100*rand(50,2);%随机生成50个城市坐标,rand(0~1)case 1N = size(xy,1);%城市个数a = meshgrid(1:N);%生成N*N升序矩阵dmat = reshape(sqrt(sum((xy(a,:)-xy(a',:)).^2,2)),N,N);%计算距离矩阵。装置,生成N*N的距离矩阵case 2nSalesmen = 5;%旅行者个数case 3minTour = 3;%最小旅行距离case 4popSize = 80;%种群个数case 5numIter =5e3;%迭代次数case 6showProg =1;%展示迭代过程case 7showResult = 1;%展示最终结果otherwiseend
end
%对输入参数进行扫描
[N,dims] = size(xy);%城市个数、维数
[nr,nc] = size(dmat);%距离矩阵的行数和列数
if N~=nr||N~=ncerror('城市坐标或距离矩阵输入错误')
end
n =N;%数据检查
nSalesmen = max(1,min(n,round(real(nSalesmen(1)))));
minTour = max(1,min(floor(n/nSalesmen),round(real(minTour(1)))));
popSize = max(8,8*ceil(popSize(1)/8));
numIter = max(1,round(real(numIter(1))));
showProg = logical(showProg(1));%将数值转变为逻辑值
showResult=logical(showResult(1));%初始化路径分隔点(染色体分隔点)
nBreaks = nSalesmen -1;
dof = n - minTour*nSalesmen; %自由城市数目
addto = ones(1,dof+1);%余下插入的位置剩下25个,可供插入
for k = 2:nBreaksaddto = cumsum(addto);%累加
end
cumProb = cumsum(addto)/sum(addto);%% 初始化种群
popRoute = zeros(popSize,n);%80个体
popBreak = zeros(popSize,nBreaks);%每个种群都有特定的分隔点
popRoute(1,:) = (1:n);%第一个种群为1到50的升序排列
popBreak(1,:) = rand_breaks();%随机生成第一个分隔种群
for k = 2:popSizepopRoute(k,:) = randperm(n);popBreak(k,:) = rand_breaks();
end%选择画图颜色
pclr = ~get(0,'DefaultAxesColor');
clr = [1 0 0;0 0 1;0.67 0 1;0 1 0;1 0.5 0];
if nSalesmen > 5clr = hsv(nSalesmen);%根据机器人的数量来确定画图需要多少种颜色
end
%运行遗传算法
globalMin = Inf;
totalDist = zeros(1,popSize);%每个个体的路径长度
distHistory = zeros(1,numIter);%每一代的最优距离
tmpPopRoute = zeros(8,n);
tmpPopBreak = zeros(8,nBreaks);
newPopRoute = zeros(popSize,n);
newPopBreak = zeros(popSize,nBreaks);
if showProgpfig = figure('Name','MTSP_GA | Current Best Solution','Numbertitle','off');
end
for iter = 1:numIter%% 计算每一个个体的总旅行距离for p = 1:popSize  d = 0;pRoute = popRoute(p,:);pBreak = popBreak(p,:);rng = [[1 pBreak+1];[pBreak n]]';%代表了每一个旅行商的起点和终点for s =1:nSalesmen %计算这一种群的总距离d = d + dmat(pRoute(rng(s,2)),pRoute(rng(s,1)));for k = rng(s,1):rng(s,2)-1 %计算旅行商中间的距离d = d + dmat(pRoute(k),pRoute(k+1));endendtotalDist(p) = d;%每一个个体的路径总长度end%% 找最优路径,若是当前最优则画出[minDist,index] = min(totalDist);%距离、个体序号distHistory(iter) = minDist;%记录这一代最佳路径距离if minDist < globalMinglobalMin = minDist;optRoute = popRoute(index,:);optBreak = popBreak(index,:);rng = [[1 optBreak+1];[optBreak n]]';%记录最佳路径分隔点if showProgfigure(pfig);for s =1:nSalesmen %画出最优路线rte = optRoute([rng(s,1):rng(s,2) rng(s,1)]);%需要回到起点if dims > 2,plot3(xy(rte,1),xy(rte,2),xy(rte,3),'.-','Color',clr(s,:),'LineWidth',2);else plot(xy(rte,1),xy(rte,2),'.-','Color',clr(s,:),'LineWidth',2);endtitle(sprintf('总旅行距离 = %1.4f, 迭代次数 = %d',minDist,iter));hold onendhold offendend%% 采用锦标赛的方法进行选择,随机选择8个个体选择出最优个体作为父代randomOrdor = randperm(popSize);%for p = 8:8:popSizertes = popRoute(randomOrdor(p-7:p),:);brks = popBreak(randomOrdor(p-7:p),:);dists = totalDist(randomOrdor(p-7:p));[~,idx] = min(dists);%找出距离最小的个体序号bestof8Route = rtes(idx,:);bestof8Break = brks(idx,:);routeInsertionPoints = sort(ceil(n*rand(1,2)));%随机生成2个升序排列的插入点位置序号I = routeInsertionPoints(1);J = routeInsertionPoints(2);for k =1:8tmpPopRoute(k,:) = bestof8Route;tmpPopBreak(k,:) = bestof8Break;switch kcase 2 %让在插入点之间的城市进行翻转tmpPopRoute(k,I:J) = tmpPopRoute(k,J:-1:I);case 3 %变异,让两个随机点选中的城市进行交换tmpPopRoute(k,[I J]) = tmpPopRoute(k,[J I]);case 4% 随机点选中的城市片段进行迁移tmpPopRoute(k,I:J) =tmpPopRoute(k,[I+1:J I]);case 5tmpPopBreak(k,:) = rand_breaks();%随机生成分隔点case 6tmpPopRoute(k,I:J)= tmpPopRoute(k,J:-1:I);tmpPopBreak(k,:) = rand_breaks();case 7tmpPopRoute(k,[I J]) =tmpPopRoute(k,[I J]);tmpPopBreak(k,:) = rand_breaks();case 8tmpPopRoute(k,I:J) =tmpPopRoute(k,[I+1:J I]);tmpPopBreak(k,:) = rand_breaks();otherwiseendendnewPopRoute(p-7:p,:) = tmpPopRoute;newPopBreak(p-7:p,:) = tmpPopBreak;endpopRoute = newPopRoute;popBreak = newPopBreak;
end
if showResultfigure('Name','MTSP_GA | Result','Numbertitle','off');subplot(2,2,1);if dims>2,plot3(xy(:,1),xy(:,2),xy(:,3),'.','Color',pclr);else plot(xy(:,1),xy(:,2),'.','Color',pclr);endtitle('城市位置');subplot(2,2,2);imagesc(dmat(optRoute,optRoute));title('距离矩阵');subplot(2,2,3);rng = [[1 optBreak+1];[optBreak n]]';for s = 1:nSalesmenrte = optRoute([rng(s,1):rng(s,2) rng(s,1)]);if dims>2, plot3(xy(rte,1),xy(rte,2),xy(rte,3),'.-','Color',clr(s,:));else plot(xy(rte,1),xy(rte,2),'.-','Color',clr(s,:));endtitle(sprintf('旅行总距离 = %1.4f',minDist));hold on;endsubplot(2,2,4);plot(distHistory,'b','LineWidth',2);title('Best Solution History');set(gca,'XLim',[0 numIter+1],'YLim',[0 1.1*max([1 distHistory])]);
end
if nargoutvarargout{1} = optRoute;varargout{2} = optBreak;varargout{3} = minDist;
end%% 若旅行者有旅行距离的要求的话,则在染色体前面位置选择分隔点的概率会偏低一点%没有要求的话则可以随机生成分隔点
function breaks = rand_breaks()
if minTour ==1 tmpBreaks = randperm(n-1);%随机生成1~49的数组breaks = sort(tmpBreaks(1:nBreaks));%在tmpbreaks1~7的位置产生分隔标记
elsenAdjust = find(rand < cumProb,1) -1;%返回cumProb中小于rand的索引cumProb在迭代中不会更新了spaces = ceil(nBreaks*rand(1,nAdjust));%范围1~7adjust = zeros(1,nBreaks);for kk = 1:nBreaksadjust(kk) = sum(spaces == kk);%spaces中与kk相等的相加endbreaks = minTour*(1:nBreaks) + cumsum(adjust);
end
endend

直接上结果!

若有小伙伴对机器人任务分配算法较为兴趣的,可以在下面评论交流一波,纯属互相学习!

遗传算法(GA)解决MTSP问题及Matlab代码相关推荐

  1. 基于遗传算法解决TSP问题(Matlab代码实现)

    目录 1 概述 2 运行结果 3 Matlab代码实现 4 结语 5 参考文献 1 概述 旅行商问题是一个经典的路径规划问题,传统TSP假设客户位置和客户之间旅行时间是固定不变的,而在现实生活中交通状 ...

  2. 【智能优化算法】基于遗传算法实现城市交通信号优化附matlab代码

    1 简介 本文设计实时优化的配置方案对道路畅通的应急决策管理具有重要意义.本文在分析交通控制基本理论的基础上,根据交叉口的实际情况并考虑信号灯的转换与车辆的启动损失时间,采用四相位对称式放行方案,以车 ...

  3. 【优化调度】基于改进遗传算法求解农业水资源调度问题(Matlab代码实现)

    目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 科学的渠系配水决策可以减少渠系输水过程中的渗水损失和无效弃水,提高灌溉水利用率.国内外学者对渠系优化配水决策方法进行了许 ...

  4. 【多式联运】基于粒子群结合遗传算法实现陆海空多式联运问题附matlab代码

    1 简介 物流运输方式由公路.水路.空运及管道等 3 种方式组成,3 种运输方式在技术上.经济上各有长短,都有适宜的 使用范围,每种运输方式单独运用很难实现节约资源.降本增效.随着我国经济不断发展以及 ...

  5. 【优化求解】基于遗传算法求解列车交路方案matlab代码

    1 简介 列车开行方案是城轨系统正常运行的基础,可有效保障路网整体运输效率及城轨系统的服务水平.随着城市轨道交通的快速发展,客流分布呈现出多样性.复杂性和时变性等特征,客流需求与运输能力的矛盾亦愈加显 ...

  6. 【优化布局】基于遗传算法求解物流多配送中心选址matlab代码

    1 简介 在考虑物流规划部门和客户双方利益的基础上,采用双层规划模型描述物流配送中心的选址问题.基于进化博弈与多目标优化的思想设计了层次遗传算法来求解该模型,通过两个遗传算法的交互迭代求解物流配送中心 ...

  7. 遗传算法求函数极值(含MATLAB代码实现)

    介绍转载自https://blog.csdn.net/xujinpeng99/article/details/6211597,后面用自己设置的函数进行实验. 引言:遗传算法求函数极值算是遗传算法的一种 ...

  8. 【装箱问题】基于Shuffled Complex Evolution (SCE) 算法解决装箱问题 (BPP)附matlab代码

    1 内容介绍 SCE(shuffled complex evolution )是一种相对较新的连续性问题的元启发搜索算法.非常适合于求解具有多个局部最小的全局优化问题.SCE算法的主要特征是通过竞争进 ...

  9. 基于蚁群结合遗传算法的路径规划问题附Matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  10. 【优化选址】基于遗传算法求解物流选址问题附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

最新文章

  1. java项目新东方在线源码_基于JSP的在线考试系统-JavaWeb项目-有源码
  2. Win2008 R2 WEB 服务器设置之禁用不必要的服务和关闭端口
  3. c# pictureBox1.Image的获得图片路径的三种方法 winform
  4. 昨天,腾讯百万节点规模管控系统(TSC)诞生了!
  5. Eclipse如何提高开发效率
  6. Java语言程序设计(基础篇) 第二章
  7. 建立你第一个 Outlook Add-in
  8. Bootstrap 不可编辑的控件
  9. java mvc web_JavaWeb MVC
  10. 串行 RapidIO
  11. html5 figure 标签
  12. classes是什么意思怎么读_classes怎么读用法大全_classes是什么意思
  13. 行翻转和列翻转_用量子计算机翻转硬币
  14. 李宏毅20212022机器学习
  15. SCDM学习笔记(5)
  16. python字符串相减
  17. pyspider 文档介绍
  18. 12306APP找回密码操作后账户被注销BUG
  19. 验证手机号码格式的正则表达式编写思路详解
  20. 智能PID软件-AVEVA Diagrams报表功能介绍【图瓦软件出品】

热门文章

  1. HTML5期末大作业:餐饮文化网站设计——餐饮文化(8页) HTML+CSS+JavaScript 学生DW网页设计美食文化
  2. 2010新财富中国富豪榜1至100名
  3. 【评测】牛血清白蛋白(BSA)篇
  4. java的regex_Java的Regex --正则表达式
  5. CVPR2021 最具创造力的那些工作成果!或许这就是计算机视觉的魅力!
  6. 高中补习数学:导数与函数的综合问题(2019年测试题)
  7. 因为制作爬虫程序,我收到了警告
  8. linux趋势杀毒安装目录,趋势杀毒软件在AX3.0上的安装
  9. IObit Uninstaller(卸载工具) v10.0.2.20
  10. linux源文件安装,Linux下的源文件安装