資源簡介
蟻群算法 最短路徑 注釋完整 matlab代碼

代碼片段和文件信息
function?mst_main()
clear;
clc;
%author?Xing?Peng
%@copyright?reserved
G=[0?0?0?;
???0?1?1?;
???0?0?0?;
??];
MM=size(G1);??????%?G?地形圖為01矩陣,如果為1表示障礙物
Tau=ones(MM*MMMM*MM);%?Tau?初始信息素矩陣(認(rèn)為前面的覓食活動中有殘留的信息素)
Tau=8.*Tau;
K=10;??????????%?K?迭代次數(shù)(指螞蟻出動多少波)
M=5;?????????%?M?螞蟻個數(shù)(每一波螞蟻有多少個)
S=1?;?????????%?S?起始點(diǎn)(最短路徑的起始點(diǎn))
E=MM*MM;?????????%?E?終止點(diǎn)(最短路徑的目的點(diǎn))
Alpha=2;????%?Alpha?表征信息素重要程度的參數(shù)
Beta=5;?????%?Beta?表征啟發(fā)式因子重要程度的參數(shù)
Rho=0.1?;?????%?Rho?信息素蒸發(fā)系數(shù)
Q=1.2;??????????%?Q?信息素增加強(qiáng)度系數(shù)
minkl=inf;
mink=0;
minl=0;
D=G2D(G);%調(diào)用鄰接矩陣構(gòu)造函數(shù)
dlmwrite(‘distance.txt‘D‘delimiter‘‘?‘)?
%xlswrite(‘d‘Dsheetrange);%輸出excel表
N=size(D1);%N表示問題的規(guī)模(象素個數(shù))
a=1;%小方格象素的邊長
Ex=a*(mod(EMM)-0.5);%終止點(diǎn)橫坐標(biāo)
if?Ex==-0.5
????Ex=MM-0.5;
end
Ey=a*(MM+0.5-ceil(E/MM));%終止點(diǎn)縱坐標(biāo)
Eta=zeros(N);%啟發(fā)式信息,取為至目標(biāo)點(diǎn)的直線距離的倒數(shù)
%下面構(gòu)造啟發(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)=10;
???end
end
ROUTES=cell(KM);%用細(xì)胞結(jié)構(gòu)存儲每一代的每一只螞蟻的爬行路線
PL=zeros(KM);%用矩陣存儲每一代的每一只螞蟻的爬行路線長度
%%?-----------啟動K輪螞蟻覓食活動,每輪派出M只螞蟻--------------------
for?k=1:K
????for?m=1:M
????????%%?第一步:狀態(tài)初始化
????????W=S;%當(dāng)前節(jié)點(diǎn)初始化為起始點(diǎn),W為螞蟻所在節(jié)點(diǎn),
????????Path=S;%爬行路線初始化
????????PLkm=0;%爬行路線長度初始化
????????TABUkm=ones(MM*MM1);%禁忌表初始化,所有都為1,表示沒有走過
????????TABUkm(S1)=0;%已經(jīng)在初始點(diǎn)了,因此要排除
????????DD=D;%鄰接矩陣初始化
????????%%?第二步:下一步可以前往的節(jié)點(diǎn)
????????DW=DD(W:);?%?選定第W個點(diǎn),W為地圖編碼,把鄰接矩陣中第W行給DW
????????????????DW1=find(DW);%?找出DW這一行中,不為零的數(shù),其所在的列序列,比如,W=1,則DW1=2?4,就是說第24與1有聯(lián)系
????????for?j=1:length(DW1)????
????????????if?TABUkm(DW1(j)1)==0?%?DW1(1)=2?TABUkm(2)=1?TABUkm(2)表示第2行的第1個數(shù)
????????????????DW(DW1(j))=0;
????????????end
????????end????????
????????LJD=find(DW);%?24
????????Len_LJD=length(LJD);%可選節(jié)點(diǎn)的個數(shù)2
????????iter=0;
????????%%?覓食停止條件:螞蟻未遇到食物或者陷入死胡同,第一代第一只螞蟻
????????while?W~=E&&Len_LJD>=1?%終止條件為,W為終點(diǎn),或者,可選節(jié)點(diǎn)個數(shù)大于等于1
????????????iter=iter+1;
????????????%%?第三步:轉(zhuǎn)輪賭法選擇下一步怎么走
????????????PP=zeros(Len_LJD1);?%?根據(jù)螞蟻當(dāng)前所在節(jié)點(diǎn)的下一個可選節(jié)點(diǎn)數(shù),建立0矩陣
???????????????????????????????%?行數(shù)為可選節(jié)點(diǎn)數(shù),列數(shù)為1
????????????
????????????for?i=1:Len_LJD
????????????????PP(i)=(Tau(WLJD(i))^Alpha)*((Eta(LJD(i)))^Beta);
????????????end
????????????
????????????sumpp=sum(PP);?%求PP這一列的和,
????????????PP=PP/sumpp;%建立概率分布,即這一列中,每個元素代表可選節(jié)點(diǎn)被選中的概率
????????????
????????????Pcum(1)=PP(1);%第一個可行節(jié)點(diǎn)被選中的概率
????????????for?i=2:Len_LJD
????????????????Pcum(i)=Pcum(i-1)+PP(i);
????????????end
????????????Pcum(1:Len_LJD);?%概率累加,最后一個概率是1
????????????Select=find(Pcum>=rand);???????????
????????????to_visit=LJD(Select(1));%?確定下一步要走的節(jié)點(diǎn)
????????????
????????????%%?第四步:狀態(tài)更新和記錄????????????
????????????Path=[Pathto_visit];%螞蟻從W移動到to_visit,節(jié)點(diǎn)序列增加,路徑長度增加路徑節(jié)點(diǎn)序列拼接,矩陣拼接
????????????PLkm=PLkm+DD(Wto_visit);%路徑長度增加
????????????W=to_visit;%螞蟻移到下一個節(jié)點(diǎn)????????????
????????????for?kk=1:MM*MM?%搜索每一個節(jié)點(diǎn)
????????????????if?TABUkm(kk1)==0?%如果這個節(jié)點(diǎn)走過了,為0表示走過了
????????????????????DD(Wkk)=0;?%?把與走過點(diǎn)的長度賦值為0
??
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????7633??2013-07-02?15:12??mst_main.m
- 上一篇:卡爾曼平滑
- 下一篇:蟻群算法最短路徑萬能matlab源代碼
評論
共有 條評論