认识蚁群算法
好像是看羅胖的羅輯思維,看到過一種說法,越是準入門檻高的,難以取代的行業,所需的工具是越簡單的。攝影師需要昂貴的鏡頭,而畫家卻只需要簡單的紙筆,盡管照片比畫逼真得多,但是卻無法取代繪畫的地位,而且通常優秀的射影作品的價值遠遠比不上優秀繪畫作品的價值。在CS行業中也一樣,寫代碼需要各種IDE,硬件環境,但是算法卻早在計算機誕生之前就有了,應該說想要解決問題就會有算法,有了算法才能計算。所以,只會函數調用調參是不夠的,要自己寫代碼,有自己的風格,有自己的想法,自己的算法。我也剛開始學習算法,開始啃《算法導論》,算是轉行吧,學習圖像處理也需要各種算法,今天就先研究與自己做的圖像配準有關的蟻群算法。
很早就宣揚說21世紀是生物科學的世紀,沒想到目前確是互聯網的世紀。但互聯網中確實運用了很多生物的思想。比如大熱的神經網絡,就是利用加權網絡模擬神經和突觸。在算法中也一樣,遺傳(進化)算法借鑒生物進化論,將問題模擬成一個生物進化的過程,通過復制、交叉、突變等操作產生下一代的解。旅行商問題TSP(Travel Salesperson Problem)中通常運用遺傳算法求解,這在看算法導論的時候再好好研究。蟻群算法則是模擬螞蟻覓食的過程,在1991年由意大利學者Marco Dorigo提出。我們就看看這個算法到底是怎么模擬的。
在蟻群算法中,一個關鍵詞是信息素,它是一種激素,螞蟻找到食物回家時釋放關于食物的信息素,在出去找食物時在路徑上留下關于家的信息素,濃度隨著時間逐漸降低(更新機制)。但信息素有正反饋性,它會吸引附近的螞蟻來到這條路徑(選擇機制),從而釋放更多的信息素(更新機制)。這個選擇的過程稱為螞蟻的自催化行為。值得一提的是對單個螞蟻來說,是不存在所謂的最優路徑的,螞蟻根據概率隨機選擇一條路徑,但蟻群會互相通信、協同工作(協調機制),會在客觀上找到了最優路徑,這就是群體智能。為了防止螞蟻都選擇當前信息素濃度最高的路徑,只得到局部最優解,總有個別螞蟻走向其他路徑,從而跳出最優解,這就是出錯機制。可以通過一個H5實驗直觀地觀察一下,在這里。
以TSP問題為例,對蟻群算法建模。除了城市的數量,蟻群的數量,還有很多數據,這就凸顯了數據結構的重要性。
說一下我理解的蟻群算法的整個流程。第一步當然是初始化,對每條邊的信息素濃度初始化為常數,信息素改變量初始化為0。然后把螞蟻分散到各個城市,他們依次開始周游。我們把從當前城市到下一個城市的概率稱為轉移概率,通過轉移概率計算,轉移概率綜合考慮了信息素的吸引力和對城市間距離的衡量,權重通過、體現。每到過一個城市,會在禁忌表中添加該點,防止重復達到同一個城市。當該螞蟻完成一次周游,記錄這次周游的路徑總長度,這里考慮螞蟻一次周游釋放的信息素總量是一定的,所以均勻分布在每次的轉移路徑中,這部分新增的信息素和之前的信息素殘留構成了下次迭代的初始信息素濃度。迭代是指所有的螞蟻都完成了周游,每次迭代過程中每只螞蟻計算轉移概率時認為信息素濃度暫時不變,只是當所有螞蟻周游完即下一次迭代開始時才對信息素濃度進行更新,更新時會對各個螞蟻走過的路徑累加計算信息素濃度。這樣,當迭代到一定次數,因為某一條路徑信息素濃度足夠高,會進行收斂,從而找到最優的路徑。
從公式中可以得到更加清楚的認識:
$$\Delta \tau _{ij}^k = \frac{Q}{{\sum {{L_k}} }}{L_{ij}}$$ ??? 公式1
Q為信息素質量系數,是一個正的常數,表示螞蟻一次釋放的信息素絕對質量。分母表示螞蟻k在本次周游中所走的路徑總長度。Lij表示轉移路徑ij得到的信息素濃度。
$${\tau _{ij}}(t + n) = (1 - \rho ) \cdot {\tau _{ij}}(t) + \Delta {\tau _{ij}}$$ ????? 公式2
這個是每次迭代時信息素濃度的更新公式。綜合考慮了原來的信息素濃度殘留和剛才式1求得的新增的信息素濃度。
$$p_{ij}^k = \frac{{{\tau _{ij}}^\alpha \eta _{ij}^\beta }}{{\sum\limits_{j \in \Lambda } {\tau _{ij}^\alpha \eta _{ij}^\beta } }}$$ ??? 公式3
公式3是概率轉移公式。得到概率之后按照輪盤賭的方式選擇下一步的城市。只需要知道輪盤賭是一種隨機性的選擇方式就可以了當然還是概率大的更容易被選中。之后可以寫文章研究一下。
下面是matlab代碼:來自https://blog.csdn.net/longxinghaofeng/article/details/77740480
%蟻群算法求解TSP問題的matlab程序 clear all close all clc%初始化蟻群 m=31;%蟻群中螞蟻的數量,當m接近或等于城市個數n時,本算法可以在最少的迭代次數內找到最優解 C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;4196 1004;4312 790;4386 570;3007 1970;2562 1756;2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2367;3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;2370 2975];%城市的坐標矩陣 Nc_max=200;%最大循環次數,即算法迭代的次數,亦即螞蟻出動的撥數(每撥螞蟻的數量當然都是m) alpha=1;%螞蟻在運動過程中所積累信息(即信息素)在螞蟻選擇路徑時的相對重要程度,alpha過大時,算法迭代到一定代數后將出現停滯現象 beta=5;%啟發式因子在螞蟻選擇路徑時的相對重要程度 rho=0.5;%0<rho<1,表示路徑上信息素的衰減系數(亦稱揮發系數、蒸發系數),1-rho表示信息素的持久性系數 Q=100;%螞蟻釋放的信息素量,對本算法的性能影響不大%變量初始化 n=size(C,1);%表示TSP問題的規模,亦即城市的數量 D=ones(n,n);%表示城市完全地圖的賦權鄰接矩陣,記錄城市之間的距離 for i=1:nfor j=1:nif i<jD(i,j)=sqrt((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2);endD(j,i)=D(i,j);end end eta=1./D;%啟發式因子,這里設為城市之間距離的倒數 pheromone=ones(n,n);%信息素矩陣,這里假設任何兩個城市之間路徑上的初始信息素都為1 tabu_list=zeros(m,n);%禁忌表,記錄螞蟻已經走過的城市,螞蟻在本次循環中不能再經過這些城市。當本次循環結束后,禁忌表被用來計算螞蟻當前所建立的解決方案,即經過的路徑和路徑的長度 Nc=0;%循環次數計數器 routh_best=zeros(Nc_max,n);%各次循環的最短路徑 length_best=ones(Nc_max,1);%各次循環最短路徑的長度 length_average=ones(Nc_max,1);%各次循環所有路徑的平均長度while Nc<Nc_max%將m只螞蟻放在n個城市上rand_position=[];for i=1:ceil(m/n) %朝正無窮方向取整 螞蟻數量/城市數量rand_position=[rand_position,randperm(n)];endtabu_list(:,1)=(rand_position(1:m));%將螞蟻放在城市上之后的禁忌表,第i行表示第i只螞蟻,第i行第一列元素表示第i只螞蟻所在的初始城市%m只螞蟻按概率函數選擇下一座城市,在本次循環中完成各自的周游for j=2:nfor i=1:mcity_visited=tabu_list(i,1:(j-1));%已訪問的城市city_remained=zeros(1,(n-j+1));%待訪問的城市probability=city_remained;%待訪問城市的訪問概率cr=1;%for循環用于求待訪問的城市。比如如果城市個數是5,而已訪問的城市city_visited=[2 4],則經過此for循環后city_remanied=[1 3 5]for k=1:nif length(find(city_visited==k))==0city_remained(cr)=k;cr=cr+1;endend%for循環計算待訪問城市的訪問概率分布,此概率和兩個參數有關,一是螞蟻當前所在城市(即city_visited(end))和待訪問城市(即city_remained(k))路徑上的信息素,一是這兩者之間的啟發因子即距離的倒數 for k=1:length(city_remained)probability(k)=(pheromone(city_visited(end),city_remained(k)))^alpha*(eta(city_visited(end),city_remained(k)))^beta;endprobability=probability/sum(probability);%按概率選取下一個要訪問的城市pcum=cumsum(probability);%返回各列的累加值select=find(pcum>=rand);to_visit=city_remained(select(1));tabu_list(i,j)=to_visit;endendif Nc>0tabu_list(1,:)=routh_best(Nc,:);%將上一代的最優路徑(最優解)保留下來,保證上一代中的最適應個體的信息不會丟失end%記錄本次循環的最佳路線total_length=zeros(m,1);%m只螞蟻在本次循環中分別所走過的路徑長度for i=1:mr=tabu_list(i,:);%取出第i只螞蟻在本次循環中所走的路徑for j=1:(n-1)total_length(i)=total_length(i)+D(r(j),r(j+1));%第i只螞蟻本次循環中從起點城市到終點城市所走過的路徑長度endtotal_length(i)=total_length(i)+D(r(1),r(n));%最終得到第i只螞蟻在本次循環中所走過的路徑長度endlength_best(Nc+1)=min(total_length);%把m只螞蟻在本次循環中所走路徑長度的最小值作為本次循環中最短路徑的長度position=find(total_length==length_best(Nc+1));%找到最短路徑的位置,即最短路徑是第幾只螞蟻或哪幾只螞蟻走出來的routh_best(Nc+1,:)=tabu_list(position(1),:);%把第一個走出最短路徑的螞蟻在本次循環中所走的路徑作為本次循環中的最優路徑length_average(Nc+1)=mean(total_length);%計算本次循環中m只螞蟻所走路徑的平均長度Nc=Nc+1%更新信息素delta_pheromone=zeros(n,n);for i=1:mfor j=1:(n-1)delta_pheromone(tabu_list(i,j),tabu_list(i,j+1))=delta_pheromone(tabu_list(i,j),tabu_list(i,j+1))+Q/total_length(i);%total_length(i)為第i只螞蟻在本次循環中所走過的路徑長度(蟻周系統區別于蟻密系統和蟻量系統的地方)enddelta_pheromone(tabu_list(i,n),tabu_list(i,1))=delta_pheromone(tabu_list(i,n),tabu_list(i,1))+Q/total_length(i);%至此把第i只螞蟻在本次循環中在所有路徑上釋放的信息素已經累加上去end%至此把m只螞蟻在本次循環中在所有路徑上釋放的信息素已經累加上去pheromone=(1-rho).*pheromone+delta_pheromone;%本次循環后所有路徑上的信息素%禁忌表清零,準備下一次循環,螞蟻在下一次循環中又可以自由地進行選擇tabu_list=zeros(m,n); end%輸出結果,繪制圖形 position=find(length_best==min(length_best)); shortest_path=routh_best(position(1),:) shortest_length=length_best(position(1)) %繪制最短路徑 figure(1) set(gcf,'Name','Ant Colony Optimization——Figure of shortest_path','Color','r') N=length(shortest_path); scatter(C(:,1),C(:,2),50,'filled'); hold on plot([C(shortest_path(1),1),C(shortest_path(N),1)],[C(shortest_path(1),2),C(shortest_path(N),2)]) set(gca,'Color','g') hold on for i=2:Nplot([C(shortest_path(i-1),1),C(shortest_path(i),1)],[C(shortest_path(i-1),2),C(shortest_path(i),2)])hold on end %繪制每次循環最短路徑長度和平均路徑長度 figure(2) set(gcf,'Name','Ant Colony Optimization——Figure of length_best and length_average','Color','r') plot(length_best,'r') set(gca,'Color','g') hold on plot(length_average,'k')這是結果找到的最佳路線圖。原網址的代碼寫得很好,注釋也很詳細,就是圖的配色有一點辣眼睛。
Reference:
1.https://blog.csdn.net/lzhf1122/article/details/72668977
2.https://blog.csdn.net/zhushuai1221/article/details/51076156 ACO應用、問題、趨勢
3.https://blog.csdn.net/wang_Number_1/article/details/52467567
4.https://www.cnblogs.com/Leo_wl/p/5665715.html
5.https://www.cnblogs.com/tao-alex/p/6094483.html? 表中的最后一列不理解
總結
- 上一篇: windows+caffe下对CIFAR
- 下一篇: java之代理设计模式