【优化算法】人工鱼群优化算法(AFSA)【含Matlab源码 1078期】

331 阅读3分钟

一、简介

人工鱼群算法(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