資源簡(jiǎn)介
通過matlab實(shí)現(xiàn)的蟻群算法的完整資源,里面包含三個(gè)文件,一個(gè)源程序.m文件,一個(gè)是命令行需要輸入的代碼,在一個(gè)就是文檔結(jié)果;良心代碼!

代碼片段和文件信息
function?[R_bestL_bestL_aveShortest_RouteShortest_Length]=ACATSP(CNC_maxmAlphaBetaRhoQ)
%%-------------------------------------------------------------------------
%%?主要符號(hào)說明
%%?C?n個(gè)城市的坐標(biāo),n×2的矩陣
%%?NC_max?最大迭代次數(shù)
%%?m?螞蟻個(gè)數(shù)
%%?Alpha?表征信息素重要程度的參數(shù)
%%?Beta?表征啟發(fā)式因子重要程度的參數(shù)
%%?Rho?信息素蒸發(fā)系數(shù)
%%?Q?信息素增加強(qiáng)度系數(shù)
%%?R_best?各代最佳路線
%%?L_best?各代最佳路線的長(zhǎng)度
%%=========================================================================
%%第一步:變量初始化
n=size(C1);%n表示問題的規(guī)模(城市個(gè)數(shù))
D=zeros(nn);%D表示完全圖的賦權(quán)鄰接矩陣
for?i=1:n
for?j=1:n
if?i~=j
D(ij)=((C(i1)-C(j1))^2+(C(i2)-C(j2))^2)^0.5;
else
D(ij)=eps;??????%i=j時(shí)不計(jì)算,應(yīng)該為0,但后面的啟發(fā)因子要取倒數(shù),用eps(浮點(diǎn)相對(duì)精度)表示
end
D(ji)=D(ij);???%對(duì)稱矩陣
end
end
Eta=1./D;??????????%Eta為啟發(fā)因子,這里設(shè)為距離的倒數(shù)
Tau=ones(nn);?????%Tau為信息素矩陣
Tabu=zeros(mn);???%存儲(chǔ)并記錄路徑的生成
NC=1;???????????????%迭代計(jì)數(shù)器,記錄迭代次數(shù)
R_best=zeros(NC_maxn);???????%各代最佳路線
L_best=inf.*ones(NC_max1);???%各代最佳路線的長(zhǎng)度
L_ave=zeros(NC_max1);????????%各代路線的平均長(zhǎng)度
while?NC<=NC_max????????%停止條件之一:達(dá)到最大迭代次數(shù),停止
%%第二步:將m只螞蟻放到n個(gè)城市上
Randpos=[];???%隨即存取
for?i=1:(ceil(m/n))
Randpos=[Randposrandperm(n)];
end
Tabu(:1)=(Randpos(11:m))‘;????%此句不太理解?
%%第三步:m只螞蟻按概率函數(shù)選擇下一座城市,完成各自的周游
for?j=2:n?????%所在城市不計(jì)算
for?i=1:m????
visited=Tabu(i1:(j-1));?%記錄已訪問的城市,避免重復(fù)訪問
J=zeros(1(n-j+1));???????%待訪問的城市
P=J;??????????????????????%待訪問城市的選擇概率分布
Jc=1;
for?k=1:n
if?length(find(visited==k))==0???%開始時(shí)置0
J(Jc)=k;
Jc=Jc+1;?????????????????????????%訪問的城市個(gè)數(shù)自加1
end
end
%下面計(jì)算待選城市的概率分布
for?k=1:length(J)
P(k)=(Tau(visited(end)J(k))^Alpha)*(Eta(visited(end)J(k))^Beta);
end
P=P/(sum(P));
%按概率原則選取下一個(gè)城市
Pcum=cumsum(P);?????%cumsum,元素累加即求和
Select=find(Pcum>=rand);?%若計(jì)算的概率大于原來的就選擇這條路線
to_visit=J(Select(1));
Tabu(ij)=to_visit;
end
end
if?NC>=2
Tabu(1:)=R_best(NC-1:);
end
%%第四步:記錄本次迭代最佳路線
L=zeros(m1);?????%開始距離為0,m*1的列向量
for?i=1:m
R=Tabu(i:);
for?j=1:(n-1)
L(i)=L(i)+D(R(j)R(j+1));????%原距離加上第j個(gè)城市到第j+1個(gè)城市的距離
end
L(i)=L(i)+D(R(1)R(n));??????%一輪下來后走過的距離
end
L_best(NC)=min(L);???????????%最佳距離取最小
pos=find(L==L_best(NC));
R_best(NC:)=Tabu(pos(1):);?%此輪迭代后的最佳路線
L_ave(NC)=mean(L);???????????%此輪迭代后的平均距離
NC=NC+1??????????????????????%迭代繼續(xù)
%%第五步:更新信息素
Delta_Tau=zeros(nn);????????%開始時(shí)信息素為n*n的0矩陣
for?i=1:m
for?j=1:(n-1)
Delta_Tau(Tabu(ij)Tabu(ij+1))=Delta_Tau(Tabu(ij)Tabu(ij+1))+Q/L(i);??????????
%此次循環(huán)在路徑(i,j)上的信息素增量
end
Delta_Tau(Tabu(in)Tabu(i1))=Delta_Tau(Tabu(in)Tabu(i1))+Q/L(i);
%此次循環(huán)在整個(gè)路徑上的信息素增量
end
Tau=(1-Rho).*Tau+Delta_Tau;?%考慮信息素?fù)]發(fā),更新后的信息素
%%第六步:禁忌表清零
Tabu=zeros(mn);?????????????%%直到最大迭代次數(shù)
end
%%第七步:輸出結(jié)果
Pos=find(L_best==min(L_best));?%找到最佳路徑(非0為真)
Shortest_Route=R_best(Pos(1):)?%最大迭代次數(shù)后最佳路徑
Shortest_Length=L_best(Pos(1))?%最大迭代次數(shù)后最短距離
subplot(121)??????????????????%繪制第一個(gè)子圖形
DrawRoute(CShortest_Route)?????%畫路線圖的子函數(shù)
subplot(12
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????4409??2017-02-07?15:27??蟻群算法完整matlab代碼\ACATSP.m
?????文件????????163??2017-02-07?15:35??蟻群算法完整matlab代碼\命令行.txt
?????文件???????2129??2017-02-07?15:36??蟻群算法完整matlab代碼\運(yùn)行結(jié)果.txt
?????目錄??????????0??2017-02-07?15:36??蟻群算法完整matlab代碼
-----------?---------??----------?-----??----
?????????????????6701????????????????????4
評(píng)論
共有 條評(píng)論