用于问题:每个旅行商的起始位置随意,且每次都要回到对应的起始点

基本算法思路:

每个遗传个体维护两个基因片段,一个是路径片段,一个时中断点片段

什么是路径和中断点呢?
%     假设有 10 个城市 3 个哥们
%     假设得到路径 rte = [5 6 9 1 4 2 8 10 3 7], 中断点 = [3 7]
%     于是可以得到每个哥们的路径 [5 6 9][1 4 2 8][10 3 7],
%     which designates the routes for the 3 salesmen as follows:
%         . Salesman 1 travels from city 5 to 6 to 9 and back to 5
%         . Salesman 2 travels from city 1 to 4 to 2 to 8 and back to 1
%         . Salesman 3 travels from city 10 to 3 to 7 and back to 10

于是,每个旅行商的路径就可以用这两段基因来表示了!

基本算法:

1、设置5000个迭代次数,每一次迭代产生一个最佳个体,若这厮的路径距离小于历史的全局最小值,就作为全局最小值。

2、从本次迭代中的个体,随机分成n组,从每一组中的最佳个体里修改基因片段(有的改路径基因型,有的改中断点基因型),从而得到子代。

3、子代再一次产生最小路径值,若再次小于历史的最小值,则设置他为全局最小值。再次以2的方法产生子代

4、直到5000次迭代结束为止。

下面是一段代码,别人写的,我写了注释:

