特點:正反饋;不容易陷入區域性最優,易於找到全域性最優解;分布式計算特點;
寫**的時候對結果產生了乙個誤區,就是最好的結果會在最後一次運算中產生,也就是說螞蟻們最後的結果會趨於一致,結果應該是最後一次未必會產生最好的結果,隨機性還是有的,最好的結果會在執行的中間產生。(這個誤區卡了我好久哇)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);
endend
endif min_length>min(ant_length)
[min_length,min_index]=min(ant_length);
rout=table(min_index,:);
endtau=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);
endend
end
下面附上原理:
蟻群優化演算法
蟻群優化演算法作為一種全域性最優化搜素方法,同遺傳演算法一樣,靈感都 於自然界,並有良好的搜素效能。然而,從數學的角度來理解分析它們的工作方式是很難的,因為這些演算法都具有很複雜的隨機過程。aco演算法的過程具有一定的隨機性,這就要求初始化螞蟻的數量和更新資訊素的次數必須足夠的多,只有這樣才能最終收...
蟻群演算法詳解
今天開始學習優化演算法,話說蟻群演算法是之前看過的,唉,今天一看都看不懂了,蟻群演算法的思想我就不說了,現在來理解一下這個 吧!該 的主要思想是 for 迭代次數 for 螞蟻個數 每個螞蟻完整的走完一遍 每個點訪問一次 end更新資訊素 end然後根據資訊素的多少找出一條路徑來 tsp的蟻群演算法...
ACO蟻群演算法
aco蟻群演算法 總結一下 在蟻群演算法中有兩個比較重要的引數資訊素濃度a,距離d,主要依靠這兩個特徵引數來推算出蟻群去往地點的概率。在比較早的時候成功解決了tsp旅行商的問題 在後面的例子中也會以這個例子 要用演算法去模擬螞蟻的這種行為,關鍵在於資訊素的在演算法中的設計,以及路徑中資訊素濃度越大的...