人工鱼群算法Matlab实现

1 基本思想

  人工鱼群算法是一种基于模拟鱼群行为的优化算法,是由李晓磊等在2002年提出的一种新型的寻优算法。在一片水域中,鱼生存的数目最多的地方就是本水域中富含营养物质最多的地方,依据这一特点来模仿鱼群的觅食等行为,从而实现全局寻优,这就是鱼群算法的基本思想。
  在鱼类的活动中,可以分为觅食行为、聚群行为、追尾行为和随机行为这四种行为,如何利用简单有效的方式来构造实现这些行为将是算法实施的主要问题。
  觅食行为主要就是循着食物多的方向游动的一种行为,在寻优中则是向较优方向进行的迭代方式,如鱼群模式中的视觉概念;
  在聚群行为中,借鉴的思想对每条人工鱼规定了这样两个规则:
    1)尽量向邻近伙伴的中心移动;
    2)避免过分拥挤,这样就能基本实现人工鱼的聚群能力;
  追尾行为就是一种向临近的最活跃者追逐的行为,在寻优算法中可以理解为是向附近的最优化伙伴前进的过程;
  随机行为就是人工鱼在其视野内随机移动的行为,在寻优算法中这种行为有助于解跳出局部最优。

2 算法剖析

  假设在一个n维的目标搜索空间中,有N条组成一个群体的人工鱼,每天人工鱼个体的状态可表示为向量X=(x1,x2,…,xn)X=(x_1,x_2,…,x_n)X=(x1​,x2​,…,xn​),其中xi(i=1,……n)x_i(i=1,……n)xi​(i=1,……n)为欲寻优的变量:人工鱼当前所在位置的食物浓度表示为Y=f(X)Y=f(X)Y=f(X),其中f()f()f()为目标函数;人工鱼个体间距离表示为 d=∣∣xi−xj∣∣d=||x_i-x_j||d=∣∣xi​−xj​∣∣(这是二范数); visualvisualvisual表示人工鱼的感知范围,stepstepstep为人工鱼移动步长,δδδ为拥挤度因子;trynumbertrynumbertrynumber表示人工鱼每次觅食最大试探次数。

2.1 觅食行为

  指鱼循着食物多的方向游动的一种行为,人工鱼XiX_iXi​在其视野内随机选择一个状态XjX_jXj​,分别计算它们的目标函数值进行比较,如果发现YjY_jYj​比YiY_iYi​优(YjY_jYj​和YiY_iYi​分别为XjX_jXj​和XiX_iXi​的适应度值),则Xi向Xj的方向移动一步;否则,XiX_iXi​继续在其视野内选择状态XjX_jXj​,判断是否满足前进条件,反复尝试trynumbertrynumbertrynumber次后,仍没有满足前进条件,则随机移动一步使XiX_iXi​到达一个新的状态。表达式如下:
Xj=Xi+rand()∗visual(1)X_j=X_i+rand()*visual \tag{1}Xj​=Xi​+rand()∗visual(1)                 
Xnext=Xi+rand()∗step∗Xj−Xi∣∣Xj−Xi∣∣(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)
Xnext=Xi+rand()∗step(3)X_{next}=X_i+rand()*step \tag{3}Xnext​=Xi​+rand()∗step(3)                
  其中rand()是介于0和1之间的随机数。


人工鱼的视觉描述人工鱼的视觉描述人工鱼的视觉描述
  框架图如下所示:

伪代码段如下:

for i = 1:Nfor j = 1:Try_numberXj=x(i)+Visual.*rand();%人工鱼Xi按式(1)在其视野内随机选择一个状态Xjif 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;elseX_next=x(i)+step*rand();endend
end

2.2 聚群行为

  鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群 。人工鱼XiX_iXi​搜索其视野内(dij<visuald_{ij}<visualdij​<visual)的伙伴数目nfn_fnf​及中心位置XcX_cXc​,若Yc/nf<δYiY_c/n_f< δY_iYc​/nf​<δYi​(求极小值时使用小于号,在求极大值时则相反;YcY_cYc​和YiY_iYi​分别为XcX_cXc​和XiX_iXi​的适应度值),表明伙伴中心位置状态较优且不太拥挤,则XiX_iXi​朝伙伴的中心位置移动一步,否则执行觅食行为;
  框架图如下所示:

伪代码段如下:

nf=0;X_inside=0;
for i = 1:Nfor j = 1:N   if norm(x(j)-x(i))<Visual         % 求人工鱼Xi与其他人工鱼之间的距离nf = nf+1;                  %统计在视野范围内的鱼数量   X_inside= X_inside+x(j);    %将视野范围内的鱼进行累加endX_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进行觅食行动endend
end

