蟻群演算法學習
阿新 • • 發佈:2018-11-05
**
蟻群演算法的基本原理(簡單概括):
**
- 剛開始螞蟻按照同等概率選擇各條路徑。
- 螞蟻在經過的路徑下留下資訊素。
- 短的路徑螞蟻會率先找到食物源,因此資訊素濃度偏大。
- 由於資訊素的揮發,較長路徑上的資訊素逐漸消失
特點:正反饋;不容易陷入區域性最優,易於找到全域性最優解;分散式計算特點;
load('citys'); distance=pdist2(citys,citys); % 構建距離矩陣 [m n]=size(citys); ant_num=30; % 螞蟻數量 a=1; % 資訊素重要程度 b=5; % 啟發函式重要程度 r=0.1; % 資訊素揮發因子 table=zeros(ant_num,m); % 資訊素矩陣 tau= ones(m,m); % 資訊素矩陣 distance(distance==0)=1e-4; dta=1./distance; % 啟發函式 min_length=999999999; for i=1:200 % 迭代次數 table=zeros(ant_num,m); ant_length=zeros(ant_num,1); % 計算每隻螞蟻走過的距離 start=round(rand(ant_num,1)*(m-1)+1); % 隨機產生初始城市 table(:,1)=start; citys_index=1:m; for num=1:ant_num % 從每一隻螞蟻開始 for j=2:m zhi=table(num,1:(j-1)); allow_index=~ismember(citys_index,zhi); % 判斷哪些城市還沒去過 allow_city=citys_index(allow_index); p= ((tau(table(num,j-1),allow_city)).^a.*(dta(table(num,j-1),allow_city)).^b)./... % 判斷去每個城市的概率 sum((tau(table(num,j-1),allow_city)).^a.*(dta(table(num,j-1),allow_city)).^b); pc=cumsum(p);% 輪盤賭法決策下一個去的城市 target_index=find(pc>=rand); target_city=allow_city(target_index(1)); table(num,j)=target_city; ant_length(num,1)=distance(table(num,j-1),table(num,j))+ant_length(num,1); % 更新每一隻螞蟻的總路徑 if j==m ant_length(num,1)=distance(table(num,j),table(num,1))+ant_length(num,1); end end end if min_length>min(ant_length) [min_length,min_index]=min(ant_length); rout=Table(min_index,:); end tau=tau.*(1-r); % 資訊素的揮發 for num=1:ant_num for j=1:m % 資訊素的累加 tau(table(num,j),table(num,mod(j,m)+1))=tau(table(num,j),table(num,mod(j,m)+1))+1./ant_length(num,1); end end end
寫程式碼的時候對結果產生了一個誤區,就是最好的結果會在最後一次運算中產生,也就是說螞蟻們最後的結果會趨於一致,結果應該是最後一次未必會產生最好的結果,隨機性還是有的,最好的結果會在執行的中間產生。(這個誤區卡了我好久哇)
下面附上原理: