日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

MATLAB机器学习系列-12:蚁群算法优化原理及其matlab实现

發(fā)布時間:2024/9/30 循环神经网络 92 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MATLAB机器学习系列-12:蚁群算法优化原理及其matlab实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

蟻群算法原理

概述

  • 蟻群算法(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)境變量

%% I. 清空環(huán)境變量 clear all clc

第二步:導(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。