資源描述:
《蟻群算法matlab源碼》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、function[Shortest_Route,Shortest_Length]=ACATSP(D,NC_max,m,Alpha,Beta,Rho,Q)%%=========================================================================%%ACATSP.m%%AntColonyAlgorithmforTravelingSalesmanProblem%%ChengAihua,PLAInformationEngineeringUniversit
2、y,ZhengZhou,China%%Email:aihuacheng@gmail.com%%Allrightsreserved%%-------------------------------------------------------------------------%%主要符號(hào)說(shuō)明%%Cn個(gè)城市的坐標(biāo),n×2的矩陣%%NC_max最大迭代次數(shù)%%m螞蟻個(gè)數(shù)%%Alpha表征信息素重要程度的參數(shù)%%Beta表征啟發(fā)式因子重要程度的參數(shù)%%Rho信息素蒸發(fā)系數(shù)%%Q信息素增加強(qiáng)度系數(shù)%%R_bes
3、t各代最佳路線(xiàn)%%L_best各代最佳路線(xiàn)的長(zhǎng)度%%L_ave各代路線(xiàn)的平均長(zhǎng)度%%=========================================================================%%第一步:變量初始化n=size(D,1);fori=1:nD(i,i)=eps;endEta=1./D;%Eta為啟發(fā)因子,這里設(shè)為距離的倒數(shù)Tau=ones(n,n);%Tau為信息素矩陣Tabu=zeros(m,n);%存儲(chǔ)并記錄路徑的生成NC=1;%迭代計(jì)數(shù)器R_bes
4、t=zeros(NC_max,n);%各代最佳路線(xiàn)L_best=inf.*ones(NC_max,1);%各代最佳路線(xiàn)的長(zhǎng)度L_ave=zeros(NC_max,1);%各代路線(xiàn)的平均長(zhǎng)度whileNC<=NC_max%停止條件之一:達(dá)到最大迭代次數(shù)%%第二步:將m只螞蟻放到n個(gè)城市上Randpos=[];fori=1:(ceil(m/n))Randpos=[Randpos,randperm(n)];endTabu(:,1)=(Randpos(1,1:m))';%%第三步:m只螞蟻按概率函數(shù)選擇下一座城市
5、,完成各自的周游forj=2:nfori=1:mvisited=Tabu(i,1:(j-1));%已訪(fǎng)問(wèn)的城市J=zeros(1,(n-j+1));%待訪(fǎng)問(wèn)的城市P=J;%待訪(fǎng)問(wèn)城市的選擇概率分布Jc=1;fork=1:niflength(find(visited==k))==0J(Jc)=k;Jc=Jc+1;endend%下面計(jì)算待選城市的概率分布fork=1:length(J)P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Bet
6、a);%(信息素^信息素系數(shù))*(啟發(fā)因子^啟發(fā)因子系數(shù))endP=P/(sum(P));%按概率原則選取下一個(gè)城市Pcum=cumsum(P);Select=find(Pcum>=rand);to_visit=J(Select(1));Tabu(i,j)=to_visit;endendifNC>=2Tabu(1,:)=R_best(NC-1,:);end%%第四步:記錄本次迭代最佳路線(xiàn)L=zeros(m,1);fori=1:mR=Tabu(i,:);forj=1:(n-1)L(i)=L(i)+D(R(j
7、),R(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%%第五步:更新信息素Delta_Tau=zeros(n,n);fori=1:mforj=1:(n-1)Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L
8、(i);endDelta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);endTau=(1-Rho).*Tau+Delta_Tau;%%第六步:禁忌表清零Tabu=zeros(m,n);end%%第七步:輸出結(jié)果Pos=find(L_best==min(L_best));Shortest_Route=R_best(Pos(1),:)Shortest