資源簡(jiǎn)介
功能比較齊全的蟻群算法工具箱,包含測(cè)試數(shù)據(jù),自我介紹文件,對(duì)源數(shù)據(jù)進(jìn)行處理的程序,對(duì)數(shù)據(jù)處理后可以使用蟻群算法進(jìn)行TSP問題的研究,最后繪制路徑圖,本工具箱使用matlab代碼編寫。是你研究蟻群算法不可多得的助手。

代碼片段和文件信息
function?[Route_BestLength_BestLength_AverageShortest_RouteShortest_LengthTime]=ACMTSP(CityLoop_MaxAnt_CountAlphaBetaVolatileQ)
%%根據(jù)城市的坐標(biāo)運(yùn)行,使用蟻群算法求解最優(yōu)化問題,并最后繪制運(yùn)行結(jié)果的圖形。
%%使用說明:[Route_BestLength_BestLength_AverageShortest_RouteShortest_Length]=ACMTSP(CityLoop_MaxAnt_CountAlphaBetaVolatileQ)
%%?主要符號(hào)說明
%%City_Count:城市的個(gè)數(shù).
%%?City:City_Count個(gè)城市的坐標(biāo),City_Count×2的矩陣.
%%?Loop_Max:最大循環(huán)次數(shù),即迭代的次數(shù)
%%?Ant_Count:螞蟻個(gè)數(shù)
%%?Alpha:表征信息素重要程度的參數(shù)
%%?Beta:表征啟發(fā)因子(期望)重要程度的參數(shù)
%%?Volatile:信息素?fù)]發(fā)系數(shù)
%%?Q:信息素強(qiáng)度的系數(shù),一般是一個(gè)常量
%%?Route_Best:代表最佳路線
%%?Length_Best:代最佳路線的長(zhǎng)度
%%Length_Average:代表平均路徑長(zhǎng)度
%%Shortest_Route:表示找到的最短的路徑,其中包含城市節(jié)點(diǎn)序列
%%Shortest_Length:表示最短路徑的長(zhǎng)度
%%Time:程序運(yùn)行時(shí)間,不包括繪圖時(shí)間.
%%=========================================================================?
%第一步:變量初始化
City_Count=size(City1);%City_Count表示問題的規(guī)模(城市個(gè)數(shù))
D=zeros(City_CountCity_Count);%D表示完全圖的賦權(quán)鄰接矩陣
for?i=1:City_Count
????for?j=1:City_Count
????????if?i~=j
????????????D(ij)=((City(i1)-City(j1))^2+(City(i2)-City(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
%D表示城市之間的距離,D(i,j)表示第i個(gè)城市距離第j個(gè)城市之間的距離.
%D這個(gè)矩陣應(yīng)該是對(duì)稱的。
Expectation=1./D;%Eta為啟發(fā)因子,這里設(shè)為距離的倒數(shù)
T_Pheromone=ones(City_CountCity_Count);?????%T_Pheromone為信息素矩陣
T_Ant_Passed=zeros(Ant_CountCity_Count);???%存儲(chǔ)并記錄每個(gè)螞蟻經(jīng)過的路徑
NC=1;?%迭代計(jì)數(shù)器,記錄迭代次數(shù)
Route_Best=zeros(Loop_MaxCity_Count);%每代找到的最佳路線
Length_Best=inf.*ones(Loop_Max1);???%每代最佳路線的長(zhǎng)度
Length_Average=zeros(Loop_Max1);????????%每代路線的平均長(zhǎng)度
tic
while?NC<=Loop_Max????????%停止條件之一:達(dá)到最大迭代次數(shù),停止
????%%第二步:將m只螞蟻放到n個(gè)城市上
????Rand_Position=[];???%隨即存取
????for?i=1:(ceil(Ant_Count/City_Count))
????????Rand_Position=[Rand_Positionrandperm(City_Count)];
????end
????T_Ant_Passed(:1)=(Rand_Position(11:Ant_Count))‘;????%將螞蟻放在城市上,并記錄螞蟻訪問過的城市的編號(hào)????
????%%第三步:m只螞蟻按概率函數(shù)選擇下一座城市,完成各自的周游
????for?j=2:City_Count?????%所在城市不計(jì)算
????????for?i=1:Ant_Count??
????????????visited=T_Ant_Passed(i1:(j-1));?%記錄已訪問的城市,避免重復(fù)訪問
????????????No_Visited_City=zeros(1(City_Count-j+1));???????%待訪問的城市
????????????P=No_Visited_City;??????????????????????%待訪問城市的選擇概率分布
????????????No_V_C_Count=1;
????????????for?k=1:City_Count
????????????????if?isempty(find(visited==k?1))???%開始時(shí)置0
????????????????????No_Visited_City(No_V_C_Count)=k;????????????????????
????????????????????No_V_C_Count=No_V_C_Count+1;??%訪問的城市個(gè)數(shù)自加1
????????????????end
????????????end
????????????%下面計(jì)算待選城市的概率分布
????????????for?k=1:length(No_Visited_City)
????????????????P(k)=(T_Pheromone(visited(end)No_Visited_City(k))^Alpha)*(Expectation(visited(end)No_Visited_City(k))^Beta);
????????????end
????????????P=P/(sum(P));
????????????%按概率原則選取下一個(gè)城市
????????????Pcum=cumsum(P);????%cumsum,元素累加即求和
????????????Select=find(Pcum>=rand);?%若計(jì)算的概率大于原來的就選擇這條路線
????????????%-------------------------
????????????%Select=find(P>=rand);?%若計(jì)算的概率大于原來的就選擇這條路線
????????????%while(isempty(Select))
????????????%????Select=find(P>=r
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????6728??2010-11-25?01:05??ACS_Niu\ACMTSP.m
?????文件???????4981??2010-11-25?01:04??ACS_Niu\ACM_TSP_Dist.m
?????文件????????504??2010-11-25?00:32??ACS_Niu\GetMatrixByLowerDiag.m
?????文件????????631??2010-11-25?00:53??ACS_Niu\MatrixR17.mat
?????文件????????832??2010-11-25?00:53??ACS_Niu\MatrixR21.mat
?????文件????????319??2010-11-25?00:54??ACS_Niu\St70.mat
?????目錄??????????0??2010-11-25?01:08??ACS_Niu
-----------?---------??----------?-----??----
????????????????13995????????????????????7
評(píng)論
共有 條評(píng)論