蚁群算法.txt
来自「蚁群算法:用来进行路径设计、查找、规划等」· 文本 代码 · 共 258 行 · 第 1/2 页
TXT
258 行
0 0 0 0 0 0 156.87 0 0 0 0 0 0 0 0 0 0 80.368 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 76.916 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 76.913 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 76.89 0 0 0 0 0 0 0 0 0 0 0 0 0 76.914 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 79.409 0 0 0 0 0 76.918 0 0 0 0 0 0 0 0 0 0 0 0 0 0 76.912 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 76.923 76.926 0 0 0 0 0 0 0 0 76.921 0 0 0 0 0 0
];
%%第一步:变量初始化
n=size(C,1);%n表示问题的规模(城市个数)
gplot(D , C);%画无向图
hold on
XX=C';
plot(XX(1 , , XX(2 , , 'k+', 'markersize' , 5) %画十字架
for i=1:n
text(C(i,1)+5,C(i,2),int2str(i)); %加标号
end
for i=1:n
for j=1:n
if D(i,j)==0
D(i,j)=inf;
end
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);%各代最佳路线的长度
lastmin=inf; %上代最小路径
thesameNum=0; %终止算法条件之一
while NC<=NC_max%停止条件之一:达到最大迭代次数
%%第二步:将m只蚂蚁放到n个城市上
Randpos=ones(1,m)*s;
Tabu(:,1)=(Randpos(1,1:m))';
%%第三步:m只蚂蚁按概率函数选择相通的下一座城市,直到到达目的地
for i=1:m
%按概率原则选取下一个城市
%只有当达到最后的节点等于终点时候才结束
j=2;
to_visit=s;
while to_visit~=e
visited=Tabu(i,1j-1));%已访问的城市
% 得到矩阵中最后一个不为0的数 ,即蚂蚁爬到的最后节点
col=size(visited,2);
lastvisited=visited(end);
J=[];%待访问的城市,随机分布
=J;%待访问城市的选择概率分布
Jc=1;
JJ=randperm(n);%随机分布
for k=1:n
flag=bHaveNum(visited,JJ(k));
if flag~=1
if D(lastvisited,JJ(k))~=inf
J(Jc)=JJ(k);
Jc=Jc+1;
end
end
end
if length(J) ==0
break;
end
%下面计算待选城市的概率分布
for k=1:length(J)
P(k)=(Tau(lastvisited,J(k))^Alpha)*(Eta(lastvisited,J(k))^Beta);
end
=P/(sum(P));
cum=cumsum(P);
Select=find(Pcum>=rand);
kk=randperm(length(Select));
to_visit=J(Select(kk(1)));
Tabu(i,j)=to_visit;
j=j+1;
end
end
%%第四步:记录本次迭代最佳路线
L=zeros(m,1);
for i=1:m
R=Tabu(i,;
F=thelastNum(R);
if R(F)==e
for j=1n-1)
if R(j+1)~=0
L(i)=L(i)+D(R(j),R(j+1));
end
end
else
L(i)=inf;
end
end
if lastmin~=min(L)
thesameNum=0;
else
thesameNum=thesameNum+1;
end
if (thesameNum >0.2*NC_max)
break;
end
L_best(NC)=min(L);
pos=find(L==L_best(NC));
R_best(NC,=Tabu(pos(1),;
NC=NC+1;
%%第五步:更新信息素
Delta_Tau=zeros(n,n);
for i=1:m
for j=1n-1)
if Tabu(i,j+1)~=0
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
end
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));
F=thelastNum(Shortest_Route);
Shortest_Route=Shortest_Route(1:F);
plot(XX(1 , Shortest_Route') , XX(2 , Shortest_Route') , 'g' , 'linewidth' , 1) %画结果路径
hold off
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?