【优化求解】人工鱼群算法AF matlab源码

一、简介

1.1 觅食行为
  指鱼循着食物多的方向游动的一种行为,人工鱼X i X_iXi​在其视野内随机选择一个状态X j X_jXj​,分别计算它们的目标函数值进行比较,如果发现Y j Y_jYj​比Y i Y_iYi​优(Y j Y_jYj​和Y i Y_iYi​分别为X j X_jXj​和X i X_iXi​的适应度值),则Xi向Xj的方向移动一步;否则,X i X_iXi​继续在其视野内选择状态X j X_jXj​,判断是否满足前进条件,反复尝试t r y n u m b e r trynumbertrynumber次后,仍没有满足前进条件,则随机移动一步使X i X_iXi​到达一个新的状态。表达式如下:
X j = X i + r a n d ( ) ∗ v i s u a l (1) X_j=X_i+rand()*visual \tag{1}Xj​=Xi​+rand()∗visual(1)                
X n e x t = X i + r a n d ( ) ∗ s t e p ∗ X j − X i ∣ ∣ X j − X i ∣ ∣ (2) X_{next}=X_i+rand()step\frac{X_j-X_i}{\left | \left | X_j-X_i \right | \right |}\tag{2}Xnext​=Xi​+rand()∗step∗∣∣Xj​−Xi​∣∣Xj​−Xi​​(2)
X n e x t = X i + r a n d ( ) ∗ s t e p (3) X_{next}=X_i+rand()*step \tag{3}Xnext​=Xi​+rand()∗step(3)                
  其中rand()是介于0和1之间的随机数。
在这里插入图片描述
人 工 鱼 的 视 觉 描 述 人工鱼的视觉描述人工鱼的视觉描述
  框架图如下所示:
在这里插入图片描述
伪代码段如下:

for i = 1:N
	for j = 1:Try_number
        Xj=x(i)+Visual.*rand();%人工鱼Xi按式(1)在其视野内随机选择一个状态Xj
        if f(Xj)<f(x(i))	   %比较Xj和Xi的适应度
            X_next= x(i)+rand()*step*(Xj-x(i))/norm(Xj-x(i)); %人工鱼Xi按式(2)朝着Xj方向移动一步,norm()函数表示二范数 
            break;
        else
        	X_next=x(i)+step*rand();
        end
    end
end

1.2 聚群行为

鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群 。人工鱼X i X_iXi​搜索其视野内(d i j < v i s u a l d_{ij}<visualdij​<visual)的伙伴数目n f n_fnf​及中心位置X c X_cXc​,若Y c / n f < δ Y i Y_c/n_f< δY_iYc​/nf​<δYi​(求极小值时使用小于号,在求极大值时则相反;Y c Y_cYc​和Y i Y_iYi​分别为X c X_cXc​和X i X_iXi​的适应度值),表明伙伴中心位置状态较优且不太拥挤,则X i X_iXi​朝伙伴的中心位置移动一步,否则执行觅食行为;
  框架图如下所示:
在这里插入图片描述
伪代码段如下:

nf=0;X_inside=0;
for i = 1:N
    for j = 1:N   
        if norm(x(j)-x(i))<Visual 		% 求人工鱼Xi与其他人工鱼之间的距离
            nf = nf+1;                  %统计在视野范围内的鱼数量   
            X_inside= X_inside+x(j);    %将视野范围内的鱼进行累加
        end
         X_inside=X_inside-x(i);  		%需要去除Xi本身;因为在 一开始计算时,i=j,把中心的鱼也进行了一次计算
         nf=nf-1;   
         Xc = X_inside/nf; 				%此时Xc表示Xi感知范围其他伙伴的中心位置; 
         if  f(Xc)/nf < δ*f(x(i))
            x_next=x(i)+rand*Step*(Xc-x(i))/norm(Xc-x(i)); 
         else
             进行觅食行动
         end
    end
end

1.3 追尾行为

指鱼向其视野区域内的最优方向移动的一种行为。人工鱼X i X_iXi​搜索其视野内(d i j < v i s u a l d_{ij}<visualdij​<visual)适应度最高的个体X j X_jXj​,其适应度值为Y j Y_jYj​,并探索人工鱼X j X_jXj​视野内的伙伴数目n f n_fnf​,若Y j / n f < δ Y i Y_j/n_f< δY_iYj​/nf​<δYi​,表明X j X_jXj​状态较优且不太拥挤,则X i X_iXi​朝X j X_jXj​位置移动一步,否则执行觅食行为;
  框架图如下所示:
在这里插入图片描述
伪代码段如下:

Y_max=inf;nf=0;
for i = 1:N    
    %搜索人工鱼Xi视野范围内的最高适应度个体Xj
    for j = 1:N     
        if norm(x(j)-x(i))<Visual && f(x(j))<Y_max		% 求人工鱼Xi与其他人工鱼之间的距离
            X_max=x(j);        
            Y_max=f(x(j));
        end
    end
    %搜索人工鱼Xj视野范围内的伙伴数量
    for j = 1:N        
        if(norm(x(j)-X_max)<Visual)       
            nf=nf+1;
        end
    end
    nf=nf-1;%去掉他本身
    if Y_max/nf<delta*f(x(i))
        x_next= x(i,:)+rand*Step.*(temp_maxX-x(i,:))./norm(temp_maxX-x(i,:));
    else
        进行觅食行为;
    end
