资源描述:
《基本蚁群算法matlab》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、基本蚁群算法matlab实现function[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=AC(C,NC_Max,m,Alpha,Beta,Rho,Q)%%%%%%%%%%%%%%%%%%%主要符号说明%Cn个城市的坐标,n*2矩阵%NC_Max最大循环次数%%m蚂蚁个数%Alpha信息素重要程度的参数%Beta能见度重要程度的参数%Rho信息素蒸发系数1-Rho为协同因子%Q信息素增加强度系数%R_best每次循环的最佳路线NC_Max*n%L_best每次循环的最短路径NC_Max*1%
2、%%%%%=========================================%%%i,j表示边k表示蚂蚁%%%%%%第一步%变量初始化%%%%%%%%%%%%%%%%%%%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(j,2))^2)^0.5;elseD(i,j)=eps;%距离为很小的0,因为距离不能等于0endD(j,i)=D(i,j);%对称矩阵,问
3、题是已经知道是对称了,这句还有必要吗endendEta=1./D;%Eta为距离的倒数,能见度%更改Eta是否可行,有待测试%Eta=100./(D+50-rem(fix(D),50));Trace=ones(n,n);%Trace为信息素矩阵,初始为1NC=1;R_best=zeros(NC_Max,n);%R_best为每次循环的最佳路线,初始化为0L_best=inf.*ones(NC_Max,1);%L_best为每次循环的最短路径,初始化为无穷大Randpos=[];%Randpos存储蚂蚁的位置m*1fori=1:(ceil(m/n))%
4、ceil是向上取整Randpos=[Randpos,randperm(n)];endTabu=zeros(m,n);%Tabu为存储每个蚂蚁路径,初始为0,同时也是清空禁忌表Tabu(:,1)=(Randpos(1,1:m))';%初始化禁忌表%%第二步将m只蚂蚁放在n个城市上,初始化禁忌表%%%%%%%while(NC<=NC_Max)%第三步m只蚂蚁按概率函数选择下一座城市,完成各自的周游,进行一次循环%%%%%%%%%%%循环结构为,每只蚂蚁移动一条边,共移动n-1条边,最后一条边为回来的一条边fori=2:n%一次循环,m只蚂蚁需进行n-1次
5、迭代fork=1:m%每只蚂蚁都需选择visited=Tabu(k,1:(i-1));%visited存储第k只蚂蚁已经访问过的城市,避免重复访问,visited为行向量J=zeros(1,(n-i+1));%J为待访问的城市,J为行向量P=J;%待访问城市的选择概率分布,设概率函数Ps=1;%将待访问的城市存储在J(s)forj=1:niflength(find(visited==j))==0%开始时置0J(s)=j;s=s+1;endend%将待访问的城市存储在J(s)%下面计算待选城市的概率分布forj=1:length(J)P(j)=(Tra
6、ce(visited(end),J(j))^Alpha)*(Eta(visited(end),J(j))^Beta);endP=P/(sum(P));%sum(P)是标量,作为除数,矩阵除和数组除结果一样%%%按概率原则选取下一个城市Pcum=cumsum(P);%cumsum,元素累加求和,累加和Select=find(Pcum>=rand);%%%这就是所谓的根据概率随机选择to_visit=J(Select(1));Tabu(k,i)=to_visit;%将选择的城市to_visit插入禁忌表endend%%对Tabu进行赋值运算后,下一次保留
7、上一次的最好路线,故令Tabu(1,:)为最好路线%%%%%%%%%%%%%%%%ifNC>=2%%%%%%%%%%%%%%%%Tabu(1,:)=R_best(NC-1,:);%%%%%%%%%%%%%%%%end%%%%%%%%%第四步计算最短路径和信息素的改变量%%%%%%%%%%%%%%%%%%L=zeros(m,1);%初始距离为0,m*1矩阵%计算每次蚂蚁的距离fork=1:mR=Tabu(k,:);fori=1:(n-1)L(k)=L(k)+D(R(i),R(i+1));endL(k)=L(k)+D(R(n),R(1));endL_be
8、st(NC)=min(L);%第NC次循环的最短路径%最佳路线pos=find(L==L_best(NC))