带精英策略的蚂蚁系统解决TSP问题matlab实现
2015-04-23 14:04
435 查看
代精英策略的蚂蚁系统解决旅行商问题,欢迎大家批评指正。
<pre name="code" class="plain">function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ELITIST(NC_max,m,Alpha,Beta,Rho,Q) %%========================================================================= % 带精英策略的蚂蚁系统 ACATSP-ELITIST.m % Ant Colony Algorithm for Traveling Salesman Problem % % %%------------------------------------------------------------------------- %% 主要符号说明 %% C n个城市的坐标,n×2的矩阵 %% NC_max 最大迭代次数 100 %% m 蚂蚁个数 50 %% Alpha 表征信息素重要程度的参数2 %% Beta 表征启发式因子重要程度的参数4 %% Rho 信息素蒸发系数0.1 %% Q 信息素增加强度系数 0.01 %% R_best 各代最佳路线 %% L_best 各代最佳路线的长度 %%========================================================================= %%第一步:变量初始化 C=[5.294,1.558;4.286,3.622;4.719,2.774;4.185,2.230;0.915,3.821;4.771,6.041;1.524,2.871;3.447,2.111;3.718,3.665;2.649,2.556]; n=size(C,1); %*表示问题的规模(城市个数n)得到矩阵的行数n为10 D=zeros(n,n); %D表示完全图的赋权邻接矩阵 产生10*10矩阵,值全是0 for i=1:n for j=1:n if i~=j D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5; else D(i,j)=eps; end D(j,i)=D(i,j); end end Eta=1./D; %Eta为启发因子, 这里设为距离的倒数 Tau=ones(n,n); %Tau为信息素矩阵 Tau--->产生10*10行矩阵,值全都是1 Tabu=zeros(m,n); %存储并记录路径的生成 Tabu--->50*10矩阵 NC=1; %迭代计数器 R_best=zeros(NC_max,n); %各代最佳路线 100*10 L_best=inf.*ones(NC_max,1); %各代最佳路线的长度100*1 L_ave=zeros(NC_max,1); %各代路线的平均长度100*1 while NC<=NC_max %停止条件之一:达到最大迭代次数 %%第二步:将m(50)只蚂蚁放到n(10)个城市上 Randpos=[]; for i=1:(ceil(m/n)) %%m为50,n为10 Randpos=[Randpos,randperm(n)]; end Tabu(:,1)=(Randpos(1,:)); %初始化禁忌表中第一个元素 矩阵的第一行赋值给另外一个矩阵的第一列 %%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游。填充Tabu矩阵 for j=2:n for i=1:m visited=Tabu(i,1:(j-1)); %已访问的城市---城市序号 visited也是矩阵 J=zeros(1,(n-j+1)); %待访问的城市 J、P都是一行值为0的矩阵 P=J; %待访问城市的选择概率分布 Jc=1; for k=1:n if length(find(visited==k))==0 J(Jc)=k; Jc=Jc+1; end end %下面计算待选城市的概率分布 for k=1:length(J) P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta); end P=P/(sum(P)); %按概率原则选取下一个城市 Pcum=cumsum(P); %disp(Pcum) %disp('**************') Select=find(Pcum>=rand); to_visit=J(Select(1)); Tabu(i,j)=to_visit; end end if NC>=2 Tabu(1,:)=R_best(NC-1,:);%上一代最短路径作为本代第一条路径 end %%第四步:记录本次迭代最佳路线。填充矩阵L L=zeros(m,1); for i=1:m R=Tabu(i,:); for j=1:(n-1) L(i)=L(i)+D(R(j),R(j+1)); end L(i)=L(i)+D(R(1),R(n)); end L_best(NC)=min(L); pos=find(L==L_best(NC)); R_best(NC,:)=Tabu(pos(1),:); L_ave(NC)=mean(L); %%第五步:更新信息素 Delta_Tau=zeros(n,n); clever_Tau=zeros(n,n); numLine=find(L==min(L)); numClever=length(numLine); for i=1:m %表示行 for j=1:(n-1) Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);%一只蚂蚁的路线留下的信息素 end Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i); if i==numLine(1) clever_Tau(Tabu(i,j),Tabu(i,j+1))=clever_Tau(Tabu(i,j),Tabu(i,j+1))+numClever*(Q/min(L)); end clever_Tau(Tabu(i,n),Tabu(i,1))=clever_Tau(Tabu(i,n),Tabu(i,1))+numClever*(Q/min(L)); end Tau=(1-Rho).*Tau+Delta_Tau+clever_Tau;%Tau一代一代叠加。原有的有一部分蒸发+新增加的一代产生的信息素+如果是最短路径再加上这一代产生的信息素 %%第六步:禁忌表清零 Tabu=zeros(m,n); NC=NC+1 end %%第七步:输出结果 Pos=find(L_best==min(L_best)); Shortest_Route=R_best(Pos(1),:); Shortest_Length=L_best(Pos(1)); subplot(1,2,1) DrawRoute(C,Shortest_Route) subplot(1,2,2) plot(L_best,'y') hold on plot(L_ave,'r') title('平均距离和最短距离'); disp('最短距离为:') disp(Shortest_Length); disp('最短路径是:') disp(Shortest_Route) function DrawRoute(C,R) %%==================================================================== %% DrawRoute.m %% 画路线图的子函数 %%-------------------------------------------------------------------- %% C Coordinate 节点坐标,由一个N×2的矩阵存储 %% R Route 路线 %%==================================================================== N=length(R); scatter(C(:,1),C(:,2)); hold on plot([C(R(1),1),C(R(N),1)],[C(R(1),2),C(R(N),2)],'g') hold on for ii=2:N plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)],'g') hold on end title('旅行商问题优化结果');
相关文章推荐
- 在matlab上实现遗传算法解决TSP旅行者问题
- 模拟退火算法解决01背包问题(matlab实现)
- matlab 实现 stacked Autoencoder 解决图像分类问题
- 推荐系统解决冷启动问题策略
- 一种高效率的排序方法-归并排序的实现(主要解决matlab中多维数组排序的问题)
- 模拟鼠标移动程序实现——解决域控制器策略强制电脑锁屏问题
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十二):解决跨域问题
- 流式计算strom,Strom解决的问题,实现实时计算系统要解决那些问题,离线计算是什么,流式计算什么,离线和实时计算区别,strom应用场景,Strorm架构图和编程模型(来自学习资料)
- Matlab蚁群算法解决TSP问题代码超详细注释
- 遗传算法解决TSP问题(c++实现)
- 模拟鼠标移动程序实现——解决域控制器策略强制电脑锁屏问题
- 【原创】【问题记录】系统管理员设置了系统策略,禁止此安装的最终解决办法
- 推荐系统解决冷启动问题策略
- nginx实现网关解决跨域问题(大型网关接口系统)
- 基于xposed实现android注册系统服务,解决跨进程共享数据问题
- Windows系统下解决python2和python3的兼容性问题以及分别配置pip策略
- 遗传算法解决TSP问题(c++实现)
- 模拟退火算法解决TSP问题+Python实现
- matlab实现解决最优控制中的内点约束问题
- Windows平台下C++插件系统实现的几个关键技术问题及其解决思路