資源簡介
關于基本蟻群算法的matlab仿真程序,經(jīng)過實際測試,并詳細注釋
代碼片段和文件信息
function?m_main()
G=[0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0;
???0?1?1?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0;
???0?1?1?0?0?0?1?1?1?0?0?0?0?0?0?0?0?0?0?0;
???0?0?0?0?0?0?1?1?1?0?0?0?0?0?0?0?0?0?0?0;
???0?0?0?0?0?0?1?1?1?0?0?0?0?0?0?0?0?0?0?0;
???0?1?1?1?0?0?1?1?1?0?0?0?0?0?0?0?0?0?0?0;
???0?1?1?1?0?0?1?1?1?0?0?0?0?0?0?0?0?0?0?0;
???0?1?1?1?0?0?1?1?1?0?1?1?1?1?0?0?0?0?0?0;
???0?1?1?1?0?0?0?0?0?0?1?1?1?1?0?0?0?0?0?0;
???0?0?0?0?0?0?0?0?0?0?1?1?1?1?0?0?0?0?0?0;
???0?0?0?0?0?0?0?1?1?0?1?1?1?1?0?0?0?0?0?0;
???0?0?0?0?0?0?0?1?1?0?0?0?0?0?0?0?0?0?0?0;
???0?0?0?0?0?0?0?0?0?0?0?1?1?1?0?1?1?1?1?0;
???0?0?0?0?0?0?0?0?0?0?0?1?1?1?0?1?1?1?1?0;
???0?0?1?1?0?0?0?0?0?0?0?1?1?1?0?1?1?1?1?0;
???0?0?1?1?0?0?1?1?1?0?0?0?0?0?0?0?0?0?0?0;
???0?0?0?0?0?0?1?1?1?0?1?1?0?0?0?0?0?1?1?0;
???0?0?0?0?0?0?0?0?0?0?1?1?0?0?1?0?0?1?1?0;
???0?0?0?0?0?0?0?0?0?0?0?0?0?0?1?0?0?0?0?0;
???0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0;];
MM=size(G1);??????%?G?地形圖為01矩陣,如果為1表示障礙物
Tau=ones(MM*MMMM*MM);%?Tau?初始信息素矩陣(認為前面的覓食活動中有殘留的信息素)
Tau=8.*Tau;
K=100;??????????%?K?迭代次數(shù)(指螞蟻出動多少波)
M=80;?????????%?M?螞蟻個數(shù)(每一波螞蟻有多少個)
S=1?;?????????%?S?起始點(最短路徑的起始點)
E=MM*MM;?????????%?E?終止點(最短路徑的目的點)
Alpha=1;????%?Alpha?表征信息素重要程度的參數(shù)
Beta=6;?????%?Beta?表征啟發(fā)式因子重要程度的參數(shù)
Rho=0.3?;?????%?Rho?信息素蒸發(fā)系數(shù)
Q=1;??????????%?Q?信息素增加強度系數(shù)
minkl=inf;
mink=0;
minl=0;
D=G2D(G);
N=size(D1);%N表示問題的規(guī)模(象素個數(shù))
a=1;%小方格象素的邊長
Ex=a*(mod(EMM)-0.5);%終止點橫坐標
if?Ex==-0.5
Ex=MM-0.5;
end
Ey=a*(MM+0.5-ceil(E/MM));%終止點縱坐標
Eta=zeros(N);%啟發(fā)式信息,取為至目標點的直線距離的倒數(shù)
%下面構造啟發(fā)式信息矩陣
for?i=1:N
?ix=a*(mod(iMM)-0.5);
???if?ix==-0.5
???ix=MM-0.5;
???end
iy=a*(MM+0.5-ceil(i/MM));?
???if?i~=E
???Eta(i)=1/((ix-Ex)^2+(iy-Ey)^2)^0.5;
???else
???Eta(i)=100;
???end
end
ROUTES=cell(KM);%用細胞結構存儲每一代的每一只螞蟻的爬行路線
PL=zeros(KM);%用矩陣存儲每一代的每一只螞蟻的爬行路線長度
%%?-----------啟動K輪螞蟻覓食活動,每輪派出M只螞蟻--------------------
for?k=1:K
for?m=1:M
%%?第一步:狀態(tài)初始化
W=S;%當前節(jié)點初始化為起始點
Path=S;%爬行路線初始化
PLkm=0;%爬行路線長度初始化
TABUkm=ones(N);%禁忌表初始化
TABUkm(S)=0;%已經(jīng)在初始點了,因此要排除
DD=D;%鄰接矩陣初始化
%%?第二步:下一步可以前往的節(jié)點
DW=DD(W:);
DW1=find(DW);
for?j=1:length(DW1)
???if?TABUkm(DW1(j))==0
??????DW(DW1(j))=0;
??end
end
LJD=find(DW);
Len_LJD=length(LJD);%可選節(jié)點的個數(shù)
%%?覓食停止條件:螞蟻未遇到食物或者陷入死胡同
while?W~=E&&Len_LJD>=1
%%?第三步:轉輪賭法選擇下一步怎么走
PP=zeros(Len_LJD);
??for?i=1:Len_LJD
????PP(i)=(Tau(WLJD(i))^Alpha)*((Eta(LJD(i)))^Beta);
??end
sumpp=sum(PP);
PP=PP/sumpp;%建立概率分布
Pcum(1)=PP(1);
??for?i=2:Len_LJD
??Pcum(i)=Pcum(i-1)+PP(i);
??end
Select=find(Pcum>=rand);
to_visit=LJD(Select(1));
%%?第四步:狀態(tài)更新和記錄
Path=[Pathto_visit];%路徑增加
PLkm=PLkm+DD(Wto_visit);%路徑長度增加
W=to_visit;%螞蟻移到下一個節(jié)點
???for?kk=1:N
??????if?TABUkm(kk)==0
??????DD(Wkk)=0;
??????DD(kkW)=0;
??????end
???end
TABUkm(W)=0;%已訪問過的節(jié)點從禁忌表中刪除
DW=DD(W:);
DW1=find(DW);
??for?j=1:length(DW1)
????if?TABUkm(DW1(j))==0
???????DW(j)=0;
????end
??end
L
- 上一篇:混沌矩陣生成代碼
- 下一篇:二維的Haar小波變換
評論
共有 條評論