💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞💞💞💞💞💞💞💞💞💥💥💥💥💥💥💥💥
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
🔊博主简介:985研究生,Matlab领域科研开发者;
🚅座右铭:行百里者,半于九十。
🏆代码获取方式:
优快云 Matlab武动乾坤—代码获取方式
更多Matlab优化求解仿真内容点击👇
①Matlab优化求解(进阶版)
⛳️关注优快云 Matlab武动乾坤,更多资源等你来!!
⛄一、人工鱼群算法
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
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
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
4 算法总述
综上所述,算法在运算过程中,会同时进行聚群和追尾行为。而觅食行为属于这两种行为中发现聚群对象或者追尾对象附近拥挤度过大时,人工鱼选择的行为方式,若在觅食过程中,未发现比自身适应度高的人工鱼,则按步长step随机移动。最后对聚群行为和追尾行为得到的适应度值进行比较,选择优秀的人工鱼作为下一代的个体。其总框架图如下:
2 分析拥挤度因子δ δδ
2.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]δ=αnmax1,α∈(0,1]
其中α αα为极值接近水平,n m a x n_{max}nmax为期望在该邻域内聚集的最大人工鱼数目。
2.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}}δ=αnmax1
δ n f = n f α n m a x ≤ 1 δn_f =\frac{n_f}{αn_{max}}\leq 1δnf=αnmaxnf≤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 }δnfYj的等浓度食物圈,则C2与C1间的人工鱼af1、af2、af3执行追尾行动,向af0游动,人工鱼af4、af5执行觅食行为。此时δnf 越大执行追尾行动的人工鱼越少,反之越多。
2.3 拥挤度因子的影响
以极大值为例(极小值的情况正好和极大值相反), δ δδ越大,表明允许的拥挤程度越小,人工鱼摆脱局部最优的能力越强;但是收敛的速度会有所减缓,这主要因为人工鱼在逼近极值的同时,会因避免过分拥挤而随机走开或者受其它人工鱼的排斥作用,不能精确逼近极值点。可见,δ δδ的引入避免了人工鱼过度拥挤而陷入局部极值,另一方面,该参数会使得位于极值点附近的人工鱼之间存在相互排斥的影响,而难以向极值点精确逼近,所以,对于某些局部极值不是很严重的具体问题,可以忽略拥挤的因素,从而在简化算法的同时也加快了算法的收敛速度和提高结果的精确程度。
⛄二、部分源代码
clear all;
close all;
clc;
%AFSA参数设置
Visual = 25; %人工鱼的感知距离
Step = 3; %人工鱼的移动最大步长
N = 30; %人工鱼的数量
dim = 24; %人工鱼的维度
Try_number = 500;%迭代的最大次数
delta=27; %拥挤度因子
Iteration = 1; %迭代计数器
Max_iteration = 500;%迭代次数
%WSN参数设置
WSNpoint = dim; %传感器节点数
width=20; %边界宽度
R=2.5; %感知半径
ub=ones(1,dim*2).width; %上界
lb=zeros(1,dim2); %下界
%覆盖率计算函数
f=@(x) coverage(x,WSNpoint,R,width);
%初始化人工鱼种群
for i = 1:N
x(i,:)=lb+rand(1,dim2).(ub-lb);
end
%计算初始状态下的适应度值;
for i = 1:N
fitness_fish(i) = f(x(i,:));
end
[best_fitness,I] = max(fitness_fish); % 求出初始状态下的最优适应度;
best_x = x(I,:); % 最优人工鱼;
while Iteration<=Max_iteration
for i = 1:N
%% 聚群行为
nf_swarm=0;
Xc=0;
label_swarm =0; %群聚行为发生标志
%确定视野范围内的伙伴数目与中心位置
for j = 1:N
if norm(x(j,:)-x(i,:))<Visual
nf_swarm = nf_swarm+1; %统计在感知范围内的鱼数量
Xc = Xc+x(j,:); %将感知范围内的鱼进行累加
end
end
Xc=Xc-x(i,:); %需要去除本身;因为在 一开始计算时,i=j,把中心的鱼也进行了一次计算
nf_swarm=nf_swarm-1;
Xc = Xc/nf_swarm; %此时Xc表示视野范围其他伙伴的中心位置;
%判断中心位置是否拥挤
if (f(Xc)/nf_swarm < deltaf(x(i,:))) && (f(Xc)>f(x(i,:)))
x_swarm=x(i,:)+randStep.(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,dim2));
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,:)+randStep.(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;
end
end
%随机行为
if label_prey==0
x_swarm = x(i,:)+Step(-1+2rand(1,dim2));
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);
end
end
%% 追尾行为
fitness_follow = -inf;
label_follow =0;%追尾行为发生标记
%搜索人工鱼Xi视野范围内的最高适应度个体Xj
for j = 1:N
if (norm(x(j,:)-x(i,:))<Visual) && (f(x(j,:))>fitness_follow)
best_pos = x(j,:);
fitness_follow = f(x(j,:));
end
end
%搜索人工鱼Xj视野范围内的伙伴数量
nf_follow=0;
for j = 1:N
if norm(x(j,:)-best_pos)<Visual
nf_follow=nf_follow+1;
end
end
nf_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*2));
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;
end
end
%随机行为
if label_prey==0
x_follow = x(i,:)+Step*(-1+2*rand(1,dim*2));
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);
end
end
⛄三、运行结果
⛄四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]尹向兵,吴良超.基于周期果蝇算法的无线传感网覆盖优化[J].赤峰学院学报(自然科学版). 2017,33(16)
[2]王欣阳,王瑞阳,魏云冰.基于算术优化算法的低压配电网故障区段定位方法[J].电子科技.
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除
🍅 仿真咨询
1 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化
2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断
3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知
4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化
5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配
6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化
7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化
8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置
9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长
10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合