end

1.4 算法总述

综上所述,算法在运算过程中,会同时进行聚群和追尾行为。而觅食行为属于这两种行为中发现聚群对象或者追尾对象附近拥挤度过大时,人工鱼选择的行为方式,若在觅食过程中,未发现比自身适应度高的人工鱼,则按步长step随机移动。最后对聚群行为和追尾行为得到的适应度值进行比较,选择优秀的人工鱼作为下一代的个体。其总框架图如下:
在这里插入图片描述
3 分析拥挤度因子δ δδ
3.1 拥挤度因子的取值

在求极小值问题中:δ = α n m a x , α ∈ ( 0 , 1 ] δ=αn_{max}, α∈(0,1]δ=αnmax​,α∈(0,1]
  在求极大值问题中:δ = 1 α n m a x , α ∈ ( 0 , 1 ] δ=\frac{1}{αn_{max}},α∈(0,1]δ=αnmax​1​,α∈(0,1]
  其中α αα为极值接近水平,n m a x n_{max}nmax​为期望在该邻域内聚集的最大人工鱼数目。

3.2 拥挤度因子的作用机理

对追尾行为的描述
在这里插入图片描述
图中af0为人工鱼af1-5在各自视野内的最优人工鱼,其实物浓度为Y j Y_jYj​,C1为以af0为圆心,以视野范围为半径的圆,即能探知af0的最远距离,人工鱼越靠近af0,状态越优。
  求极大值情况下:当δ n f ≤ 1 δn_f\leq 1δnf​≤1时,所有人工鱼af1-5都执行追尾行为,向af0游动;
δ = 1 α n m a x δ=\frac{1}{αn_{max}}δ=αnmax​1​
δ n f = n f α n m a x ≤ 1 δn_f =\frac{n_f}{αn_{max}}\leq 1δnf​=αnmax​nf​​≤1
  当α αα=1的时候,可以明显看出来n f ≤ n m a x n_f \leq n_{max}nf​≤nmax​,即说明人工鱼视野范围内不拥挤。

当δ n f > 1 δn_f >1δnf​>1时,若C2的食物浓度为Y j δ n f \frac{Y_j}{δn_f }δnf​Yj​​的等浓度食物圈,则C2与C1间的人工鱼af1、af2、af3执行追尾行动,向af0游动,人工鱼af4、af5执行觅食行为。此时δnf 越大执行追尾行动的人工鱼越少,反之越多。

扫描二维码关注公众号,回复: 12449219 查看本文章

3.2 拥挤度因子的影响

以极大值为例(极小值的情况正好和极大值相反), δ δδ越大,表明允许的拥挤程度越小,人工鱼摆脱局部最优的能力越强;但是收敛的速度会有所减缓,这主要因为人工鱼在逼近极值的同时,会因避免过分拥挤而随机走开或者受其它人工鱼的排斥作用,不能精确逼近极值点。可见,δ δδ的引入避免了人工鱼过度拥挤而陷入局部极值,另一方面,该参数会使得位于极值点附近的人工鱼之间存在相互排斥的影响,而难以向极值点精确逼近,所以,对于某些局部极值不是很严重的具体问题,可以忽略拥挤的因素,从而在简化算法的同时也加快了算法的收敛速度和提高结果的精确程度。

二、源代码

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=[-3,3,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);
    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

三、运行结果

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

四、备注

完整代码或者代写添加QQ1575304183

往期回顾>>>>>>

【优化求解】混沌粒子群matlab源码

【优化求解】土狼算法matlab源码

【优化求解】基于混沌反向学习改进灰狼算法matlab源码

【优化求解】粒子群优化灰狼算法matlab源码

【优化求解】改进灰狼算法求解重油热解模型matlab源码

【多目标优化求解】多目标灰狼优化算法MOGWOmatlab源码

【多目标优化求解】基于金鹰算法(MOGEO)的多目标优化求解matlab源码

【优化求解】蜉蝣算法matlab源码

【优化求解】平衡优化器算法matlab源码

【优化求解】麻雀算法matlab源码

【优化求解】探路者优化算法matlab源码

【优化求解】改进的萤火虫算法matlab源码

【优化求解】磷虾群算法(Krill Herd Algorithm,KHA)

【优化求解】差分进化算法(Differential Evolution)matlab源码

【优化求解】冠状病毒群体免疫优化算法(CHIO)matlab源码

【优化求解】金鹰优化求解算法(GEO)matlab源码

【优化求解】基于黄金正弦算法GoldSA智能优化算法matlab源码

【优化求解】遗传优化隶属度函数matlab源码

【优化求解】多目标智能算法优化求解matlab工具箱

猜你喜欢

转载自blog.csdn.net/qq_34763204/article/details/113746356