Matlab蚁群算法解决TSP问题代码超详细注释
2017-07-31 22:48
381 查看
直接把建模作业贴上来了,代码是参考一个学长写的,图解的话百度文库里有好多不错的资料,配合这个代码应该可以很好的理解
毕竟我也是小白 如果有错误欢迎指正:
毕竟我也是小白 如果有错误欢迎指正:
clc;clear all; t1=clock;%用于记录运行时间 X=[114 50 99 30 60 26 29 7 53 40 102 3 32 12 100 38 5 2 91 5 46 105 95 94 34 116 92 38 33 20 4 89 58 73 86]; Y=[228 70 146 171 150 262 220 29 246 275 175 48 52 227 99 254 186 161 49 68 245 90 64 94 190 53 235 136 43 185 131 163 229 104 9]; city=[X',Y'];%坐标是随机生成的 numberofcities = length(city);% number of cities % distance matrix: dis(i,j) is the distance between city i and j. dis=zeros(numberofcities); for n=1:numberofcities%dis表示根据测试数据中的城市坐标生成的邻接矩阵(就是每个点自己的距离的矩阵) for m=1:numberofcities dis(n,m)=[(city(n,1)-city(m,1))^2+(city(n,2)-city(m,2))^2]^1/2; end end alpha =1;%启发因子,信息素的重要程度 beta = 3;%期望因子,城市间距离的重要程度 rou = 0.7;%信息素残留参数 Q = 2000 %%信息素增强系数 m = 40; %m 蚂蚁数量 Eta = 1./dis;%表示每条边的能见度 Tau = ones(numberofcities,numberofcities);%为信息素矩阵,可以理解为在蚂蚁还没有被放入城市前,每条道路上就已经存在了一定含量的信息素(只是为了方便计算) Tauroute = zeros(m,numberofcities);%存储并记录每次迭代时每只蚂蚁经历的路径生成; NC_max = 50; %迭代计数器,记录迭代次数 R_best=zeros(NC_max,numberofcities); %各代最佳路线 L_best=inf.*ones(NC_max,1);%各代最佳路线的长度 NC = 1; while NC <=NC_max%表示循环终止条件,迭代终止器 %第二步:将m只蚂蚁放到n个城市上 Randpos = [];%随即存取 for i = 1:(ceil(m/numberofcities))%将m只蚂蚁随机放到n个城市上 Randpos = [Randpos,randperm(numberofcities)]; end Tauroute(:,1) = (Randpos(1,1:m))';%初始化每只蚂蚁的路径 1列为每只蚂蚁的起始点 %第三步:所有蚂蚁按概率函数选择下一座城市,完成各自的周游 for j = 2:numberofcities for i = 1:m visited = Tauroute(i,1:(j-1));%已经找过的城市 prob = zeros(1,(numberofcities-j+1));%待访问城市的选择概率分布, citys=1:numberofcities; visting=citys(ismember(citys,visited)==0);%待访问的城市 %visting=setdiff([1:numberofcities],visited); %下面计算待选城市的概率分布 for k = 1:length(visting)%对每只蚂蚁还没有访问的城市依次计算概率 %Eta表示每条边的能见度 %Tau为信息素矩阵,每条边已经存在的信息素 prob(k) = (Tau(visited(end),visting(k))^alpha)*(Eta(visited(end),visting(k))^beta); end prob = prob/(sum(prob));%转换为概率 pcum = cumsum(prob);%生成轮盘 Select = find(pcum>=rand);%按概率随机选取下一个要选的城市 tovisit = visting(Select(1));%从已经选择的城市们中再选一个城市 Tauroute(i,j) = tovisit;%在路径中记录选择的城市 end end if NC > 2 Tauroute(1,:) = R_best(NC-1,:);%如果迭代次数大于2,则将上一代最好路径覆盖第一只蚂蚁的路径 end %第四步:记录本次迭代最佳路线 L = zeros(m,1);%开始距离为0,m*1的列向量 for i = 1:m%计算每一种蚂蚁的路径 R = Tauroute(i,:); d = dis(R(end),R(1)); % closed path for k = 1:length(R)-1%计算路径 d = d + dis(R(k),R(k+1)); end L(i)= 4000 d; end L_best(NC) = min(L);%记录本次迭代最短的路径的长度(L_best是一个列向量) pos = find(L==L_best(NC));%找到该列向量对应的下标 R_best(NC,:) = Tauroute(pos(1),:);%通过最短路径的下标找到它的路径并记录 Rbest = Tauroute(pos(1),:);%嗯。。。这个定义纯粹就是为了画图 %plotroute(city, Rbest, L_best(NC), NC);%画出这一代的最短路径 x=city(Rbest,1); y=city(Rbest,2); plot(X,Y,'.k','LineWidth',5);%标明城市 hold on plot(X(1),Y(1),'p','markersize',5, ... 'MarkerEdgeColor','r','MarkerFaceColor','g');%标明起始点 plot([x;x(1)],[y;y(1)],'b');%补上缺口 L_best(NC) xlabel(sprintf('generation = %5i Total Distance = %6.1f',NC,L_best(NC)));%代数和每代最短距离 hold off drawnow; NC = NC + 1;%代数自增长 %第五步:更新信息素 Delta_Tau = zeros(numberofcities,numberofcities);%默认信息素矩阵为全零 for i = 1:m%对每只蚂蚁的路径更新信息素 for j = 1:(numberofcities-1) Delta_Tau(Tauroute(i,j),Tauroute(i,j+1)) = Delta_Tau(Tauroute(i,j),Tauroute(i,j+1))+Q/L(i); end %最后一个城市回到起始城市 Delta_Tau(Tauroute(i,numberofcities),Tauroute(i,1))=Delta_Tau(Tauroute(i,numberofcities),Tauroute(i,1))+Q/L(i); end Tau = (1-rou).*Tau + Delta_Tau;%蒸发量加上新加的信息素 Tauroute = zeros(m,numberofcities);%Tauroute清零用于下一轮路径的记录 end t2=clock; etime(t2,t1)%返回运行时间
相关文章推荐
- 解决eclipse中java代码注释变成乱码的问题
- 解决vs2010中写vb代码时按'''不自动加入函数注释的问题
- HDU2665 主席树原理解决静态区间第K大值问题总结 有详细图解和代码解释
- Android项目 手机安全卫士(代码最全,注释最详细)之十 应用程序更新的签名问题
- 解决多线程代码中的11个常见问题[详细/经典]
- [Ubuntu--VIM]vim打开代码文档中文注释显示为乱码的问题解决
- 【python3问题解决】python3代码添加中文注释报错
- 蚁群算法解决TSP问题的JAVA实现(二)
- 带精英策略的蚂蚁系统解决TSP问题matlab实现
- 蚁群算法解决TSP问题的JAVA实现(一)
- 解决eclipse中java代码注释变成乱码的问题
- 蚁群算法解决TSP问题
- 蚁群算法解决TSP问题 再续
- 用C#实现蚁群算法解决TSP问题
- 在Linux中#!/usr/bin/python之后把后面的代码当成程序来执行。 但是在windows中用IDLE编程的话#后面的都是注释,之后的代码都被当成文本了。 该怎么样才能解决这个问题呢?
- 快速解决eclipse中注释的代码依然会执行的问题
- 解决 Visual Studio 中代码注释自动折叠的问题
- 解决eclipse中java代码注释变成乱码的问题
- 关于目标跟踪matlab代码调试时一个问题的解决办法
- 解决VS2008中日文代码注释乱码的问题