一、简介1.1 觅食行为 for i = 1:N for j = 1:Try_number Xj=x(i) Visual.*rand();%人工鱼Xi按式(1)在其视野内随机选择一个状态Xj if f(Xj)<f(x(i)) %比较Xj和Xi的适应度 X_next= x(i) rand()*step*(Xj-x(i))/norm(Xj-x(i)); %人工鱼Xi按式(2)朝着Xj方向移动一步,norm()函数表示二范数 break; else X_next=x(i) step*rand(); end end end 1.2 聚群行为 鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群 。人工鱼X i X_iXi搜索其视野内(d i j < v i s u a l d_{ij}<visualdij<visual)的伙伴数目n f n_fnf及中心位置X c X_cXc,若Y c / n f < δ Y i Y_c/n_f< δY_iYc/nf<δYi(求极小值时使用小于号,在求极大值时则相反;Y c Y_cYc和Y i Y_iYi分别为X c X_cXc和X i X_iXi的适应度值),表明伙伴中心位置状态较优且不太拥挤,则X i X_iXi朝伙伴的中心位置移动一步,否则执行觅食行为; nf=0;X_inside=0; for i = 1:N for j = 1:N if norm(x(j)-x(i))<Visual % 求人工鱼Xi与其他人工鱼之间的距离 nf = nf 1; %统计在视野范围内的鱼数量 X_inside= X_inside x(j); %将视野范围内的鱼进行累加 end X_inside=X_inside-x(i); %需要去除Xi本身;因为在 一开始计算时,i=j,把中心的鱼也进行了一次计算 nf=nf-1; Xc = X_inside/nf; %此时Xc表示Xi感知范围其他伙伴的中心位置; if f(Xc)/nf < δ*f(x(i)) x_next=x(i) rand*Step*(Xc-x(i))/norm(Xc-x(i)); else 进行觅食行动 end end end 1.3 追尾行为 指鱼向其视野区域内的最优方向移动的一种行为。人工鱼X i X_iXi搜索其视野内(d i j < v i s u a l d_{ij}<visualdij<visual)适应度最高的个体X j X_jXj,其适应度值为Y j Y_jYj,并探索人工鱼X j X_jXj视野内的伙伴数目n f n_fnf,若Y j / n f < δ Y i Y_j/n_f< δY_iYj/nf<δYi,表明X j X_jXj状态较优且不太拥挤,则X i X_iXi朝X j X_jXj位置移动一步,否则执行觅食行为; Y_max=inf;nf=0; for i = 1:N %搜索人工鱼Xi视野范围内的最高适应度个体Xj for j = 1:N if norm(x(j)-x(i))<Visual && f(x(j))<Y_max% 求人工鱼Xi与其他人工鱼之间的距离 X_max=x(j); Y_max=f(x(j)); end end %搜索人工鱼Xj视野范围内的伙伴数量 for j = 1:N if(norm(x(j)-X_max)<Visual) nf=nf 1; end end nf=nf-1;%去掉他本身 if Y_max/nf<delta*f(x(i)) x_next= x(i,:) rand*Step.*(temp_maxX-x(i,:))./norm(temp_maxX-x(i,:)); else 进行觅食行为; end end 1.4 算法总述 综上所述,算法在运算过程中,会同时进行聚群和追尾行为。而觅食行为属于这两种行为中发现聚群对象或者追尾对象附近拥挤度过大时,人工鱼选择的行为方式,若在觅食过程中,未发现比自身适应度高的人工鱼,则按步长step随机移动。最后对聚群行为和追尾行为得到的适应度值进行比较,选择优秀的人工鱼作为下一代的个体。其总框架图如下: 在求极小值问题中:δ = α n m a x , α ∈ ( 0 , 1 ] δ=αn_{max}, α∈(0,1]δ=αnmax,α∈(0,1] 3.2 拥挤度因子的作用机理 对追尾行为的描述 当δ n f > 1 δn_f >1δnf>1时,若C2的食物浓度为Y j δ n f \frac{Y_j}{δn_f }δnfYj的等浓度食物圈,则C2与C1间的人工鱼af1、af2、af3执行追尾行动,向af0游动,人工鱼af4、af5执行觅食行为。此时δnf 越大执行追尾行动的人工鱼越少,反之越多。 3.2 拥挤度因子的影响 以极大值为例(极小值的情况正好和极大值相反), δ δδ越大,表明允许的拥挤程度越小,人工鱼摆脱局部最优的能力越强;但是收敛的速度会有所减缓,这主要因为人工鱼在逼近极值的同时,会因避免过分拥挤而随机走开或者受其它人工鱼的排斥作用,不能精确逼近极值点。可见,δ δδ的引入避免了人工鱼过度拥挤而陷入局部极值,另一方面,该参数会使得位于极值点附近的人工鱼之间存在相互排斥的影响,而难以向极值点精确逼近,所以,对于某些局部极值不是很严重的具体问题,可以忽略拥挤的因素,从而在简化算法的同时也加快了算法的收敛速度和提高结果的精确程度。 二、源代码clc,clear,close all warning off tic figure(1);hold on %% 参数设置 fishnum=100; % 生成100只人工鱼 MAXGEN=50; % 最多迭代次数 try_number=100; % 最多试探次数 visual=1; % 感知距离 delta=0.618; % 拥挤度因子 step=0.1; % 步长 %% 初始化鱼群 lb_ub=[-3,3,2;]; X=AF_init(fishnum,lb_ub); % 初始化 LBUB=[]; for i=1:size(lb_ub,1) LBUB=[LBUB;repmat(lb_ub(i,1:2),lb_ub(i,3),1)]; end gen=1; BestY = -1*ones(1,MAXGEN); % 每步中最优的函数值 BestX = -1*ones(2,MAXGEN); % 每步中最优的自变量 besty = -100; % 最优函数值 Y=AF_foodconsistence(X); % 待优化目标函数 while gen<=MAXGEN disp(['迭代步数: ',num2str(gen)]) for i=1:fishnum % 聚群行为 [Xi1,Yi1]=AF_swarm(X,i,visual,step,delta,try_number,LBUB,Y); % 追尾行为 [Xi2,Yi2]=AF_follow(X,i,visual,step,delta,try_number,LBUB,Y); if Yi1>Yi2 X(:,i)=Xi1; Y(1,i)=Yi1; else X(:,i)=Xi2; Y(1,i)=Yi2; end end [Ymax,index]=max(Y); figure(1); plot(X(1,index),X(2,index),'.','color',[gen/MAXGEN,0,0]) if Ymax>besty besty=Ymax; bestx=X(:,index); BestY(gen)=Ymax; [BestX(:,gen)]=X(:,index); else BestY(gen)=BestY(gen-1); [BestX(:,gen)]=BestX(:,gen-1); end gen=gen 1; end plot(bestx(1),bestx(2),'ro','MarkerSize',100) xlabel('x') ylabel('y') title('鱼群算法迭代过程中最优坐标移动') %% 优化过程图 figure plot(1:MAXGEN,BestY) xlabel('迭代次数') ylabel('优化值') title('鱼群算法迭代过程') disp(['最优解X: ',num2str(bestx','%1.5f ')]) disp(['最优解Y: ',num2str(besty,'%1.5f\n')]) toc function [Xnext,Ynext]=AF_follow(X,i,visual,step,deta,try_number,LBUB,lastY) % 追尾行为 %输入: %X 所有人工鱼的位置 %i 当前人工鱼的序号 %visual 感知范围 %step 最大移动步长 �ta 拥挤度 %try_number 最大尝试次数 %LBUB 各个数的上下限 %lastY 上次的各人工鱼位置的食物浓度 %输出: %Xnext Xi人工鱼的下一个位置 %Ynext Xi人工鱼的下一个位置的食物浓度 Xi=X(:,i); D=AF_dist(Xi,X); index=find(D>0 & D<visual); nf=length(index); if nf>0 XX=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)>LBUB(i,2) Xnext(i)=LBUB(i,2); end if Xnext(i)<LBUB(i,1) Xnext(i)=LBUB(i,1); end end 三、运行结果
四、备注完整代码或者代写添加QQ912100926 来源:https://www./content-4-896151.html |
|