一、基本原理
二、部分代码
function [Best_FF,Best_P,conv,X]=IAO(N,T,LB,UB,Dim,F_obj)
Best_P=zeros(1,Dim); %%初始化全局最优位置
Best_FF=inf; %%初始化全局最优适应度
% ★★改进①:Tent混沌映射种群初始化★★
X=Tent(N,Dim,UB,LB);
Xnew=X; %%新种群
Ffun=zeros(1,size(X,1)); %%记录上一轮种群适应度
Ffun_new=zeros(1,size(Xnew,1)); %%记录新种群适应度
t=1; %%迭代次数
alpha=0.1; %%开发参数
delta=0.1; %%开发参数
while t<T+1 %主循环
for i=1:size(X,1)
F_UB=X(i,:)>UB; %上界
F_LB=X(i,:)<LB; %下界
X(i,:)=(X(i,:).*(~(F_UB+F_LB)))+UB.*F_UB+LB.*F_LB; %参数越界
Ffun(1,i)=F_obj(X(i,:)); %计算种群适应度
if Ffun(1,i)<Best_FF %更新全局最优位置及其适应度
Best_FF=Ffun(1,i);
Best_P=X(i,:);
end
end
% % ★★改进②:自适应权重★★
Best_Pn=Best_P.*(1-exp(1-(T+t)/(T-t)));
Best_Pn= Bounds(Best_Pn,LB.*ones(1,Dim),UB.*ones(1,Dim));
Best_Fn=F_obj(Best_Pn);
if Best_Fn<Best_FF %更新全局最优位置及其适应度
Best_FF=Best_Fn;
Best_P=Best_Pn;
end
G2=2*rand()-1; %表示在搜索猎物期间用于跟踪猎物的AO的各种运动
G1=2*(1-(t/T)); %呈现从2到0的递减值,表示AO的飞行速率,用于跟踪猎物
to = 1:Dim; %维度矩阵
u = .0265; %固定的值,源码取0.0565
r0 = 10; %常数项,取1-20之间,用于固定搜索周期
r = r0 +u*to; %用于计算螺旋因子
omega = .005; %常数项
phi0 = 3*pi/2;
phi = -omega*to+phi0;
x = r .* sin(phi); %y和x用于表示搜索中的螺旋形状
y = r .* cos(phi);
QF=t^((2*rand()-1)/(1-T)^2); %表示在第t 次迭代时用于平衡搜索策略的质量函数
%开始更新种群
for i=1:size(X,1)
if t<=(2/3)*T
%扩大搜索过程X1:有利于AO算法实施更广阔的全局搜索
if rand <0.5
%围绕Best_P进行搜索,这反映了猎物的近似位置
Xnew(i,:)=Best_P(1,:)*(1-t/T)+(mean(X(i,:))-Best_P(1,:))*rand();
Xnew(i,:)= Bounds(Xnew(i,:),LB.*ones(1,Dim),UB.*ones(1,Dim));
Ffun_new(1,i)=F_obj(Xnew(i,:)); %计算适应度
if Ffun_new(1,i)<Ffun(1,i) %基于贪婪选择,判断新解是否更优,如果是则对其进行替换
X(i,:)=Xnew(i,:);
Ffun(1,i)=Ffun_new(1,i);
end
else
%缩小搜索范围X2:基于莱维飞行的种群变异,采用大步长-小步长的更新方式有利于算法跳出局部最优
Xnew(i,:)=Best_P(1,:).*Levy(Dim)+X((floor(N*rand()+1)),:)+(y-x)*rand;
Xnew(i,:)= Bounds(Xnew(i,:),LB.*ones(1,Dim),UB.*ones(1,Dim));
Ffun_new(1,i)=F_obj(Xnew(i,:)); %计算适应度
if Ffun_new(1,i)<Ffun(1,i) %基于贪婪选择,判断新解是否更优,如果是则对其进行替换
X(i,:)=Xnew(i,:);
Ffun(1,i)=Ffun_new(1,i);
end
end
%扩大开发阶段X3:当天鹰准确地指定了猎物区域,并且准备好着陆和攻击时,天鹰垂直下降并进行初步攻击,
%以发现猎物反应。这种方法称为低空慢降攻击。在这里,AO利用目标的选定区域接近猎物并进行攻击
else
if rand<0.5
% for j = 1:Dim
% c7=rand();
% GD=Best_P(1,j)-X(i,j)+randn();
% Xnew(i,j)=X(i,j)+GD*(1-c7^((1-(t/T))^2));
% end
Xnew(i,:)=(Best_P(1,:)-mean(X))*alpha-rand+((UB-LB)*rand+LB)*delta;
Xnew(i,:)= Bounds(Xnew(i,:),LB.*ones(1,Dim),UB.*ones(1,Dim));
Ffun_new(1,i)=F_obj(Xnew(i,:));
if Ffun_new(1,i)<Ffun(1,i) %更新当前位置最优解
X(i,:)=Xnew(i,:);
Ffun(1,i)=Ffun_new(1,i);
end
else
%扩大开发阶段X4:
% for j = 1:Dim
% c7=rand();
% GD=Best_P(1,j)-X(i,j)+randn();
% Xnew(i,j)=X(i,j)+GD*(1-c7^((1-(t/T))^2));
% end
Xnew(i,:)=QF*Best_P(1,:)-(G2*X(i,:)*rand)-G1.*Levy(Dim)+rand*G2; % Eq. (14)
Xnew(i,:)= Bounds(Xnew(i,:),LB.*ones(1,Dim),UB.*ones(1,Dim));
Ffun_new(1,i)=F_obj(Xnew(i,:));
if Ffun_new(1,i)<Ffun(1,i)
X(i,:)=Xnew(i,:);
Ffun(1,i)=Ffun_new(1,i);
end
end
end
end
%打印搜索进程
if mod(t,100)==0
display(['IAO算法在第', num2str(t), ' 次迭代中的适应度值为 ', num2str(Best_FF)]);
end
conv(t)=Best_FF;
t=t+1;
end
end
function o=Levy(d) %用于产生莱维飞行步长
beta=1.5;
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
u=randn(1,d)*sigma; %randn能产生高斯分布随机数
v=randn(1,d);step=u./abs(v).^(1/beta);
o=step;
ends
三、代码效果图
获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复智能优化算法本公众号致力于解决找代码难,写代码怵。各位有什么急需的代码,欢迎后台留言~不定时更新科研技巧类推文,可以一起探讨科研,写作,文献,代码等诸多学术问题,我们一起进步。