【优化求解】基于matlab鱼群算法函数优化分析【含Matlab源码 1127期】

830 阅读13分钟

一、简介

1 起源 人工鱼群算法是李晓磊等人于2002年在动物群体智能行为研究的基础上提出的一种新型方盛优化算法,该算法根据水域中鱼生存数目最多的地方就是本水域中富含营养物质最多的地方这一特点来模拟鱼群的觅食行为而实现寻优。算法主要利用鱼的三大基本行为:觅食、聚群和追尾行为,采用自上而下的寻优模式从构造个体的底层行为开始,通过鱼群中各个体的局部寻优,达到全局最优值在群体中凸显出来的目的。 该方法采用自下而上的寻优思路,首先设计单个个体的感知、行为机制,然后将一个或一群实体放置在环境中,让他们在环境的交互作用中解决问题。

2 生态学基础 在一片水域中,鱼存在的数目最多的地方就是本水域富含营养物质最多的地方,依据这一特点来模仿鱼群的觅食、聚群、追尾等行为,从而实现全局最优,这就是鱼群算法的基本思想。鱼类活动中,觅食行为、群聚行为、追尾行为和随机行为与寻优命题的解决有较为密切的关系,如何利用简单有效的方式来构造和实现这些行为将是算法实现的主要为题。

3 人工鱼的结构模型 人工鱼是真实鱼抽象化、虚拟化的一个实体,其中封装了自身数据和一系列行为,可以接受环境的刺激信息,做出相应的活动。其所在的环境由问题的解空间和其他人工鱼的状态,它在下一时刻的行为取决于自身的状态和环境的状态,并且它还通过自身的活动来影响环境,进而影响其他人工鱼的活动。 人工鱼对外的感知是依靠视觉来实现的,人工鱼的模型中使用如下方法实现人工鱼的虚拟视觉:

其中 为随机函数,产生0到1之间的随机数, 为步长。 在这里插入图片描述 人工鱼视觉的概念

3.1 人工鱼中封装的变量和函数 变量部分:人工鱼的总数、人工鱼个体的状态(其中为寻优的变量)、人工鱼移动的最大步长、人工鱼的视野Visual、尝试次数、拥挤度因子、人工鱼个体之间的距离。 函数部分:人工鱼当前所在位置食物浓度表示为(为目标函数值)、人工鱼各种行为函数(觅食行为、聚群行为、追尾行为、随机行为以及行为评价函数)。

3.2 人工鱼的四种基本行为算法描述 3.2.1 觅食行为   这是鱼趋向食物的一种活动,一般认为它是通过视觉或味觉来感知水中的食物量或食物浓度来选择行动的方向。设置人工鱼当前状态,并在其感知范围内随机选择另一个状态,如果得到的状态的目标函数大于当前的状态,则向新选择得到的状态靠近一步,反之,重新选取新状态,判断是否满足条件,选择次数达到一定数量后,如果仍然不满足条件,则随机移动一步。 算法描述:人工鱼在其视野内随机选择一个状态 分别计算 与 的目标函数值 与 ,如果发现 比 好,则 向 的方向移动一部: 否则, 继续在其视野内选择状态 ,判断是否满足前进条件,反复尝试 次后,仍没有满足前进条件,则执行随机行为。

3.2.2 聚群行为 大量或少量的鱼聚集成群,进行集体觅食和躲避敌害,这是它们在进化过程中形成的一种生存方式。人工鱼探索当前邻居内的伙伴数量,并计算伙伴的中心位置,然后把新得到的中心位置的目标函数与当前位置的目标函数相比较,如果中心位置的目标函数优于当前位置的目标函数并且不是很拥挤,则当前位置向中心位置移动一步,否则执行觅食行为。鱼聚群时会遵守两条规则:一是尽量向邻近伙伴的中心移动,二是避免过分拥挤。 算法描述:人工鱼搜索当前视野内()的伙伴数目和中心位置,若,则表明伙伴中心位置状态较优且不太拥挤,则朝伙伴的中心位置移动一步: 否则进行觅食行为。

