資源簡介
蟻群算法 萬能通用代碼 最短路徑 matlab萬能代碼

代碼片段和文件信息
function?ACOfirst()
clear;
clc;
%author?Xing?Peng
%@copyright?reserved
%%?測試矩陣D
D=[0?1?3?0;???1?0?1?2;???3?1?0?5;???0?2?5?0;??];
%%?get?鄰接矩陣
%D=getD();
%%?將不連通賦值為0
N=size(D1);
for?i=1:N
????for?j=1:N
????????if?D(ij)==inf
????????????D(ij)=0;
????????end
????end
end
%%
%%?起點與終點
S=1?;?????????%?S?起始點(最短路徑的起始點)
E=N;?????????%?E?終止點(最短路徑的目的點)
%%?
Tau=ones(NN);%?Tau?初始信息素矩陣(認為前面的覓食活動中有殘留的信息素)
Tau=8.*Tau;
K=10;??????????%?K?迭代次數(指螞蟻出動多少波)
M=5;?????????%?M?螞蟻個數(每一波螞蟻有多少個)
Alpha=2;????%?Alpha?表征信息素重要程度的參數
Beta=5;?????%?Beta?表征啟發式因子重要程度的參數
Rho=0.1?;?????%?Rho?信息素蒸發系數
Q=1.2;??????????%?Q?信息素增加強度系數
minkl=inf;
mink=0;
minl=0;
dlmwrite(‘distance.txt‘D‘delimiter‘‘?‘)?
%xlswrite(‘d‘Dsheetrange);%輸出excel表
%%?啟發式信息,取為當前點至最終目標終點的直線距離的倒數
Eta=zeros(N1);
for?i=1:N
???if?i~=E
???????if?D(iN)~=0?
???????????Eta(i)=1/D(iN);
???????end
???else
???????Eta(i)=10;
???end
end
ROUTES=cell(KM);%用細胞結構存儲每一代的每一只螞蟻的爬行路線
PL=zeros(KM);%用矩陣存儲每一代的每一只螞蟻的爬行路線長度
%%?-----------啟動K輪螞蟻覓食活動,每輪派出M只螞蟻--------------------
for?k=1:K
????for?m=1:M
????????%%?第一步:狀態初始化
????????W=S;%當前節點初始化為起始點,W為螞蟻所在節點,
????????Path=S;%爬行路線初始化
????????PLkm=0;%爬行路線長度初始化
????????TABUkm=ones(N1);%禁忌表初始化,所有都為1,表示沒有走過
????????TABUkm(S1)=0;%已經在初始點了,因此要排除
????????DD=D;%鄰接矩陣初始化
????????%%?第二步:下一步可以前往的節點
????????DW=DD(W:);?%?選定第W個點,W為地圖編碼,把鄰接矩陣中第W行給DW
????????????????DW1=find(DW);%?找出DW這一行中,不為零的數,其所在的列序列,比如,W=1,則DW1=2?4,就是說第24與1有聯系
????????for?j=1:length(DW1)????
????????????if?TABUkm(DW1(j)1)==0?%?DW1(1)=2?TABUkm(2)=1?TABUkm(2)表示第2行的第1個數
????????????????DW(DW1(j))=0;
????????????end
????????end????????
????????LJD=find(DW);%?24
????????Len_LJD=length(LJD);%可選節點的個數2
????????iter=0;
????????%%?覓食停止條件:螞蟻未遇到食物或者陷入死胡同,第一代第一只螞蟻
????????while?W~=E&&Len_LJD>=1?%終止條件為,W為終點,或者,可選節點個數大于等于1
????????????iter=iter+1;
????????????%%?第三步:轉輪賭法選擇下一步怎么走
????????????PP=zeros(Len_LJD1);?%?根據螞蟻當前所在節點的下一個可選節點數,建立0矩陣行數為可選節點數,列數為1
????????????for?i=1:Len_LJD
????????????????PP(i)=(Tau(WLJD(i))^Alpha)*((Eta(LJD(i)))^Beta);
????????????end???????????
????????????sumpp=sum(PP);?%求PP這一列的和,
????????????PP=PP/sumpp;%建立概率分布,即這一列中,每個元素代表可選節點被選中的概率????????????
????????????Pcum(1)=PP(1);%第一個可行節點被選中的概率
????????????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));%?確定下一步要走的節點????????????
????????????%%?第四步:狀態更新和記錄????????????
????????????Path=[Pathto_visit];%螞蟻從W移動到to_visit,節點序列增加,路徑長度增加路徑節點序列拼接,矩陣拼接
????????????PLkm=PLkm+DD(Wto_visit);%路徑長度增加
????????????W=to_visit;%螞蟻移到下一個節點????????????
????????????for?kk=1:N?%搜索每一個節點
????????????????if?TABUkm(kk1)==0?%如果這個節點走過了,為0表示走過了
????????????????????DD(Wkk)=0;?%?把與走過點的長度賦值為0
????????????????????DD(kkW)=0;
????????????????end
????????????end
????????????TABUkm(W1)=0;%已訪問過的節點從禁忌表中刪除重復再下一步可以前往的節點
????????????DW=DD(W:);
????????????DW1=find
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????27961??2013-07-05?15:14??ACOfirst.m
評論
共有 條評論