MATLAB机器学习系列-12:蚁群算法优化原理及其matlab实现
蟻群算法原理
概述
- 蟻群算法(Ant Colony Algorithm, ACA)由Marco Dorigo于1992年在他的博士論文中首次提出,該算法模擬了自然界中螞蟻的覓食行為。
- 螞蟻在尋找食物源時,會在其經(jīng)過的路徑上釋放一種信息素,并能夠感知其它螞蟻釋放的信息素。 信息素濃度的大小表征路徑的遠(yuǎn)近 , 信息素濃度越高 , 表示對應(yīng)的路徑距離越短。
- 通常,螞蟻會以較大的概率優(yōu)先選擇信息素濃度較高的路徑,并釋放一定量的信息素,以增強(qiáng)該條路徑上的信息素濃度,這樣,會形成一個正反饋。最終,螞蟻能夠找到一條從巢穴到食物源的最佳路徑,即距離最短。
- 值得一提的是,生物學(xué)家同時發(fā)現(xiàn), 路徑上的信息素濃度會隨著時間的推進(jìn)而逐漸衰減。
- 將蟻群算法應(yīng)用于解決優(yōu)化問題,其基本思路為: 用螞蟻的行走路徑表示待優(yōu)化問題的可行解 , 整個螞蟻群體的所有路徑構(gòu)成待優(yōu)化問題的解空間。路徑較短的螞蟻釋放的信息素量較多,隨著時間的推進(jìn),較短的路徑上累積的信息素濃度逐漸增高,選擇該路徑的螞蟻個數(shù)也愈來愈多。最終,整個螞蟻會在正反饋的作用下集中到最佳的路徑上,此時對應(yīng)的便是待優(yōu)化問題的最優(yōu)解。
-數(shù)學(xué)公式原理如圖
allow表示沒有訪問過的城市
模型
蟻群算法的特點
- 采用正反饋機(jī)制,使得搜索過程不斷收斂,最終逼近于最優(yōu)解;
- 每個個體可以通過釋放信息素來改變周圍的環(huán)境,且每個個體能夠感知圍環(huán)境的實時變化,個體間通過環(huán)境進(jìn)行間接地通訊;
- 搜索過程采用分布式計算方式,多個個體同時進(jìn)行并行計算,大大提高了算法的計算能力和運(yùn)行效率;
- 啟發(fā)式的概率搜索方式,不容易陷入局部最優(yōu),易于尋找到全局最優(yōu)解。
MATLAB實現(xiàn)
算例 旅行商問題
重點函數(shù)解讀
ismember
格式 k = ismember(a,S) %當(dāng)a中元素屬于S時,k取1,否則,k取0。
k = ismember(A,S,‘rows’) %A、S有相同的列,返回行相同k取1,不相同取0的列向量。
~ 取反
cumsum
對數(shù)組計算累計求和。如果A是一個向量,函數(shù)返回一個長度相同的向量,其中的元素是原向量的累積和。如果A是一個矩陣,則將每一列當(dāng)做一個向量進(jìn)行計算,最后返回與A大小相同的矩陣。如果A是一個多維數(shù)組,函數(shù)對第一個長度不為1的維度進(jìn)行計算。B=cumsum(A,dim)沿著dim指定的維度返回元素的累積和。
num2str
把數(shù)字轉(zhuǎn)換為字符串
text
text(x,y,‘string’)將用引號括起來的字符串添加到點(x,y) x和y必須是類的個數(shù)所指定的位置
算例開始
第一步:清空環(huán)境變量
第二步:導(dǎo)入數(shù)據(jù)
%% II. 導(dǎo)入數(shù)據(jù) load citys_data.mat一共有31個樣本,代表31個城市,每個城市有2維數(shù)據(jù),橫縱坐標(biāo)
第三步:計算城市間相互距離,
n = size(citys,1);%n=31 D = zeros(n,n);%因為是計算兩兩之間的距離,所以矩陣為31*31 for i = 1:nfor j = 1:nif i ~= jD(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));elseD(i,j) = 1e-4; %對角矩陣 距離為0,我將對角矩陣賦值一個很小的距離,不影響計算。因為前文圖中公式里有距離的倒數(shù) endend end第四步:初始化參數(shù)
%% IV. 初始化參數(shù) m = 50; % 螞蟻數(shù)量 alpha = 1; % 信息素重要程度因子 beta = 5; % 啟發(fā)函數(shù)重要程度因子 rho = 0.1; % 信息素?fù)]發(fā)因子 Q = 1; % 常系數(shù) Eta = 1./D; % 啟發(fā)函數(shù) Tau = ones(n,n); % 信息素矩陣 Table = zeros(m,n); % 路徑記錄表 iter = 1; % 迭代次數(shù)初值 iter_max = 200; % 最大迭代次數(shù) Route_best = zeros(iter_max,n); % 各代最佳路徑 Length_best = zeros(iter_max,1); % 各代最佳路徑的長度 Length_ave = zeros(iter_max,1); % 各代路徑的平均長度第五步:迭代
%% V. 迭代尋找最佳路徑 while iter <= iter_max% 隨機(jī)產(chǎn)生各個螞蟻的起點城市start = zeros(m,1);for i = 1:m %遍歷每一個螞蟻temp = randperm(n);%randperm(n)產(chǎn)生1-n的隨機(jī)序列start(i) = temp(1); %起始點賦值endTable(:,1) = start; %% Table路徑記錄表 citys_index = 1:n;% 逐個螞蟻路徑選擇for i = 1:m% 逐個城市路徑選擇for j = 2:ntabu = Table(i,1:(j - 1)); % 已訪問的城市集合(禁忌表)allow_index = ~ismember(citys_index,tabu);%取出未訪問過的城市索引 allow = citys_index(allow_index); % 待訪問的城市集合P = allow;% 計算城市間轉(zhuǎn)移概率for k = 1:length(allow)P(k) = Tau(tabu(end),allow(k))^alpha * Eta(tabu(end),allow(k))^beta;endP = P/sum(P);% 輪盤賭法選擇下一個訪問城市Pc = cumsum(P); target_index = find(Pc >= rand); target = allow(target_index(1));Table(i,j) = target;endend% 計算各個螞蟻的路徑距離Length = zeros(m,1);for i = 1:mRoute = Table(i,:);for j = 1:(n - 1)Length(i) = Length(i) + D(Route(j),Route(j + 1));endLength(i) = Length(i) + D(Route(n),Route(1));end% 計算最短路徑距離及平均距離if iter == 1[min_Length,min_index] = min(Length);Length_best(iter) = min_Length; Length_ave(iter) = mean(Length);Route_best(iter,:) = Table(min_index,:);else[min_Length,min_index] = min(Length);Length_best(iter) = min(Length_best(iter - 1),min_Length);Length_ave(iter) = mean(Length);if Length_best(iter) == min_LengthRoute_best(iter,:) = Table(min_index,:);elseRoute_best(iter,:) = Route_best((iter-1),:);endend% 更新信息素Delta_Tau = zeros(n,n);% 逐個螞蟻計算for i = 1:m% 逐個城市計算for j = 1:(n - 1)Delta_Tau(Table(i,j),Table(i,j+1)) = Delta_Tau(Table(i,j),Table(i,j+1)) + Q/Length(i);endDelta_Tau(Table(i,n),Table(i,1)) = Delta_Tau(Table(i,n),Table(i,1)) + Q/Length(i);endTau = (1-rho) * Tau + Delta_Tau;% 迭代次數(shù)加1,清空路徑記錄表iter = iter + 1;Table = zeros(m,n); end第六步:
%% VI. 結(jié)果顯示 [Shortest_Length,index] = min(Length_best); Shortest_Route = Route_best(index,:); disp(['最短距離:' num2str(Shortest_Length)]); disp(['最短路徑:' num2str([Shortest_Route Shortest_Route(1)])]);%% VII. 繪圖 figure(1) plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...[citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-'); grid on for i = 1:size(citys,1)text(citys(i,1),citys(i,2),[' ' num2str(i)]); end text(citys(Shortest_Route(1),1),citys(Shortest_Route(1),2),' 起點'); text(citys(Shortest_Route(end),1),citys(Shortest_Route(end),2),' 終點'); xlabel('城市位置橫坐標(biāo)') ylabel('城市位置縱坐標(biāo)') title(['蟻群算法優(yōu)化路徑(最短距離:' num2str(Shortest_Length) ')']) figure(2) plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r:') legend('最短距離','平均距離') xlabel('迭代次數(shù)') ylabel('距離') title('各代最短距離與平均距離對比')總結(jié)
以上是生活随笔為你收集整理的MATLAB机器学习系列-12:蚁群算法优化原理及其matlab实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开面包店需要多少钱 很值得创业者们看一看
- 下一篇: matlab人脸追踪,求大神帮助我这个菜