3.2.3、追尾行为 当某一条鱼或几条鱼发现食物时,它们附近的鱼会尾随而来,导致更远处的鱼也会尾随过来。人工鱼探索周围邻居鱼的最优位置,当最优位置的目标函数值大于当前位置的目标函数值并且不是很拥挤,则当前位置向最优邻居鱼移动一步,否则执行觅食行为。 算法描述:人工鱼搜索当前视野内()的伙伴中函数最优伙伴,如果,表明最优伙伴的周围不太拥挤,则朝词伙伴移动一步: 否则执行觅食行为。

3.2.4 随机行为 它是觅食行为的一个缺省行为,指人工鱼在视野内随机移动。当发现食物时,会向食物逐渐增多的方向快速的移动。 算法描述人工鱼随机移动一步,到达一个新的状态:

4 人工鱼群算法描述 公告牌是记录最优人工鱼个体状态的地方。每条人工鱼在执行完一次迭代后将自身当前状态与公告牌中记录的状态进行比较,如果优于公告牌中的状态则用自身状态更新公告牌中的状态,否则公告牌的状态不变。当整个算法的迭代结束后,公告牌的值就是最优解。 行为评价是用来反映鱼自主行为的一种方式,在解决优化问题时选用两种方式评价:一种是选择最优行为执行;另一种是选择较优方向。对于解决极大值问题,可以使用试探法,即模拟执行群聚、追尾等行为,然后评价行动后的值选择最优的来执行,缺省的行为为觅食行为。 迭代终止条件:通常的方法是判断连续多次所得值得均方差小鱼允许的误差;或判断聚集于某个区域的人工鱼的数目达到某个比例;或连续多次所得的均值不超过已寻找的极值;或限制最大迭代次数。若满足终止条件,则输出公告牌的最优记录;否则继续迭代。 人工鱼群算法的步骤:

初始化设置,包括种群规模、没条人工鱼的初始位置、人工鱼的视野、步长、拥挤度因子、重复次数; 计算初始鱼群各个体的适应值,取最优人工鱼状态及其值赋予给公告牌; 对每个个体进行评价,对其要执行的行为进行选择,包括觅食、聚群、追尾和随机行为; 执行人工鱼的行为,更新自己,生成新鱼群; 评价所有个体。若某个体优于公告牌,则将公告牌更新为该个体; 当公告牌上最优解达到满意误差界内或者达到迭代次数上限时算法结束,否则转步骤3。 5、人工鱼群算法的寻优原理   人工鱼群算法在寻优的过程中,可能会集结在几个局部最优解的周围,使人工鱼跳出局部最优解,实现全局寻优的因素主要有:

觅食行为中重复次数较少时,为人工鱼提供了随机移动的机会,从而可能跳出局部最优解; 随机步长使得人工鱼在前往局部最优解的途中,有可能转向全局最优解; 拥挤度因子 限制了聚群的规模,使得人工鱼能够更广泛的寻优; 聚群行为能够促使少出陷于局部最优解的人工鱼趋向全局最优解的人工鱼方向聚集,从而逃出局部最优解; 追尾行为加快了人工鱼向更优状态游动。

6 参数设置与性能 6.1 收敛基础   人工鱼群算法中,觅食行为奠定了算法收敛的基础;聚群行为增强了算法收敛的稳定性;追尾行为增强了算法收敛的快速性和全局性;其评价行为也对算法收敛的速度和稳定性提供了保障。

