資源描述:
《基本蟻群算法matlab》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、基本蟻群算法matlab實現(xiàn)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最大循環(huán)次數(shù)%%m螞蟻個數(shù)%Alpha信息素重要程度的參數(shù)%Beta能見度重要程度的參數(shù)%Rho信息素蒸發(fā)系數(shù)1-Rho為協(xié)同因子%Q信息素增加強度系數(shù)%R_best每次循環(huán)的最佳路線NC_Max*n%L_best每次循環(huán)的最短路徑NC_Max*1%
2、%%%%%=========================================%%%i,j表示邊k表示螞蟻%%%%%%第一步%變量初始化%%%%%%%%%%%%%%%%%%%n=size(C,1);%n表示問題的規(guī)模(城市的個數(shù))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、題是已經(jīng)知道是對稱了,這句還有必要嗎endendEta=1./D;%Eta為距離的倒數(shù),能見度%更改Eta是否可行,有待測試%Eta=100./(D+50-rem(fix(D),50));Trace=ones(n,n);%Trace為信息素矩陣,初始為1NC=1;R_best=zeros(NC_Max,n);%R_best為每次循環(huán)的最佳路線,初始化為0L_best=inf.*ones(NC_Max,1);%L_best為每次循環(huán)的最短路徑,初始化為無窮大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只螞蟻按概率函數(shù)選擇下一座城市,完成各自的周游,進行一次循環(huán)%%%%%%%%%%%循環(huán)結(jié)構(gòu)為,每只螞蟻移動一條邊,共移動n-1條邊,最后一條邊為回來的一條邊f(xié)ori=2:n%一次循環(huán),m只螞蟻需進行n-1次
5、迭代fork=1:m%每只螞蟻都需選擇visited=Tabu(k,1:(i-1));%visited存儲第k只螞蟻已經(jīng)訪問過的城市,避免重復訪問,visited為行向量J=zeros(1,(n-i+1));%J為待訪問的城市,J為行向量P=J;%待訪問城市的選擇概率分布,設概率函數(shù)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)是標量,作為除數(shù),矩陣除和數(shù)組除結(jié)果一樣%%%按概率原則選取下一個城市Pcum=cumsum(P);%cumsum,元素累加求和,累加和Select=find(Pcum>=rand);%%%這就是所謂的根據(jù)概率隨機選擇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次循環(huán)的最短路徑%最佳路線pos=find(L==L_best(NC))