一、简介
人工鱼群算法(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