【转载】蚁群算法TSP(旅行商问题)通用matlab程序

标签:
it |
分类: 程序语言类 |
function
%%===================================================================
%%
%%
%%
%%
%%
%%-------------------------------------------------------------------------
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%
%%===================================================================
%%第一步:变量初始化
n=size(C,1);%n表示问题的规模(城市个数)
D=zeros(n,n);%D表示完全图的赋权邻接矩阵
for
for
if
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为信息素矩阵
Tabu=zeros(m,n);%存储并记录路径的生成
NC=1;%迭代计数器
R_best=zeros(NC_max,n);%各代最佳路线
L_best=inf.*ones(NC_max,1);%各代最佳路线的长度
L_ave=zeros(NC_max,1);%各代路线的平均长度
while
%%第二步:将m只蚂蚁放到n个城市上
Randpos=[];
for
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))';
%%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游
for
for
visited=Tabu(i,1:(j-1));%已访问的城市
J=zeros(1,(n-j+1));%待访问的城市
P=J;%待访问城市的选择概率分布
Jc=1;
for
if
J(Jc)=k;
Jc=Jc+1;
end
end
%下面计算待选城市的概率分布
for
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));
%按概率原则选取下一个城市
Pcum=cumsum(P);
Select=find(Pcum>=rand);
to_visit=J(Select(1));
Tabu(i,j)=to_visit;
end
end
if
Tabu(1,:)=R_best(NC-1,:);
end
%%第四步:记录本次迭代最佳路线
L=zeros(m,1);
for
R=Tabu(i,:);
for
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);
NC=NC+1
%%第五步:更新信息素
Delta_Tau=zeros(n,n);
for
for
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);
end
Tau=(1-Rho).*Tau+Delta_Tau;
%%第六步:禁忌表清零
Tabu=zeros(m,n);
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)
hold
plot(L_ave)
function
%%=========================================================================
%%
%%
%%-------------------------------------------------------------------------
%%
%%
%%===================================================================
N=length(R);
scatter(C(:,1),C(:,2));
hold
plot([C(R(1),1),C(R(N),1)],[C(R(1),2),C(R(N),2)])
hold
for
plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)])
hold
end
设置初始参数如下:
m=31;Alpha=1;Beta=5;Rho=0.1;NC_max=200;Q=100;
31城市坐标为:
1304
3639
4177
3712
3488
3326
3238
4196
4312
4386
3007
2562
2788
2381
1332
3715
3918
4061
3780
3676
4029
4263
3429
3507
3394
3439
2935
3140
2545
2778
2370
运行后得到15602的巡游路径,路线图和收敛曲线如下