2.3 追尾行为

  指鱼向其视野区域内的最优方向移动的一种行为。人工鱼XiX_iXi​搜索其视野内(dij<visuald_{ij}<visualdij​<visual)适应度最高的个体XjX_jXj​,其适应度值为YjY_jYj​,并探索人工鱼XjX_jXj​视野内的伙伴数目nfn_fnf​,若Yj/nf<δYiY_j/n_f< δY_iYj​/nf​<δYi​,表明XjX_jXj​状态较优且不太拥挤,则XiX_iXi​朝XjX_jXj​位置移动一步,否则执行觅食行为;
  框架图如下所示:

伪代码段如下:

Y_max=inf;nf=0;
for i = 1:N    %搜索人工鱼Xi视野范围内的最高适应度个体Xjfor 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));endend%搜索人工鱼Xj视野范围内的伙伴数量for j = 1:N        if(norm(x(j)-X_max)<Visual)       nf=nf+1;endendnf=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

2.4 算法总述

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

3 分析拥挤度因子δδδ

3.1 拥挤度因子的取值

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

3.2 拥挤度因子的作用机理

  对追尾行为的描述

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

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

3.2 拥挤度因子的影响

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

4 算法实现

%sum(sin(x)./x) 极小值
clear all;
close all;
clc;Visual = 25;   %人工鱼的感知距离
Step = 3;     %人工鱼的移动最大步长
N = 30;         %人工鱼的数量
dim=10;          %人工鱼维度
Try_number = 50;%迭代的最大次数
delta=27;     %拥挤度因子%测试函数
f=@(x) sum(x.^2);
ub=100;%边界上限
lb=-100;%边界下限d = [];%存储50个状态下的目标函数值;
Iteration = 1; %
Max_iteration = 500;%迭代次数%初始化人工鱼种群
x=lb+rand(N,dim).*(ub-lb);%计算10个初始状态下的适应度值;
for i = 1:Nfitness_fish(i) = f(x(i,:));
end
[best_fitness,I] = min(fitness_fish);         % 求出初始状态下的最优适应度;
best_x = x(I,:);             % 最优人工鱼;while Iteration<=Max_iterationfor i = 1:N%% 聚群行为nf_swarm=0;Xc=0;label_swarm =0;  %群聚行为发生标志%确定视野范围内的伙伴数目与中心位置for j = 1:N if norm(x(j,:)-x(i,:))<Visualnf_swarm = nf_swarm+1;  %统计在感知范围内的鱼数量   Xc = Xc+x(j,:);       %将感知范围内的鱼进行累加endendXc=Xc-x(i,:);   %需要去除本身;因为在 一开始计算时,i=j,把中心的鱼也进行了一次计算nf_swarm=nf_swarm-1;Xc = Xc/nf_swarm; %此时Xc表示视野范围其他伙伴的中心位置; %判断中心位置是否拥挤if  (f(Xc)/nf_swarm < delta*f(x(i,:))) && (f(Xc)<f(x(i,:)))     x_swarm=x(i,:)+rand*Step.*(Xc-x(i,:))./norm(Xc-x(i,:)); %边界处理ub_flag=x_swarm>ub;lb_flag=x_swarm<lb;x_swarm=(x_swarm.*(~(ub_flag+lb_flag)))+ub.*ub_flag+lb.*lb_flag;   x_swarm_fitness=f(x_swarm);else%觅食行为label_prey =0;    %判断觅食行为是否找到优于当前的状态for j = 1:Try_number%随机搜索一个状态x_prey_rand = x(i,:)+Visual.*(-1+2.*rand(1,dim));ub_flag2=x_prey_rand>ub;lb_flag2=x_prey_rand<lb;x_prey_rand=(x_prey_rand.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2;   %判断搜索到的状态是否比原来的好if f(x(i,:))>f(x_prey_rand)x_swarm = x(i,:)+rand*Step.*(x_prey_rand-x(i,:))./norm(x_prey_rand-x(i,:));ub_flag2=x_swarm>ub;lb_flag2=x_swarm<lb;x_swarm=(x_swarm.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2;   x_swarm_fitness=f(x_swarm);label_prey =1;break;endend%随机行为if label_prey==0x_swarm = x(i,:)+Step*(-1+2*rand(1,dim));ub_flag2=x_swarm>ub;lb_flag2=x_swarm<lb;x_swarm=(x_swarm.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2;   x_swarm_fitness=f(x_swarm);endend%% 追尾行为fitness_follow = inf;  label_follow =0;%追尾行为发生标记%搜索人工鱼Xi视野范围内的最高适应度个体Xjfor j = 1:N     if (norm(x(j,:)-x(i,:))<Visual) && (f(x(j,:))<fitness_follow)      best_pos = x(j,:);      fitness_follow = f(x(j,:));     endend%搜索人工鱼Xj视野范围内的伙伴数量nf_follow=0;for j = 1:N     if norm(x(j,:)-best_pos)<Visual   nf_follow=nf_follow+1;endendnf_follow=nf_follow-1;%去掉他本身%判断人工鱼Xj位置是否拥挤if (fitness_follow/nf_follow)<delta*f(x(i,:)) && (fitness_follow<f(x(i,:)))  x_follow = x(i,:)+rand*Step.*(best_pos-x(i,:))./norm(best_pos-x(i,:));%边界判定ub_flag2=x_follow>ub;lb_flag2=x_follow<lb;x_follow=(x_follow.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2;   label_follow =1;x_follow_fitness=f(x_follow);else%觅食行为label_prey =0;    %判断觅食行为是否找到优于当前的状态for j = 1:Try_number%随机搜索一个状态x_prey_rand = x(i,:)+Visual.*(-1+2.*rand(1,dim));ub_flag2=x_prey_rand>ub;lb_flag2=x_prey_rand<lb;x_prey_rand=(x_prey_rand.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2;   %判断搜索到的状态是否比原来的好if f(x(i,:))>f(x_prey_rand)x_follow = x(i,:)+rand*Step.*(x_prey_rand-x(i,:))./norm(x_prey_rand-x(i,:));ub_flag2=x_follow>ub;lb_flag2=x_follow<lb;x_follow=(x_follow.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2;   x_follow_fitness=f(x_follow);label_prey =1;break;endend%随机行为if label_prey==0x_follow = x(i,:)+Step*(-1+2*rand(1,dim));ub_flag2=x_follow>ub;lb_flag2=x_follow<lb;x_follow=(x_follow.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; x_follow_fitness=f(x_follow);endend% 两种行为找最优if x_follow_fitness<x_swarm_fitnessx(i,:)=x_follow;elsex(i,:)=x_swarm;endend%% 更新信息for i = 1:Nif (f(x(i,:))<best_fitness)best_fitness = f(x(i,:));best_x = x(i,:);endendConvergence_curve(Iteration)=best_fitness;Iteration = Iteration+1;if mod(Iteration,50)==0display(['迭代次数:',num2str(Iteration),'最优适应度:',num2str(best_fitness)]);display(['最优人工鱼:',num2str(best_x)]);end
endfigure('Position',[284   214   660   290])
subplot(1,2,1);
x=-100:1:100; y=x;
L=length(x);
for i=1:Lfor j=1:LF(i,j)=x(i).^2+y(j).^2;end
end
surfc(x,y,F,'LineStyle','none');
title('Test function')
xlabel('x_1');
ylabel('x_2');
zlabel(['sum','( x_1 , x_2 )'])
grid off subplot(1,2,2);
semilogy(Convergence_curve,'Color','b')
title('Convergence curve')
xlabel('Iteration');
ylabel('Best fitness');
axis tight
grid off
box on

结果如下:

人工鱼群算法Matlab实现相关推荐

  1. matlab球落点的数学建模,MATLAB数学建模:智能优化算法-人工鱼群算法

    MATLAB 数学建模: 人工鱼群算法 1. 基本原理 人工鱼群算法是一种受鱼群聚集规律而启发的优化算法. 在人工鱼群算法中, 我们假定鱼群的活动行为分为: 觅食行为, 群聚行为, 追随行为和随机行为 ...

  2. MATLAB实战系列(十二)-如何用人工鱼群算法解决带时间窗车辆路径(CVRP)问题(附MATLAB代码)

    前言: 本文大体的思路是先对人工鱼进行编码,然后采用人工鱼群算法求解TSP问题中的觅食.聚群.追尾和随机行为对人工鱼群进行更新. 但是亟需需要解决的问题是:对于CVRP问题,如何对人工鱼进行编码.如果 ...

  3. pm模型matlab算法,18基于遗传算法(粒子群算法、人工鱼群算法等)的投影寻踪模型MATLAB源代码...

    基于遗传算法(粒子群算法.人工鱼群算法等)的投影寻踪模型 MATLAB源代码 投影寻踪是一种处理多因素复杂问题的统计方法,其基本思路是将高维数据向低维空间进行投影,通过低维投影数据的散布结构来研究高维 ...

  4. 【BP数据预测】基于matlab人工鱼群算法优化BP神经网络数据预测【含Matlab源码 523期】

    一.人工鱼群算法简介 1 觅食行为   指鱼循着食物多的方向游动的一种行为,人工鱼X i X_iXi​在其视野内随机选择一个状态X j X_jXj​,分别计算它们的目标函数值进行比较,如果发现Y j ...

  5. 【AFSA TSP】基于matlab改进的人工鱼群算法求解旅行商问题【含Matlab源码 1479期】

    ⛄一. TSP简介 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须 ...

  6. 【AFSA TSP】基于matlab人工鱼群算法求解旅行商问题【含Matlab源码 422期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab人工鱼群算法求解旅行商问题[含Matlab源码 422期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  7. matlab实战系列之人工鱼群算法求解TSP问题原理解析(下篇源码解析)

    从算法的名字中可以看出该算法是群体智能优化算法中的一种,人工鱼群算法通过模拟鱼群的觅食.聚群.追尾.随机等行为在搜索域中进行寻优. 人工鱼群算法有三个比较重要的概念:视野范围.k-距离邻域.多条鱼的中 ...

  8. 模拟鱼群的matlab算法,IFSA人工鱼群算法

    [实例简介]人工鱼群算法是李晓磊等人提出的一种基于动物行为的群体智能优化算法[8],通过模拟鱼类觅食.聚群.追尾随机等行为在搜索范围中寻优.在实际应用中,人工鱼群算法对目标函数的性质.优化参数的初值和 ...

  9. Matlab基于人工鱼群算法求解TSP问题

    一. 人工鱼的结构模型 人工鱼是真实鱼抽象化.虚拟化的一个实体,其中封装了自身数据和一系列行为,可以接受环境的刺激信息,做出相应的活动.其所在的环境由问题的解空间和其他人工鱼的状态,它在下一时刻的行为 ...

  10. 【预测模型】基于人工鱼群算法优化BP神经网络实现数据预测matlab源码

    1 算法介绍 1.1 BP神经网络 1. 反向传播算法应用领域 反向传播算法应用较为广泛,从字面意思理解,与前向传播相互对应.在简单的神经网络中,反向传播算法,可以理解为最优化损失函数过程,求解每个参 ...

最新文章

  1. Python源码怎么读,听听顶级爬虫工程师的建议
  2. PMCAFF招兵啦~只要最骚最浪的你~
  3. mysql主从复制优化_MySql优化之主从复制
  4. visibility: hidden与display:none的区别
  5. 的有效 海思编码_【最佳案例展示】2020年CUVA“超高清视频创新产品与解决方案”全球首款8K@120解码芯片海思Hi3796CV300...
  6. SVD在推荐系统中的推导及应用-简单明了
  7. 为Android GridView 设置行背景
  8. 同济线性代数教材(第五版)-第2章 矩阵及其运算
  9. 移动,电信,中行软开,微软,百度等企业工作纯技术性分析
  10. ERC20 智能合约整数溢出系列漏洞披露
  11. 易飞9安装和授权视频
  12. VB编程:UCase转大写,LCase转小写-4_彭世瑜_新浪博客
  13. JAVA实现CRC16校验
  14. 蓝桥杯:C语言实现字母图形
  15. matlab中种子填充算法
  16. html如何给标题设置边框和底纹,给标题加边框怎么设置
  17. 修改新网域名DNS服务器到DNSPOD解析服务
  18. 中华云盒M1刷Linux教程,N1 盒子刷最新版 armbian 及软件安装
  19. 爱码物联SaaS“一物一码”实力在线!打造全新二维码营销模式
  20. innerHTML与innerText与outHTML与outText 的区别。

热门文章

  1. php文字成图片格式_使用PHP将文字转换成图片的功能实现方法
  2. 个人开发者上架Android应用市场
  3. C#实现图像下一张上一张
  4. 什么软件可以测试QQ特别关心,qq特别关心查询工具
  5. multisim连接MySQL_Multisim14使用multisim12元件库的方法
  6. account.php,account.php
  7. jedate change事件监控,使用jedate无法使用change事件
  8. amtlib.dll被McAfee删除之后?
  9. HenCoder「仿写酷界面」征稿
  10. 计算机拆机主板6个螺丝,iphone6主板拆机图解