%基因型设置:
%每个遗传个体维护两个基因片段,一个是路径片段,一个时中断点片段
% Summary:
%     1. 每个salesmen的起点随意,并返回其所在起点
%     2. 每一个城市只能有同一个家伙遍历
%
% Input:
%     XY %城市坐标 N by 2 矩阵(用于画图)
%     DMAT %距离矩阵 N by N
%     NSALESMEN 有多少个salesmen
%     MINTOUR 每一个salesmen必须 travel 大于等 MINTOUR 个城市
%     POPSIZE 每一次迭代的种群个数,必须为8的倍数,因为新生代的产生是由 8 个
%             老家伙产生 8 个新家伙
%     NUMITER 迭代次数,这个代码是将这些次数都迭代完的。
%     SHOWPROG 画图,如果等于1,就将每一次迭代路径画出来
%     SHOWRESULT 画图,如果等于1,将最后的结果,城市坐标,路径和历史总长度
%
% Output:
%     OPTROUTE (integer array) 输出最佳路径
%     OPTBREAK (integer array) 输出中断点
%     MINDIST (scalar float) 总距离
%
%
% Author: Joseph Kirk
% Email: jdkirk630@gmail.com
% Release: 1.5
% Release Date: 11/07/11
% Translator: ze bin zhuofunction varargout = mtsp_ga(xy,dmat,nSalesmen,minTour,popSize,numIter,showProg,showResult)
nargs = 8;
% 下面是默认值处理,也就是说,如果函数中缺乏输入参数,那么下面的代码就自作主张帮你添了。
for k = nargin:nargs-1switch kcase 0xy = 10*rand(40,2);case 1N = size(xy,1);a = meshgrid(1:N);dmat = reshape(sqrt(sum((xy(a,:)-xy(a',:)).^2,2)),N,N);case 2nSalesmen = 5;case 3minTour = 3;case 4popSize = 80;case 5numIter = 5e3;case 6showProg = 1;case 7showResult = 1;otherwiseend
end% Verify Inputs  验证输入是否可行,验证原理为城市个数 N 是否和 距离矩阵的 size相等
[N,dims] = size(xy);
[nr,nc] = size(dmat);
if N ~= nr || N ~= ncerror('Invalid XY or DMAT inputs!')
end
n = N;% Sanity Checks    验证输入:可以不看
nSalesmen = max(1,min(n,round(real(nSalesmen(1)))));
%验证输入的哥们个数是不是大于1,并且是整数,否则帮你四舍五入改了
minTour = max(1,min(floor(n/nSalesmen),round(real(minTour(1)))));
%验证输入的minTour是不是大于1,并且是整数,否则帮你四舍五入改了
popSize = max(8,8*ceil(popSize(1)/8));
%验证输入的个体数是否为8的整数,否则帮你用ceil函数改了
numIter = max(1,round(real(numIter(1))));
%验证输入的迭代次数是否大于1,否则帮改了
showProg = logical(showProg(1));
%验证是否为1或0,下同
showResult = logical(showResult(1));% Initializations for Route Break Point Selection
nBreaks = nSalesmen-1;    %设置中断点个数。
dof = n - minTour*nSalesmen;          % degrees of freedom
addto = ones(1,dof+1);
for k = 2:nBreaksaddto = cumsum(addto);
end
cumProb = cumsum(addto)/sum(addto);% Initialize the Populations
popRoute = zeros(popSize,n);         % population of routes
popBreak = zeros(popSize,nBreaks);   % population of breaks
popRoute(1,:) = (1:n);
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% 开始GA算法啦
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% Evaluate Members of the Populationfor p = 1:popSize  %遍历所有的个体d = 0;pRoute = popRoute(p,:);  %将相应的个体的路径基因型取出pBreak = popBreak(p,:);%将相应的个体的中断点基因型取出rng = [[1 pBreak+1];[pBreak n]]';%计算每个哥们的距离之用%下面的迭代用于计算每个个体的对应的所有哥们的总距离for s = 1:nSalesmend = d + dmat(pRoute(rng(s,2)),pRoute(rng(s,1)));for k = rng(s,1):rng(s,2)-1d = d + dmat(pRoute(k),pRoute(k+1));endend%把每个个体对应的所有哥们的总距离放在向量totalDist中totalDist(p) = d;end% 找出总距离最短的那个个体用于产生新个体[minDist,index] = min(totalDist);%记录每一步迭代的最短距离到一个向量中distHistory(iter) = minDist;%从历史距离中找出最小的那个作为globalMinif minDist < globalMin%若本次迭代时的最佳距离小于历史globalMin%就把他画在图上,并记录一共画了几次。globalMin = minDist;optRoute = popRoute(index,:);optBreak = popBreak(index,:);rng = [[1 optBreak+1];[optBreak n]]';%画图代码if showProgfigure(pfig);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('Total Distance = %1.4f, Iteration = %d',minDist,iter));hold onendhold offendend% 子代个体的产生过程% 产生一个随机序列,用于挑选随机的8个父代产生子代% 8个家伙来交配产生子代,(其实也不算交配啦!)randomOrder = randperm(popSize);for p = 8:8:popSizertes = popRoute(randomOrder(p-7:p),:);brks = popBreak(randomOrder(p-7:p),:);%随机挑选的8个父代dists = totalDist(randomOrder(p-7:p));[ignore,idx] = min(dists); %从这8个父代中挑选出最佳父代,用于产生8个子代。bestOf8Route = rtes(idx,:);bestOf8Break = brks(idx,:);routeInsertionPoints = sort(ceil(n*rand(1,2)));%从中挑选出基因序列的2个位置%这两个位置用来从父代中产生新的基因新的I = routeInsertionPoints(1);J = routeInsertionPoints(2);for k = 1:8 % Generate New SolutionstmpPopRoute(k,:) = bestOf8Route;tmpPopBreak(k,:) = bestOf8Break;switch kcase 2 % Flip%将最佳父代的基因型从上面两个位置中间的片段反转,产生一个子代。tmpPopRoute(k,I:J) = tmpPopRoute(k,J:-1:I);case 3 % Swap%交换这两个片段的基因,产生新子代。tmpPopRoute(k,[I J]) = tmpPopRoute(k,[J I]);case 4 % Slide% 自己看吧,描述不出tmpPopRoute(k,I:J) = tmpPopRoute(k,[I+1:J I]);%上面都是调整路径基因型的%下面用于调整中断点基因型,过程差不多,大家可以自己看的case 5 % Modify Breaks%随机产生,跟最佳父代没关系的一代。tmpPopBreak(k,:) = rand_breaks();case 6 % Flip, Modify BreakstmpPopRoute(k,I:J) = tmpPopRoute(k,J:-1:I);tmpPopBreak(k,:) = rand_breaks();case 7 % Swap, Modify BreakstmpPopRoute(k,[I J]) = tmpPopRoute(k,[J I]);tmpPopBreak(k,:) = rand_breaks();case 8 % Slide, Modify BreakstmpPopRoute(k,I:J) = tmpPopRoute(k,[I+1:J I]);tmpPopBreak(k,:) = rand_breaks();otherwise % Do NothingendendnewPopRoute(p-7:p,:) = tmpPopRoute;newPopBreak(p-7:p,:) = tmpPopBreak;endpopRoute = newPopRoute;popBreak = newPopBreak;
endif showResult
% Plotsfigure('Name','MTSP_GA | Results','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('City Locations');subplot(2,2,2);imagesc(dmat(optRoute,optRoute));title('Distance Matrix');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('Total Distance = %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% Return Outputs
if nargoutvarargout{1} = optRoute;varargout{2} = optBreak;varargout{3} = minDist;
end% 改函数用于随机的产生中断点。function breaks = rand_breaks()if minTour == 1 % No Constraints on BreakstmpBreaks = randperm(n-1);breaks = sort(tmpBreaks(1:nBreaks));else % Force Breaks to be at Least the Minimum Tour LengthnAdjust = find(rand < cumProb,1)-1;spaces = ceil(nBreaks*rand(1,nAdjust));adjust = zeros(1,nBreaks);for kk = 1:nBreaksadjust(kk) = sum(spaces == kk);endbreaks = minTour*(1:nBreaks) + cumsum(adjust);endend
end

demo在这里呢

     n = 35;xy = 10*rand(n,2);nSalesmen = 5;     minTour = 3;popSize = 80;numIter = 5e3;    a = meshgrid(1:n);dmat = reshape(sqrt(sum((xy(a,:)-xy(a',:)).^2,2)),n,n); [optRoute,optBreak,minDist] = mtsp_ga(xy,dmat,nSalesmen,minTour,popSize,numIter,1,1);

代码中的产生新个体的算法解释

在实现遗传算法的时候,这个代码并没有用到两个个体的交叉互换,而是用了一个个体通过变异产生新个体。下面是变异函数的几点解释:

希望能够对读者的理解略尽绵薄之力

运行结果这里呢

MTSP遗传算法解决相关推荐

  1. 遗传算法解决tsp问题(基于python)

    目录 1.遗传算法简要介绍 2.tsp问题简要介绍 3.遗传算法解决tsp问题的几个特殊点 4.源码 1.遗传算法简要介绍 简单来说,遗传算法是用于解决最优化问题的一种搜索算法.其核心基于自然界种群进 ...

  2. 遗传算法解决排序问题

    遗传算法解决排序问题 参考文章: (1)遗传算法解决排序问题 (2)https://www.cnblogs.com/oldBook/p/9866734.html 备忘一下.

  3. 遗传算法解决旅行商问题(TSP)

    遗传算法解决旅行商问题(TSP) 参考文章: (1)遗传算法解决旅行商问题(TSP) (2)https://www.cnblogs.com/studylyn/p/5097238.html 备忘一下.

  4. MATLAB实战系列(十九)-遗传算法解决TSP(旅行商)问题-应用及解析(文末附MATLAB源码)

    接上篇MATLAB实战系列(十八)-遗传算法解决TSP(旅行商)问题-算法原理 https://wenyusuran.blog.csdn.net/article/details/114060030 感 ...

  5. matlab 遗传优化算法_转载 | 遗传算法解决TSP问题的MATLAB实现

    问题定义: 巡回旅行商问题 给定一组n个城市和俩俩之间的直达距离,寻找一条闭合的旅程,使得每个城市刚好经过一次且总的旅行距离最短. TSP问题也称为货郎担问题,是一个古老的问题.最早可以追溯到1759 ...

  6. 使用遗传算法解决图着色问题

    使用遗传算法解决图着色问题 图着色 问题描述 应用 解的表示形式 图着色问题中的约束条件 利用python实现问题创建 遗传算法解决图着色问题 常量及遗传算子定义 使用精英主义策略 遗传流程 结果 使 ...

  7. 使用遗传算法解决N皇后问题

    使用遗传算法解决N皇后问题 N皇后问题 解的表示 问题的表示 遗传算法解决N皇后问题 常量及遗传算子定义 使用精英主义策略 遗传流程 结果 N皇后问题 经典的N皇后问题最初被称为八皇后拼图,起源于国际 ...

  8. tsp问题——遗传算法解决

    TSP问题最简单的求解方法是枚举法. 它的解是多维的.多局部极值的.趋于无穷大的复杂解的空间.搜索空间是n个点的全部排列的集合.大小为(n-1)! .能够形象地把解空间看成是一个无穷大的丘陵地带,各山 ...

  9. 基于遗传算法解决城市TSP问题

    基于遗传算法解决城市TSP问题 算法原理: TSP是一个组合优化方面的问题,已经成为测试组合优化新算法的标准问题.应用遗传算法解决 TSP 问题,首先对访问城市序列进行排列组合的方法编码,这保证了每个 ...

  10. 写一个用遗传算法解决VRP问题的代码

    下面是一个使用 Python 实现的遗传算法解决 VRP 问题的代码示例: ``` import random import numpy as np class VRP: def init(self, ...

最新文章

  1. springboot-26-springboot 集成rabbitmq
  2. python random库生成伯努利随机数的方法_Python使用random模块生成随机数操作实例详解...
  3. SQL-Hive中的Select From解析
  4. CSCNN:新一代京东电商广告排序模型
  5. 密码生成常见的编码规则
  6. 计算机应用基础第九章在线测试答案,郑大计算机应用基础第9章节在线测试答案...
  7. Echarts多个坐标轴多组/一组数据 - 温度降水量示例
  8. Chrome 开发者工具 live expression 的用法
  9. SAP Customer Data Cloud(Gigya)登录的重定向问题
  10. 两个摄像头合成一路_三星推出全新摄像头光电传感器ISOCELL GN1,性能直奔HM1
  11. jquery多维对象计算个数_山东省2005年专升本计算机考试真题2??
  12. android 里程计算器,里程计算器
  13. get请求和post请求的区别
  14. Docker从基础到企业生产应用学习笔记大总结
  15. Oracle分区详细解析
  16. 音响系统相关技术术语解释大全
  17. 213. 字符串压缩--LintCode领扣编程题
  18. 有关于脉动调查的这些问题你都知道吗
  19. chrome开发人员工具中出现绿色的矩形框解决
  20. SonicWALL常见监控说明及日志查看

热门文章

  1. 偏差方差分解中为什么第三行第六行为零
  2. 【软件技巧】【截图】浏览器自带的全网页截图工具
  3. CAD突然没有对话框了?只能命令行输入内容??(FILEDIA=0?CMDECHO=0?)
  4. Could not start AVD
  5. 【张朝阳的物理课笔记】 1. 力,牛顿定律,飞船角速度
  6. mysql frm、MYD、MYI数据文件恢复,导入MySQL中
  7. 搜狗新闻语料库,构建Word2Vec中文词向量
  8. 【多轮对话】多轮对话状态追踪技术综述
  9. python系列之supervisor进程管理
  10. 要学习使用 calib3D 模块在图像中创建 3D 效果-姿势估计