6.2 各种参数对收敛性的影响   人工鱼群算法有5个基本参数:群规模、人工鱼的视野、步长、拥挤度因子、重复次数。

  1. 视野:由于视野对算法中个行为都有较大影响,因此,它的变化对收敛性能影响也比较复杂。当视野范围较小时,人工鱼的觅食行为和随机行为比较突出;视野范围较大时,人工鱼的追尾行为和聚群行为将变得比较突出,相应的算法的复杂度也会有所上升。总的来说:视野越大,越容易使人工鱼发现全局最优解并收敛。
  2. 步长:对于固定步长,随着步长的增加,收敛的速度得到了一定的加速,但在超过一定的范围后,有使得收敛速度减缓,步长过大时会出现震荡现象而大大影响收敛速度。采用随机步长的方式在一定程度上防止了震荡现象的发生,并使得该参数的敏感度大大降低了,但最快的收敛速度还是最优固定步长的收敛速度,所以,对于特定的优化问题,我们可以考虑采用合适的固定步长或者变尺度方法来提高收敛速度。
  3. 群规模:人工鱼的数目越多,跳出局部最优解的能力越强,同时,收敛的速度也越快。当然,付出的代价就是算法每次迭代的计算量也越大,因此,在使用过程中,满足稳定收敛的前提下,应当尽可能的减少个图数目。
  4. 尝试次数:尝试次数越多,人工鱼的觅食行为能力越强,收敛的效率也越高。在局部极值突出的情况下,应该适当的减少以增加人工鱼随机游动的概率,克服局部最优解。
  5. 拥挤度因子:在求极大值问题中,;在求极小值问题中,。其中为极值接近水平,为期望在该邻域内聚集的最大人工鱼数目。拥挤度因子与相结合,通过人工鱼是否执行追尾和聚群行为对优化结果产生影响。以极大值为例(极小值的情况正好与极大值相反),越大,表明允许的拥挤程度越小,人工鱼摆脱局部最优解的能力越强;但是收敛速度会有所减缓,这主要因为人工鱼在逼近最优解的同时,会因避免过分拥挤而随机走开或者受其他人工鱼的排斥作用,不能精确逼近极值点。可见,虽然的引入避免了人工鱼过度拥挤而陷入局部最优解,但是另一方面,该参数会使得位于极值点附件的人工鱼之间存在相互排斥的影响,而难以想极值点精确逼近。所以,对于某些局部极值不是很严重的具体问题,可以忽略拥挤的因素,从而在简化算法的同时也加快算法的收敛速度和提高结果的精确程度。 在这里插入图片描述

对追尾行为的描述 对追尾行为的描述

上图中,人工鱼 为人工鱼 在各自视野内的最优人工鱼,其食物浓度为 , 为以 为圆心,以视野为半径的圆,即能探知 的最远距离,人工鱼越靠近 ,状态越优。在极大值情况下:当 时,所有人工鱼 都执行追尾行为,向 移动;当 时,若 的食物浓度为 的等浓度食物圈,则 与 之间的人工鱼 、 、 执行追尾行为,向 移动,人工鱼 、 执行觅食行为。此时 越大,执行追尾行为的人工鱼越少,反之越多。

7 人工鱼群算法的特点 只需比较目标函数值,对目标函数的性质要求不高; 对初值的要求不高,随机产生或设置为固定值均可,鲁棒性强; 对参数设定的要求不高,容许范围大; 收敛速度较慢,但是具备并行处理能力; 具备较好的全局寻优能力,能快速跳出局部最优点; 对于一些精读要求不高的场合,可以用它快速得到一个可行解; 不需要问题的严格机理模型,甚至不需要问题的精确描述,这使得它的应用范围得以延伸。

二、源代码

clc
clear all
close all
tic
figure(1);hold on
ezplot('x*sin(10*pi*x)+2',[-1,2]);
%% 参数设置
fishnum=50; %生成50只人工鱼
MAXGEN=50; %最多迭代次数
try_number=100;%最多试探次数
visual=1; %感知距离
delta=0.618; %拥挤度因子
step=0.1; %步长
%% 初始化鱼群
lb_ub=[-1,2,1];
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
          %% 聚群行为
        [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),Ymax,'.','color',[gen/MAXGEN,0,0])
   
plot(bestx(1),besty,'ro','MarkerSize',100)
xlabel('x')
ylabel('y')
title('鱼群算法迭代过程中最优坐标移动')

%% 优化过程图
figure
plot(1:MAXGEN,BestY)
xlabel('迭代次数')
ylabel('优化值')
title('鱼群算法迭代过程')
disp(['最优解X:',num2str(bestx,'%1.4f')])
disp(['最优解Y:',num2str(besty,'%1.4f')])
toc
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<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
        Ynext=AF_foodconsistence(Xnext);
    else
        [Xnext,Ynext]=AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY);
    end
else
    [Xnext,Ynext]=AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY);
end

三、运行结果

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

四、备注

版本:2014a