人工鱼群算法Matlab实现
人工魚群算法Matlab實現
1 基本思想
? 人工魚群算法是一種基于模擬魚群行為的優化算法,是由李曉磊等在2002年提出的一種新型的尋優算法。在一片水域中,魚生存的數目最多的地方就是本水域中富含營養物質最多的地方,依據這一特點來模仿魚群的覓食等行為,從而實現全局尋優,這就是魚群算法的基本思想。
在魚類的活動中,可以分為覓食行為、聚群行為、追尾行為和隨機行為這四種行為,如何利用簡單有效的方式來構造實現這些行為將是算法實施的主要問題。
? 覓食行為主要就是循著食物多的方向游動的一種行為,在尋優中則是向較優方向進行的迭代方式,如魚群模式中的視覺概念;
在聚群行為中,借鑒的思想對每條人工魚規定了這樣兩個規則:
? ? 1)盡量向鄰近伙伴的中心移動;
? ? 2)避免過分擁擠,這樣就能基本實現人工魚的聚群能力;
? 追尾行為就是一種向臨近的最活躍者追逐的行為,在尋優算法中可以理解為是向附近的最優化伙伴前進的過程;
? 隨機行為就是人工魚在其視野內隨機移動的行為,在尋優算法中這種行為有助于解跳出局部最優。
2 算法剖析
? 假設在一個n維的目標搜索空間中,有N條組成一個群體的人工魚,每天人工魚個體的狀態可表示為向量X=(x1,x2,…,xn)X=(x_1,x_2,…,x_n)X=(x1?,x2?,…,xn?),其中xi(i=1,……n)x_i(i=1,……n)xi?(i=1,……n)為欲尋優的變量:人工魚當前所在位置的食物濃度表示為Y=f(X)Y=f(X)Y=f(X),其中f()f()f()為目標函數;人工魚個體間距離表示為 d=∣∣xi?xj∣∣d=||x_i-x_j||d=∣∣xi??xj?∣∣(這是二范數); visualvisualvisual表示人工魚的感知范圍,stepstepstep為人工魚移動步長,δδδ為擁擠度因子;trynumbertrynumbertrynumber表示人工魚每次覓食最大試探次數。
2.1 覓食行為
? 指魚循著食物多的方向游動的一種行為,人工魚XiX_iXi?在其視野內隨機選擇一個狀態XjX_jXj?,分別計算它們的目標函數值進行比較,如果發現YjY_jYj?比YiY_iYi?優(YjY_jYj?和YiY_iYi?分別為XjX_jXj?和XiX_iXi?的適應度值),則Xi向Xj的方向移動一步;否則,XiX_iXi?繼續在其視野內選擇狀態XjX_jXj?,判斷是否滿足前進條件,反復嘗試trynumbertrynumbertrynumber次后,仍沒有滿足前進條件,則隨機移動一步使XiX_iXi?到達一個新的狀態。表達式如下:
Xj=Xi+rand()?visual(1)X_j=X_i+rand()*visual \tag{1}Xj?=Xi?+rand()?visual(1)
Xnext=Xi+rand()?step?Xj?Xi∣∣Xj?Xi∣∣(2)X_{next}=X_i+rand()*step*\frac{X_j-X_i}{\left | \left | X_j-X_i \right | \right |}\tag{2}Xnext?=Xi?+rand()?step?∣∣Xj??Xi?∣∣Xj??Xi??(2)
Xnext=Xi+rand()?step(3)X_{next}=X_i+rand()*step \tag{3}Xnext?=Xi?+rand()?step(3)
? 其中rand()是介于0和1之間的隨機數。
人工魚的視覺描述人工魚的視覺描述人工魚的視覺描述
? 框架圖如下所示:
偽代碼段如下:
2.2 聚群行為
? 魚在游動過程中為了保證自身的生存和躲避危害會自然地聚集成群 。人工魚XiX_iXi?搜索其視野內(dij<visuald_{ij}<visualdij?<visual)的伙伴數目nfn_fnf?及中心位置XcX_cXc?,若Yc/nf<δYiY_c/n_f< δY_iYc?/nf?<δYi?(求極小值時使用小于號,在求極大值時則相反;YcY_cYc?和YiY_iYi?分別為XcX_cXc?和XiX_iXi?的適應度值),表明伙伴中心位置狀態較優且不太擁擠,則XiX_iXi?朝伙伴的中心位置移動一步,否則執行覓食行為;
? 框架圖如下所示:
偽代碼段如下:
2.3 追尾行為
? 指魚向其視野區域內的最優方向移動的一種行為。人工魚XiX_iXi?搜索其視野內(dij<visuald_{ij}<visualdij?<visual)適應度最高的個體XjX_jXj?,其適應度值為YjY_jYj?,并探索人工魚XjX_jXj?視野內的伙伴數目nfn_fnf?,若Yj/nf<δYiY_j/n_f< δY_iYj?/nf?<δYi?,表明XjX_jXj?狀態較優且不太擁擠,則XiX_iXi?朝XjX_jXj?位置移動一步,否則執行覓食行為;
? 框架圖如下所示:
偽代碼段如下:
2.4 算法總述
? 綜上所述,算法在運算過程中,會同時進行聚群和追尾行為。而覓食行為屬于這兩種行為中發現聚群對象或者追尾對象附近擁擠度過大時,人工魚選擇的行為方式,若在覓食過程中,未發現比自身適應度高的人工魚,則按步長step隨機移動。最后對聚群行為和追尾行為得到的適應度值進行比較,選擇優秀的人工魚作為下一代的個體。其總框架圖如下:
3 分析擁擠度因子δδδ
3.1 擁擠度因子的取值
? 在求極小值問題中:δ=αnmax,α∈(0,1]δ=αn_{max}, α∈(0,1]δ=αnmax?,α∈(0,1]
? 在求極大值問題中:δ=1αnmax,α∈(0,1]δ=\frac{1}{αn_{max}},α∈(0,1]δ=αnmax?1?,α∈(0,1]
? 其中ααα為極值接近水平,nmaxn_{max}nmax?為期望在該鄰域內聚集的最大人工魚數目。
3.2 擁擠度因子的作用機理
? 對追尾行為的描述
? 圖中af0為人工魚af1-5在各自視野內的最優人工魚,其實物濃度為YjY_jYj?,C1為以af0為圓心,以視野范圍為半徑的圓,即能探知af0的最遠距離,人工魚越靠近af0,狀態越優。
? 求極大值情況下:當δnf≤1δn_f\leq 1δnf?≤1時,所有人工魚af1-5都執行追尾行為,向af0游動;
δ=1αnmaxδ=\frac{1}{αn_{max}}δ=αnmax?1?
δnf=nfαnmax≤1δn_f =\frac{n_f}{αn_{max}}\leq 1δnf?=αnmax?nf??≤1
? 當ααα=1的時候,可以明顯看出來nf≤nmaxn_f \leq n_{max}nf?≤nmax?,即說明人工魚視野范圍內不擁擠。
? 當δnf>1δn_f >1δnf?>1時,若C2的食物濃度為Yjδnf\frac{Y_j}{δn_f }δnf?Yj??的等濃度食物圈,則C2與C1間的人工魚af1、af2、af3執行追尾行動,向af0游動,人工魚af4、af5執行覓食行為。此時δnf 越大執行追尾行動的人工魚越少,反之越多。
3.2 擁擠度因子的影響
? 以極大值為例(極小值的情況正好和極大值相反), δδδ越大,表明允許的擁擠程度越小,人工魚擺脫局部最優的能力越強;但是收斂的速度會有所減緩,這主要因為人工魚在逼近極值的同時,會因避免過分擁擠而隨機走開或者受其它人工魚的排斥作用,不能精確逼近極值點。可見,δδδ的引入避免了人工魚過度擁擠而陷入局部極值,另一方面,該參數會使得位于極值點附近的人工魚之間存在相互排斥的影響,而難以向極值點精確逼近,所以,對于某些局部極值不是很嚴重的具體問題,可以忽略擁擠的因素,從而在簡化算法的同時也加快了算法的收斂速度和提高結果的精確程度。
4 算法實現
%sum(sin(x)./x) 極小值 clear all; close all; clc;Visual = 25; %人工魚的感知距離 Step = 3; %人工魚的移動最大步長 N = 30; %人工魚的數量 dim=10; %人工魚維度 Try_number = 50;%迭代的最大次數 delta=27; %擁擠度因子%測試函數 f=@(x) sum(x.^2); ub=100;%邊界上限 lb=-100;%邊界下限d = [];%存儲50個狀態下的目標函數值; Iteration = 1; % Max_iteration = 500;%迭代次數%初始化人工魚種群 x=lb+rand(N,dim).*(ub-lb);%計算10個初始狀態下的適應度值; for i = 1:Nfitness_fish(i) = f(x(i,:)); end [best_fitness,I] = min(fitness_fish); % 求出初始狀態下的最優適應度; best_x = x(I,:); % 最優人工魚;while Iteration<=Max_iterationfor i = 1:N%% 聚群行為nf_swarm=0;Xc=0;label_swarm =0; %群聚行為發生標志%確定視野范圍內的伙伴數目與中心位置for j = 1:N if norm(x(j,:)-x(i,:))<Visualnf_swarm = nf_swarm+1; %統計在感知范圍內的魚數量 Xc = Xc+x(j,:); %將感知范圍內的魚進行累加endendXc=Xc-x(i,:); %需要去除本身;因為在 一開始計算時,i=j,把中心的魚也進行了一次計算nf_swarm=nf_swarm-1;Xc = Xc/nf_swarm; %此時Xc表示視野范圍其他伙伴的中心位置; %判斷中心位置是否擁擠if (f(Xc)/nf_swarm < delta*f(x(i,:))) && (f(Xc)<f(x(i,:))) x_swarm=x(i,:)+rand*Step.*(Xc-x(i,:))./norm(Xc-x(i,:)); %邊界處理ub_flag=x_swarm>ub;lb_flag=x_swarm<lb;x_swarm=(x_swarm.*(~(ub_flag+lb_flag)))+ub.*ub_flag+lb.*lb_flag; x_swarm_fitness=f(x_swarm);else%覓食行為label_prey =0; %判斷覓食行為是否找到優于當前的狀態for j = 1:Try_number%隨機搜索一個狀態x_prey_rand = x(i,:)+Visual.*(-1+2.*rand(1,dim));ub_flag2=x_prey_rand>ub;lb_flag2=x_prey_rand<lb;x_prey_rand=(x_prey_rand.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; %判斷搜索到的狀態是否比原來的好if f(x(i,:))>f(x_prey_rand)x_swarm = x(i,:)+rand*Step.*(x_prey_rand-x(i,:))./norm(x_prey_rand-x(i,:));ub_flag2=x_swarm>ub;lb_flag2=x_swarm<lb;x_swarm=(x_swarm.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; x_swarm_fitness=f(x_swarm);label_prey =1;break;endend%隨機行為if label_prey==0x_swarm = x(i,:)+Step*(-1+2*rand(1,dim));ub_flag2=x_swarm>ub;lb_flag2=x_swarm<lb;x_swarm=(x_swarm.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; x_swarm_fitness=f(x_swarm);endend%% 追尾行為fitness_follow = inf; label_follow =0;%追尾行為發生標記%搜索人工魚Xi視野范圍內的最高適應度個體Xjfor j = 1:N if (norm(x(j,:)-x(i,:))<Visual) && (f(x(j,:))<fitness_follow) best_pos = x(j,:); fitness_follow = f(x(j,:)); endend%搜索人工魚Xj視野范圍內的伙伴數量nf_follow=0;for j = 1:N if norm(x(j,:)-best_pos)<Visual nf_follow=nf_follow+1;endendnf_follow=nf_follow-1;%去掉他本身%判斷人工魚Xj位置是否擁擠if (fitness_follow/nf_follow)<delta*f(x(i,:)) && (fitness_follow<f(x(i,:))) x_follow = x(i,:)+rand*Step.*(best_pos-x(i,:))./norm(best_pos-x(i,:));%邊界判定ub_flag2=x_follow>ub;lb_flag2=x_follow<lb;x_follow=(x_follow.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; label_follow =1;x_follow_fitness=f(x_follow);else%覓食行為label_prey =0; %判斷覓食行為是否找到優于當前的狀態for j = 1:Try_number%隨機搜索一個狀態x_prey_rand = x(i,:)+Visual.*(-1+2.*rand(1,dim));ub_flag2=x_prey_rand>ub;lb_flag2=x_prey_rand<lb;x_prey_rand=(x_prey_rand.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; %判斷搜索到的狀態是否比原來的好if f(x(i,:))>f(x_prey_rand)x_follow = x(i,:)+rand*Step.*(x_prey_rand-x(i,:))./norm(x_prey_rand-x(i,:));ub_flag2=x_follow>ub;lb_flag2=x_follow<lb;x_follow=(x_follow.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; x_follow_fitness=f(x_follow);label_prey =1;break;endend%隨機行為if label_prey==0x_follow = x(i,:)+Step*(-1+2*rand(1,dim));ub_flag2=x_follow>ub;lb_flag2=x_follow<lb;x_follow=(x_follow.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; x_follow_fitness=f(x_follow);endend% 兩種行為找最優if x_follow_fitness<x_swarm_fitnessx(i,:)=x_follow;elsex(i,:)=x_swarm;endend%% 更新信息for i = 1:Nif (f(x(i,:))<best_fitness)best_fitness = f(x(i,:));best_x = x(i,:);endendConvergence_curve(Iteration)=best_fitness;Iteration = Iteration+1;if mod(Iteration,50)==0display(['迭代次數:',num2str(Iteration),'最優適應度:',num2str(best_fitness)]);display(['最優人工魚:',num2str(best_x)]);end endfigure('Position',[284 214 660 290]) subplot(1,2,1); x=-100:1:100; y=x; L=length(x); for i=1:Lfor j=1:LF(i,j)=x(i).^2+y(j).^2;end end surfc(x,y,F,'LineStyle','none'); title('Test function') xlabel('x_1'); ylabel('x_2'); zlabel(['sum','( x_1 , x_2 )']) grid off subplot(1,2,2); semilogy(Convergence_curve,'Color','b') title('Convergence curve') xlabel('Iteration'); ylabel('Best fitness'); axis tight grid off box on結果如下:
總結
以上是生活随笔為你收集整理的人工鱼群算法Matlab实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Leetcode][第99题][JAV
- 下一篇: Web前端-HTML基础