1701011638
(5)当公告板上最优解达到满意误差界内,算法结束,否则转(3)。
1701011639
1701011640
应用人工鱼群算法进行函数寻优分析,待分析函数编程如下:
1701011641
1701011642
clc,clear,close all %清屏和清除变量 warning off %消除警告 tic %开始计时 figure(‘color’,[1,1,1]) [X1,X2] = meshgrid(-10
:0.1:10,-10:0.1:10); %平面栅格化 Y=sin(X1)./X1.*sin(X2)./X2; %对应的Z值 mesh(X1,X2,Y) %曲面绘制 toc %结束计时
1701011643
1701011644
运行程序输出图形如图10-11所示。
1701011645
1701011646
1701011647
1701011648
1701011649
图10-11 待寻优函数
1701011650
1701011651
该函数存在一个极大值点,因此,采用人工鱼群算法进行函数寻优,应该找到该极大值点,人工鱼群算法程序如下:
1701011652
1701011653
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=[-10,10,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); %图形窗口(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’) %x轴标记 ylabel(‘y’) %y轴标记 title(‘鱼群算法迭代过程中最优坐标移动’) %%优化过程图 figure plot(1
:MAXGEN,BestY) xlabel(‘迭代次数’) ylabel(‘优化值’) title(‘鱼群算法迭代过程’) disp([‘最优解X: ‘,num2str(bestx’,’%1.5f ‘)]) disp([‘最优解Y: ‘,num2str(besty,’%1.5f\n’)]) toc %结束计时
1701011654
1701011655
相应的待优化函数即适应度函数如下:
1701011656
1701011657
function [Y]=AF_foodconsistence(X) fishnum=size(X,2); for i=1
:fishnum Y(1,i)=sin(X(1,i))/X(1,i)*sin(X(2,i))/X(2,i); %目标函数 end
1701011658
1701011659
考虑鱼群的聚群行为如图10-12所示。
1701011660
1701011661
1701011662
1701011663
1701011664
图10-12 鱼群聚群行为
1701011665
1701011666
1701011667
鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群。鱼聚群时所遵守的规则有三条:分割规则、对准规则和内聚规则。人工鱼xi搜索其视野内的伙伴数目n及中心位置xj,若,表明伙伴中心位置状态较优且不太拥挤,则xi朝伙伴的中心位置xi移动一步,否则执行觅食行为。
1701011668
1701011669
鱼群的聚群行为编程如下:
1701011670
1701011671
function [Xnext,Ynext]=AF_swarm(X,i,visual,step,deta,try_number,LBUB, lastY) %聚群行为 %输入: %X 所有人工鱼的位置 %i 当前人工鱼的序号 %visual 感知范围 %step 最大移动步长 %deta 拥挤度 %try_number 最大尝试次数 %LBUB 各个数的上下限 %lastY 上次的各人工鱼位置的食物浓度 %输出: %Xnext Xi人工鱼的下一个位置 %Ynext Xi人工鱼的下一个位置的食物浓度 Xi=X(
:,i); D=AF_dist(Xi,X); index=find(D>0 & D
0 for j=1:size(X,1) Xc(j,1)=mean(X(j,index)); end Yc=AF_foodconsistence(Xc); Yi=lastY(i); if Yc/nf>deta*Yi Xnext=Xi+rand*step*(Xc-Xi)/norm(Xc-Xi); for i=1:length(Xnext) if Xnext(i)>LBUB(i,2) %上限判断 Xnext(i)=LBUB(i,2); end if Xnext(i)
1701011672
1701011673
考虑鱼群的追尾行为如图10-13所示。
1701011674
1701011675
1701011676
1701011677
1701011678
图10-13 鱼群追尾行为
1701011679
1701011680
1701011681
追尾行为指鱼向其可视区域内的最优方向移动的一种行为。人工鱼xi搜索其视野内所有伙伴中的函数最优伙伴xi,如果,表明最优伙伴的周围不太拥挤,则人工鱼xi朝函数最优伙伴xi移动一步,否则执行觅食行为。
1701011682
1701011683
鱼群的追尾行为编程如下:
1701011684
1701011685
function [Xnext,Ynext]=AF_follow(X,i,visual,step,deta,try_number,LBUB, lastY) %追尾行为 %输入: %X 所有人工鱼的位置 %i 当前人工鱼的序号 %visual 感知范围 %step 最大移动步长 %deta 拥挤度 %try_number 最大尝试次数 %LBUB 各个数的上下限 %lastY 上次的各人工鱼位置的食物浓度 %输出: %Xnext Xi人工鱼的下一个位置 %Ynext Xi人工鱼的下一个位置的食物浓度 Xi=X(
:,i); D=AF_dist(Xi,X); index=find(D>0 & D
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):,i),i,visual,step,try_number,LBUB, lastY); end else [Xnext,Ynext]=AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY); end
1701011686
1701011687
求解完成,相应的画图程序如下:
[
上一页 ]
[ :1.701011638e+09 ]
[
下一页 ]