【智能优化算法】改进的AO算法(IAO)

一、基本原理

二、部分代码

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科研小白的个人公众号(即文章下方二维码),并回复智能优化算法本公众号致力于解决找代码难,写代码怵。各位有什么急需的代码,欢迎后台留言~不定时更新科研技巧类推文,可以一起探讨科研,写作,文献,代码等诸多学术问题,我们一起进步。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB科研小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值