人工鱼群算法(Artificial Fish Swarm Algorithm,AFSA)是Li Xiao-lei在2002年提出的(Yazdani, Toosi, & Meybodi, 2010)[1],目的是模仿鱼类捕食、群集、跟随、移动等行为。AFSA是基于鱼类集体向某个目标运动,并受到自然的启发,是一种并行和随机搜索算法。
与狮子和猴子不同,在像鱼类这种动物物种中没有领导者,每个成员都有自我组织的行为。鱼对它们的群体和环境一无所知,通过相邻成员之间的数据交换在环境中随意移动,这种交互作用为鱼群优化带来了更多的复杂性。
AFSA具有容错性和灵活性等特点,它在资源均衡、模糊聚类、数据挖掘、扩频码估计、DNA编码序列优化、信号处理、图像处理、改进神经网络、作业调度等方面有着广泛的应用。AFSA具有收敛速度快、效率高等优点,同时也存在时间复杂度高、全局搜索与局部搜索不平衡等缺点。
人工鱼(AF)是真实鱼的仿制品,用于分析和问题解释(Neshat、Sepidnam、Sargolzaei和Toosi(2012))。鱼类大多生活在食物充足的地区,它们通过跟随其他鱼类或单独寻找食物,向食物较多的地区移动。鱼类数量最多的地区通常是食物最多的。每条人工鱼的下一步行为取决于它目前的状态以及局部的环境状态,AF通过自身行为以及同伴的行为来影响环境。
AF模型包含两个部分:变量和函数。
变量包括:
X=(x1,x2,…,xn):每只AF的当前位置。
Visual:视距(感知距离)。
Xv:在某个运动中在视觉位置的状态。
Step:步长。
try_num:尝试次数。
δ:拥挤因子(0<δ<1)。
θ:拥挤参数θ∈{0,1}。
n:点个数(鱼的总数)。
di,j:人工鱼个体之间的距离di,j=‖Xi-Xj‖。
函数包括人工鱼的各种行为:
AF_Prey
AF_Swarm
AF_Follow
AF_Move
AF_Leap
AF_Evaluate
图1显示了一条人工鱼的视野。
鱼类表现出的行为模式是:
鱼类大多生活在食物充足的地区。
基于这一特性,对鱼类的行为进行仿真,寻找全局最优解,这是AFSA研究的基本思路。
函数Rand()产生一个介于0和1之间的随机数。
AF_Prey(觅食行为):这是鱼类对食物的基本生物学行为。一般来说,鱼通过视觉感知水中食物的浓度来决定向哪移动,然后选择移动的方向。设人工鱼当前状态为Xi,在其感知范围内随机选择一个状态Xj(式(1)),如果在求极大问题中,f(Xi)<f(Xj)(或在求极小问题中,f(Xi)>f(Xj),因极大和极小问题可以互相转换,所以以下均以求极大问题讨论),则向该方向前进一步(式(2));反之,再重新随机选择状态Xj,判断是否满足前进条件;反复几次(try_num)后,如果仍不满足前进条件,则随机移动一步(式(3))。
clc clear all close all tic figure(1); hold on %%参数设置 fishnum=100; MAXGEN=50;%最大迭代次数 try_number=100; visual=2.5; step=0.3; delta=0.618; %初始化鱼群 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(1,MAXGEN);%每步中最优的自变量 besty=-100;%最优函数值 Y=AF_foodconsistence(X); while gen<=MAXGEN fprintf(1,'%d\n',gen) for i=1:fishnum [Xi2,Yi2]=AF_follow(X,i,visual,step,delta,try_number,LBUB,Y);%追尾 [Xi1,Yi1]=AF_swarm(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(1,gen)]=X(1,index); [BestX(2,gen)]=X(2,index); else BestY(gen)=BestY(gen-1); [BestX(:,gen)]=BestX(:,gen-1); end gen=gen+1; end function [ Xnext,Ynext ] = AF_prey( Xi,ii,visual,step,try_number,LBUB,lastY ) % input %Xi 当前人工鱼的位置 %ii当前人工鱼的序号 %step最大移动步长 %try_number最大尝试次数 %LBUB各个数的上下限 %lastY上次的各人工鱼位置的食物浓度 %output % Xnext=[]; Yi=lastY(ii); for i=1:try_number Xj=Xi+(2*rand(length(Xi),1)-1)*visual; Yj=AF_foodconsistence(Xj); if Yi<Yj Xnext=Xi+rand*step*(Xj-Xi)/norm(Xj-Xi); for i=1:length(Xnext) if Xnext(i,1)>LBUB(i,2) Xnext(i,1)=LBUB(i,2); end if Xnext(i,1)<LBUB(i,1) Xnext(i,1)=LBUB(i,1); end end Xi=Xnext; break; end end %随机行为 if isempty(Xnext) Xj=Xi+(2*rand(length(Xi),1)-1)*visual; Xnext=Xj; for i=1:length(Xnext) if Xnext(i,1)>LBUB(i,2) Xnext(i,1)=LBUB(i,2); end if Xnext(i,1)<LBUB(i,1) Xnext(i,1)=LBUB(i,1); end end end Ynext=AF_foodconsistence(Xnext);
版本:2014a