资源描述:
《求解最小费用流问题的蚁群算法matlab程序.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、以下是解放军信息工程大学一个老师编的matlab程序,请尊重原作者劳动,引用时请注明出处。我经过修改增加了注释,已经运行过,无误,function[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)%%-------------------------------------------------------------------------%%主要符号说明%%Cn个城市的坐标,n×2的矩阵%%NC_max最大迭代次数%%m蚂蚁个数%%Alp
2、ha表征信息素重要程度的参数%%Beta表征启发式因子重要程度的参数%%Rho信息素蒸发系数%%Q信息素增加强度系数%%R_best各代最佳路线%%L_best各代最佳路线的长度%%========================================================================= %%第一步:变量初始化n=size(C,1);%n表示问题的规模(城市个数)D=zeros(n,n);%D表示完全图的赋权邻接矩阵fori=1:nforj=1:nifi~=jD(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C
3、(j,2))^2)^0.5;elseD(i,j)=eps; %i=j时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示endD(j,i)=D(i,j); %对称矩阵endendEta=1./D; %Eta为启发因子,这里设为距离的倒数Tau=ones(n,n); %Tau为信息素矩阵Tabu=zeros(m,n); %存储并记录路径的生成NC=1; %迭代计数器,记录迭代次数R_best=zeros(NC_max,n); %各代最佳路线L_best=inf.*o
4、nes(NC_max,1); %各代最佳路线的长度L_ave=zeros(NC_max,1); %各代路线的平均长度 whileNC<=NC_max %停止条件之一:达到最大迭代次数,停止%%第二步:将m只蚂蚁放到n个城市上Randpos=[]; %随即存取fori=1:(ceil(m/n))Randpos=[Randpos,randperm(n)];endTabu(:,1)=(Randpos(1,1:m))'; %此句不太理解? %%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游forj=2:n %所在城市
5、不计算fori=1:m visited=Tabu(i,1:(j-1));%记录已访问的城市,避免重复访问J=zeros(1,(n-j+1)); %待访问的城市P=J; %待访问城市的选择概率分布Jc=1;fork=1:niflength(find(visited==k))==0 %开始时置0J(Jc)=k;Jc=Jc+1; %访问的城市个数自加1endend%下面计算待选城市的概率分布fork=1:length(J)P(k)=(Tau(visited(end
6、),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);endP=P/(sum(P));%按概率原则选取下一个城市Pcum=cumsum(P); %cumsum,元素累加即求和Select=find(Pcum>=rand);%若计算的概率大于原来的就选择这条路线to_visit=J(Select(1));Tabu(i,j)=to_visit;endendifNC>=2Tabu(1,:)=R_best(NC-1,:);end %%第四步:记录本次迭代最佳路线L=zeros(m,1); %开始距离为0,m*1的列向量for
7、i=1:mR=Tabu(i,:);forj=1:(n-1)L(i)=L(i)+D(R(j),R(j+1)); %原距离加上第j个城市到第j+1个城市的距离endL(i)=L(i)+D(R(1),R(n)); %一轮下来后走过的距离endL_best(NC)=min(L); %最佳距离取最小pos=find(L==L_best(NC));R_best(NC,:)=Tabu(pos(1),:);%此轮迭代后的最佳路线L_ave(NC)=mean(L); %此轮迭代后的平均距离NC=NC+1