【优秀作业】人工鱼群优化算法
人工魚群優化算法
一、概述
人工魚群算法(Artificial Fish Swarm Algorithm,簡稱AFSA)是受魚群行為的啟發,由國內李曉磊博士于2002年提出的一種基于動物行為的群體智能優化算法,是行為主義人工智能的一個典型應用,這種算法源于魚群的覓食行為。
在一片水域中,魚往往能自行或尾隨其它魚,找到營養物質多的地方,因而魚生存數目最多的地方一般就是本水域中營養物質最多的地方。人工魚群算法根據這一特點,通過構造人工魚來模仿魚群的覓食、聚群、追尾及隨機行為,從而實現尋優。
如何利用簡便有效的方式來構造并實現這些行為將是算法實施的主要問題。
覓食行為主要認為就是循著食物多的方向游動的一種行為,在尋優算法中則是向較優方向前進的迭代方式。
在聚群行為中,為了保證生存和躲避危害,魚會自然地聚集成群。魚聚群時所遵守的規則有 3 條:
- 分隔規則,盡量避免與臨近伙伴過于擁擠。
- 對準規則,盡量與臨近伙伴的平均方向一致。
- 內聚規則,盡量朝臨近伙伴的中心移動。
追尾行為就是一種向臨近的最活躍者追逐的行為,在尋優算法中可以理解為是向附近的最優伙伴前進的過程。
二、人工魚群算法
人工魚個體的狀態可表示為向量X=(x1,x2,?,xn)X=(x_1,x_2,\cdots,x_n)X=(x1?,x2?,?,xn?),其中xi,i=1,2,?,nx_i,i=1,2,\cdots,nxi?,i=1,2,?,n為欲尋優的變量,人工魚群當前所在位置的食物濃度表示為Y=f(X)Y=f(X)Y=f(X),其中YYY為目標函數值,人工魚個體之間的距離表示為dij=∥Xi?Xj∥d_{ij}= \parallel X_i-X_j \paralleldij?=∥Xi??Xj?∥;VisualVisualVisual表示人工魚的感知距離;stepstepstep表示人工魚移動的最大步長;δ\deltaδ為擁擠度因子;try?numbertry-numbertry?number為覓食行為嘗試的最大次數。
人工魚個體下一個狀態的位置定義為:
Xnext=Xi+step×rand∥Xj?Xi∥(Xj?Xi)X_{next} = X_i + \frac{step \times rand}{\parallel X_j-X_i \parallel}(X_j - X_i) Xnext?=Xi?+∥Xj??Xi?∥step×rand?(Xj??Xi?)
其中randrandrand是0-1之間的隨機數,XjX_jXj?是當前人工魚視野范圍內的一個位置。XjX_jXj?由接下來的人工魚的4種基本行為算法描述定義。
(1)覓食行為(Prey)
覓食行為是魚類通過使用視覺來感受認知水中的食物濃度YiY_iYi?來靠近食物的一種行為。
設人工魚當前狀態為XiX_iXi?,在其感知范圍內隨機選擇一個狀態XjX_jXj?,如果在求極大問題中,Yi<YjY_i < Y_jYi?<Yj?(或在求極小問題中,Yi>YjY_i > Y_jYi?>Yj?,因為極大和極小問題可以互相轉換,所以以下均以極大問題討論),則向該方向前進一步:
Xnext=Xi+step×rand∥Xj?Xi∥(Xj?Xi)X_{next} = X_i + \frac{step \times rand}{\parallel X_j-X_i \parallel}(X_j - X_i) Xnext?=Xi?+∥Xj??Xi?∥step×rand?(Xj??Xi?)
反之,再重新隨機選擇狀態XjX_jXj?,判斷是否滿足前進條件;反復try?numbertry-numbertry?number次后,如果仍不滿足前進條件,則隨機移動一步。
(2)聚群行為(Swarm)
魚類會通過靠近群體來避開危險。這也是魚類為了保證群體的生存和躲避傷害形成的生活習性。與鳥群類似,魚群的形成不需要首領,所以在人工魚群算法中對人工魚有兩條規定:
- 人工魚盡量向視野范圍$Visual$內的小伙伴的中心位置移動。
- 人工魚如果發現一個位置太過擁擠就不會向這個位置靠近。
設人工魚當前狀態為XiX_iXi?,探索當前鄰域內(即dij<Visuald_{ij}<Visualdij?<Visual)的伙伴數目nfn_fnf?及中心位置XcX_cXc?,如果1nfYc>δYi\frac{1}{n_f}Y_c>\delta Y_inf?1?Yc?>δYi?,表明伙伴中心有較多的食物并且不太擁擠,則朝伙伴的中心位置方向前進一步:
Xnext=Xi+step×rand∥Xc?Xi∥(Xc?Xi)X_{next}=X_i + \frac{step\times rand}{\parallel X_c-X_i \parallel}(X_c-X_i ) Xnext?=Xi?+∥Xc??Xi?∥step×rand?(Xc??Xi?)
否則執行覓食行為。
(3)追尾行為(Follow)
當魚類尋找食物時,魚群中的一條或多條魚找到了食物,其它魚類會通過跟隨這些魚來找到食物,這便是追尾行為。
設人工魚當前狀態為XiX_iXi?,探索當前鄰域內(即dij<Visuald_{ij}<Visualdij?<Visual)的伙伴數目nfn_fnf?及伙伴中YmaxY_{max}Ymax?為最大的伙伴XmaxX_{max}Xmax?,如果1nfYmax>δYi\frac{1}{n_f} Y_{max}>\delta Y_inf?1?Ymax?>δYi?,表明伙伴XmaxX_{max}Xmax?的狀態具有較高的食物濃度并且其周圍不太擁擠,則朝伙伴XmaxX_{max}Xmax?的方向前進一步:
Xnext=Xi+step×rand∥Xmax?Xi∥(Xmax?Xi)X_{next}=X_{i} + \frac{step \times rand}{\parallel X_{max}-X_i \parallel}(X_{max} - X_i) Xnext?=Xi?+∥Xmax??Xi?∥step×rand?(Xmax??Xi?)
否則執行覓食行為。
(4)隨機行為
隨機行為的實現較簡單,就是在視野中選擇一個狀態,然后向該方向移動,其實,它是覓食行為的一個缺省行為,即XiX_iXi?的下一個位置為:
Xnext=Xi+(2×rand(1,length(Xi))?1)×VisualX_{next}=X_i+(2\times rand(1,length(X_{i}))-1)\times Visual Xnext?=Xi?+(2×rand(1,length(Xi?))?1)×Visual
(5)行為選擇
這是魚類的生存習慣,反映出了魚類的自主行為。在人工魚群算法中,覓食行為奠定了算法的收斂基礎,聚群行為增強了算法收斂的穩定性,追尾行為增強了算法收斂的快速性與全局性,行為選擇策略則是為算法收斂的速度與穩定性提供了保障。
行為選擇策略:根據所要解決的問題性質,對人工魚當前所處的環境進行評價,從而選擇一種行為。如較常用的評價方法就是選擇各行為中使得向最優方向前進最大的行為,也就是各行為中使得人工魚的下一個狀態最優的行為,如果沒有能使下一狀態優于當前狀態的行為,則采取隨機行為。
三、基于人工魚群算法的一元非線性函數尋優
一元非線性函數為:
f(x)=xsin?(10πx)+2.0,x∈[?1,2]f(x) = x\sin(10\pi x)+2.0,x\in[-1,2] f(x)=xsin(10πx)+2.0,x∈[?1,2]
我們尋找max(f(x))max(f(x))max(f(x))。
本案例人工魚數為100,感知距離為1,最大迭代次數為50,擁擠度因子為0.618,覓食最大試探次數為100,移動步長為0.1。
創建初始人工魚群的代碼如下:
function X=Init(Nfish,FieldDR) %輸入: % Nfish 魚群大小 % FieldDR 魚的活動范圍 %輸出: % X 產生的初始人工魚群Nvar = size(FieldDR,2);X = zeros(Nfish,Nvar);for i=1:NfishX(i,:) = FieldDR(1,:)+(FieldDR(2,:)-FieldDR(1,:)).*rand(1,Nvar);end end目標函數(食物濃度函數)代碼如下:
function [Y] = FoodConsistence(X)Y = X.*sin(10*pi.*X)+2; end距離函數代碼如下:
function D = Dist(Xi,X) %計算第i條魚與所有魚的位置,包括本身。col=size(X,1);D=zeros(1,col);for j=1:colD(j) = norm(Xi-X(j,:));end end覓食行為的代碼如下:
function [Xnext,Ynext] = Prey(Xi,ii,visual,step,try_number,FieldDR,lastY) %覓食行為 %輸入: %Xi 當前人工魚的位置 %ii 當前人工魚的序號 %visual 感知范圍 %step 最大移動步長 %try_number 最大嘗試次數 %FieldDR 各個數的上下限 %lastY 上次的各人工魚位置的食物濃度 %輸出: %Xnext Xi人工魚的下一個位置 %Ynext Xi人工魚的下一個位置的食物濃度Xnext = [];Yi = lastY(ii);for i=1:try_numberXj = Xi+(2*rand(1,length(Xi))-1)*visual;Yj = FoodConsistence(Xj);if Yi<YjXnext = Xi+rand*step*(Xj-Xi)/norm(Xj-Xi);for k=1:length(Xnext)if Xnext(k)>FieldDR(2,k)Xnext(k) = FieldDR(2,k);endif Xnext(k)<FieldDR(1,k)Xnext(k) = FieldDR(1,k);endendbreak;endend%隨機行為if isempty(Xnext)Xnext = Xi+(2*rand(1,length(Xi))-1)*visual;for i=1:length(Xnext)if Xnext(i)>FieldDR(i,2)Xnext(i) = FieldDR(i,2);endif Xnext(i)<FieldDR(i,1)Xnext(i) = FieldDR(i,1);endendendYnext = FoodConsistence(Xnext); end聚群行為的代碼如下:
function[Xnext,Ynext]=Swarm(X,i,visual,step,deta,try_number,FieldDR,lastY) % 聚群行為 %輸入: %X 所有人工魚的位置 %i 當前人工魚的序號 %visual 感知范圍 %step 最大移動步長 %deta 擁擠度 %try_number 最大嘗試次數 %FieldDR 各個數的上下限 %lastY 上次的各人工魚位置的食物濃度 %輸出: %Xnext Xi人工魚的下一個位置 %Ynext Xi人工魚的下一個位置的食物濃度Xi = X(i,:);D = Dist(Xi,X);index = find(D>0 & D<visual);nf = length(index);if nf>0if length(index)==1Xc = X(index,:);elseXc = mean(X(index,:));endYc = FoodConsistence(Xc);Yi = lastY(i);if Yc/nf > deta*YiXnext = Xi+rand*step*(Xc-Xi)/norm(Xc-Xi);for i = 1:length(Xnext)if Xnext(i) > FieldDR(2,i)Xnext(i) = FieldDR(2,i);endif Xnext(i) < FieldDR(1,i)Xnext(i) = FieldDR(1,i);endendYnext = FoodConsistence(Xnext);else[Xnext,Ynext] = Prey(Xi,i,visual,step,try_number,FieldDR,lastY);endelse[Xnext,Ynext] = Prey(Xi,i,visual,step,try_number,FieldDR,lastY);end end追尾行為的代碼如下:
function[Xnext,Ynext]=Follow(X,i,visual,step,deta,try_number,FieldDR,lastY) % 追尾行為 %輸入: %X 所有人工魚的位置 %i 當前人工魚的序號 %visual 感知范圍 %step 最大移動步長 %deta 擁擠度 %try_number 最大嘗試次數 %FieldDR 各個數的上下限 %lastY 上次的各人工魚位置的食物濃度 %輸出: %Xnext Xi人工魚的下一個位置 %Ynext Xi人工魚的下一個位置的食物濃度Xi = X(i,:);D = Dist(Xi,X);index = find(D>0 & D<visual);nf = length(index);if nf>0XX = X(index,:);YY = lastY(index);[Ymax,Max_index] = max(YY);Xmax = XX(Max_index,:);Yi = lastY(i);if Ymax/nf > deta*Yi;Xnext = Xi+rand*step*(Xmax-Xi)/norm(Xmax-Xi);for i=1:length(Xnext)if Xnext(i)>FieldDR(2,i)Xnext(i) = FieldDR(2,i);endif Xnext(i)<FieldDR(2,i)Xnext(i) = FieldDR(2,i);endendYnext = FoodConsistence(Xnext);else[Xnext,Ynext]=Prey(Xi,i,visual,step,try_number,FieldDR,lastY);endelse[Xnext,Ynext] = Prey(Xi,i,visual,step,try_number,FieldDR,lastY);end end人工魚群算法代碼如下:
clc clear close all figure hold on ezplot('x*sin(10*pi*x)+2',[-1,2]);%% 參數設置 fishnum = 100; %生成100只人工魚 MAXGEN = 50; %最多迭代次數 try_number = 100; %最多試探次數 visual = 1; %感知距離 delta = 0.618; %擁擠度因子 step = 0.1; %步長%% 初始化魚群 FieldDR = [-1;2]; X = Init(fishnum,FieldDR); gen = 1; BestY = -1*ones(MAXGEN,1); %每步中最優的函數值 BestX = -1*ones(MAXGEN,1); %每步中最優的自變量 besty = -inf; %最優函數值 Y = FoodConsistence(X);%% 算法開始 while gen<=MAXGEN for i=1:fishnum%% 聚群行為[Xi1,Yi1] = Swarm(X,i,visual,step,delta,try_number,FieldDR,Y); %% 追尾行為[Xi2,Yi2] = Follow(X,i,visual,step,delta,try_number,FieldDR,Y); if Yi1>Yi2X(i,:) = Xi1;Y(i,1) = Yi1;elseX(i,:) = Xi2;Y(i,1) = Yi2;endend[Ymax,index] = max(Y); if Ymax>bestybesty = Ymax;bestx = X(index,:);BestY(gen) = Ymax;BestX(gen,:) = X(index,:);elseBestY(gen) = BestY(gen-1);BestX(gen,:) = BestX(gen-1,:);endplot(bestx,besty,'.','color',[gen/MAXGEN,0,0])disp([gen,bestx,besty]);gen = gen+1; end plot(bestx,besty,'ro','MarkerSize',20) xlabel('x') ylabel('y') title('魚群算法迭代過程中最優坐標移動')%% 優化過程圖 figure plot(1:MAXGEN,BestY) xlabel('迭代次數') ylabel('優化值') title('魚群算法迭代過程')最終x=1.850585x=1.850585x=1.850585,對應最大值為fmax=3.850272f_{max}=3.850272fmax?=3.850272。人工魚群算法尋優得到最優值接近函數實際最優值,說明該算法具有較強的函數極值尋優能力。
四、基于人工魚群算法的多元非線性函數尋優
多元非線性函數為
f(x,y)=sin?xx×sin?yy,x,y∈[?10,10]f(x,y) = \frac{ \sin x}{x}\times \frac{\sin y}{y},x,y\in[-10,10] f(x,y)=xsinx?×ysiny?,x,y∈[?10,10]
我們尋找max(f(x,y))max(f(x,y))max(f(x,y))。
[x_plot,y_plot] = meshgrid(-10:0.05:10); z = (sin(x_plot)./x_plot).*(sin(y_plot)./y_plot); mesh(x_plot,y_plot,z) xlabel('第一維度x的取值范圍'); ylabel('第二維度y的取值范圍'); zlabel('函數值');本案例人工魚數為100,感知距離為2.5,最大迭代次數為50,擁擠度因子為0.618,覓食最大試探次數為100,移動步長為0.3。
其中,創建初始人工魚群的代碼,距離函數的代碼,覓食行為的代碼,聚群行為的代碼,追尾行為的代碼見第三部分。
目標函數(食物濃度函數)代碼如下:
function [Y]=FoodConsistence(X)Y=(sin(X(:,1))./X(:,1)).*(sin(X(:,2))./sin(X(:,2))); end人工魚群算法代碼如下:
clc clear close all%% 參數設置 fishnum = 100; %生成100只人工魚 MAXGEN = 50; %最多迭代次數 try_number = 100; %最多試探次數 visual = 2.5; %感知距離 delta = 0.618; %擁擠度因子 step = 0.3; %步長%% 初始化魚群 FieldDR = repmat([-10;10],[1,2]); X = Init(fishnum,FieldDR); gen = 1; BestY = -1*ones(MAXGEN,1); %每步中最優的函數值 BestX = -1*ones(MAXGEN,2); %每步中最優的自變量 besty = -inf; %最優函數值 Y = FoodConsistence(X);%% 算法開始 while gen<=MAXGENfor i=1:fishnum% 聚群行為[Xi1,Yi1] = Swarm(X,i,visual,step,delta,try_number,FieldDR,Y); % 追尾行為[Xi2,Yi2] = Follow(X,i,visual,step,delta,try_number,FieldDR,Y);if Yi1>Yi2X(i,:) = Xi1;Y(i,1) = Yi1;elseX(i,:) = Xi2;Y(i,1) = Yi2;endend[Ymax,index] = max(Y);if Ymax>bestybesty = Ymax;bestx = X(index,:);BestY(gen) = Ymax;BestX(gen,:) = X(index,:);elseBestY(gen) = BestY(gen-1);BestX(gen,:) = BestX(gen-1,:);end figure(1);hold onplot(bestx(1),bestx(2),'.','color',[gen/MAXGEN,0,0])disp([gen,bestx,besty]);gen=gen+1; end plot(bestx(1),bestx(2),'ro','MarkerSize',20) xlabel('x') ylabel('y') title('魚群算法迭代過程中最優坐標移動')%% 優化過程圖 figure plot(1:MAXGEN,BestY) xlabel('迭代次數') ylabel('優化值') title('魚群算法迭代過程')最終x=?0.00099652,y=?4.29936445x=-0.00099652,y=-4.29936445x=?0.00099652,y=?4.29936445,對應最大值為fmax=0.99999983f_{max}=0.99999983fmax?=0.99999983。人工魚群算法尋優得到最優值接近函數實際最優值,說明該算法具有較強的函數極值尋優能力。
五、練習
求測試函數的最小值,以及最小值點。
1. Rastrigin function:
f(x)=An+∑i=1n[xi2?Acos?(2πxi)],?5.12≤xi≤5.12f(\bm x)=A_n+\sum_{i=1}^{n}{[x_i^2-A\cos (2\pi x_i)]},-5.12\leq x_i\leq 5.12 f(x)=An?+i=1∑n?[xi2??Acos(2πxi?)],?5.12≤xi?≤5.12
當A=10,n=2A=10,n=2A=10,n=2時,如下圖所示:
2. Sphere function:
f(x)=∑i=1nxi2,?∞≤xi≤∞f(\bm x) = \sum_{i=1}^{n}{x_i^2},-\infty\leq x_i \leq \infty f(x)=i=1∑n?xi2?,?∞≤xi?≤∞
當n=2n=2n=2時,如下圖所示:
3. Beale function:
f(x,y)=(1.5?x+xy)2+(2.25?x+xy2)2+(2.625?x+xy3)2,?4.5≤x,y≤4.5f(x,y)=(1.5-x+xy)^2+(2.25-x+xy^2)^2+(2.625-x+xy^3)^2,-4.5\leq x,y\leq 4.5 f(x,y)=(1.5?x+xy)2+(2.25?x+xy2)2+(2.625?x+xy3)2,?4.5≤x,y≤4.5
4. Booth function:
f(x,y)=(x+2y?7)2+(2x+y?5)2,?10≤x,y≤10f(x,y)=(x+2y-7)^2+(2x+y-5)^2,-10\leq x,y\leq 10 f(x,y)=(x+2y?7)2+(2x+y?5)2,?10≤x,y≤10
5. Bukin function:
f(x,y)=100∣y?0.01x2∣+0.01∣x+10∣,?15≤x≤?5,?3≤y≤3f(x,y)=100\sqrt{|y-0.01x^2|}+0.01|x+10|,-15\leq x\leq -5,-3\leq y\leq 3 f(x,y)=100∣y?0.01x2∣?+0.01∣x+10∣,?15≤x≤?5,?3≤y≤3
6. three-hump camel function:
f(x,y)=2x2?1.05x4+x66+xy+y2,?5≤x,y≤5f(x,y)=2x^2-1.05x^4+\frac{x^6}{6}+xy+y^2,-5\leq x,y\leq 5 f(x,y)=2x2?1.05x4+6x6?+xy+y2,?5≤x,y≤5
7. H?lder table function:
f(x,y)=?∣sin?xcos?yexp?(∣1?x2+y2π∣)∣,?10≤x,y≤10f(x,y)=-|\sin x \cos y \exp(|1-\frac{\sqrt{x^2+y^2}}{\pi}|)|,-10\leq x,y\leq 10 f(x,y)=?∣sinxcosyexp(∣1?πx2+y2??∣)∣,?10≤x,y≤10
目前Datawhale的開源內容分為兩種:第一種是已經囊括在我們的學習路線圖內的Datawhale精品課,第二種是暫未囊括在我們的學習路線圖內的Datawhale打磨課。我們根據您的投票來確定精品課程的排期,打磨課程一旦完成,即可排入我們每個月的組隊學習。
請選擇您十二月份希望學習的Datawhale精品課程。如果某門課程超過100人選擇,那么我們就邀請該課程設計者開設該課程的組隊學習。
-> 插入投票
- 楊劍礪:數據可視化(Matplotlib))
- 陳安東:動手學數據分析
- 王復振:SQL編程語言
- 謝文睿:吃瓜教程——西瓜書+南瓜書
- 王茂霖:李宏毅機器學習(含深度學習)
總結
以上是生活随笔為你收集整理的【优秀作业】人工鱼群优化算法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: HTTP、TCP、UDP、Socket
- 下一篇: Android应用开发中的风格和主题(s
