1. 程式人生 > >蟻群演算法學習

蟻群演算法學習

**

蟻群演算法的基本原理(簡單概括):

**

  • 剛開始螞蟻按照同等概率選擇各條路徑。
  • 螞蟻在經過的路徑下留下資訊素。
  • 短的路徑螞蟻會率先找到食物源,因此資訊素濃度偏大。
  • 由於資訊素的揮發,較長路徑上的資訊素逐漸消失

特點:正反饋;不容易陷入區域性最優,易於找到全域性最優解;分散式計算特點;

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

寫程式碼的時候對結果產生了一個誤區,就是最好的結果會在最後一次運算中產生,也就是說螞蟻們最後的結果會趨於一致,結果應該是最後一次未必會產生最好的結果,隨機性還是有的,最好的結果會在執行的中間產生。(這個誤區卡了我好久哇)
在這裡插入圖片描述
在這裡插入圖片描述
下面附上原理:

在這裡插入圖片描述

在這裡插入圖片描述