【元启发式优化算法】算术优化算法(AOA)

01.引言

算术优化算法 (AOA)利用数学中主要算术运算符的分布行为,包括 (乘法 、除法 、减法 和加法 )。AOA 经过数学建模和实现,可在广泛的搜索空间中执行优化过程。AOA 的性能根据 29 个基准函数和几个实际工程设计问题进行检查,以展示其适用性。通过不同的场景评估了所提出的 AOA 的性能、收敛行为和计算复杂性的分析。

02.优化算法的流程

​ 通常,基于群体的算法从一组随机生成的候选解决方案开始其改进过程(优化过程)。这组生成的解决方案通过一组优化规则逐步改进,并由特定的目标函数迭代评估;这就是优化方法的本质。由于基于群体的算法寻求随机找到优化问题的最佳解决方案,因此不能保证在一次运行中获得解决方案。然而,对于给定的问题,获得全局最优解的概率会因足够数量的随机解和优化迭代而增加。尽管元启发式算法在基于群体的优化方法领域存在差异,但优化过程包括两个主要阶段:探索与利用。前者是指使用算法的搜索代理来避免本地解决方案,从而广泛覆盖搜索空间。后者是在勘探阶段获得的解决方案的提高精度。

算术是数论的基本组成部分,它是现代数学的重要组成部分之一,与几何、代数和分析一样。算术运算符(即乘、除、减和加)是通常用于研究数字的传统计算度量我们使用这些简单的运算符作为数学优化,从一组候选备选方案(解决方案)中确定符合特定标准的最佳元素。从工程、经济学和计算机科学到运筹学和工业,所有定量学科都存在优化问题,求解技术的改进吸引了 Mathematics for Eras 的兴趣。拟议的 AOA 的主要灵感来自于在解决算术问题时使用算术运算符。在下面的小节中,将讨论算术运算符(即乘法、除法、减法和加法)的行为及其在所提出的算法中的影响。图 下显示了算术运算符的层次结构及其从外到内的主导地位。然后基于数学模型提出 AOA。

其伪代码如下:

03.论文中算法对比图

04.部分代码

% Arithmetic Optimization Algorithm, AOA
function [Best_FF,Best_P,Conv_curve]=AOA(N,M_Iter,LB,UB,Dim,F_obj)
% display('AOA Working');
%Two variables to keep the positions and the fitness value of the best-obtained solution


Best_P=zeros(1,Dim);
Best_FF=inf;
Conv_curve=zeros(1,M_Iter);


%Initialize the positions of solution
X=initialization(N,Dim,UB,LB);
Xnew=X;
Ffun=zeros(1,size(X,1));% (fitness values)
Ffun_new=zeros(1,size(Xnew,1));% (fitness values)


MOP_Max=1;
MOP_Min=0.2;
C_Iter=1;
Alpha=5;
Mu=0.499;




for i=1:size(X,1)
    Ffun(1,i)=F_obj(X(i,:));  %Calculate the fitness values of solutions
    if Ffun(1,i)<Best_FF
        Best_FF=Ffun(1,i);
        Best_P=X(i,:);
    end
end
    
    


while C_Iter<M_Iter+1  %Main loop
    MOP=1-((C_Iter)^(1/Alpha)/(M_Iter)^(1/Alpha));   % Probability Ratio 
    MOA=MOP_Min+C_Iter*((MOP_Max-MOP_Min)/M_Iter); %Accelerated function
   
    %Update the Position of solutions
    for i=1:size(X,1)   % if each of the UB and LB has a just value 
        for j=1:size(X,2)
           r1=rand();
            if (size(LB,2)==1)
                if r1<MOA
                    r2=rand();
                    if r2>0.5
                        Xnew(i,j)=Best_P(1,j)/(MOP+eps)*((UB-LB)*Mu+LB);
                    else
                        Xnew(i,j)=Best_P(1,j)*MOP*((UB-LB)*Mu+LB);
                    end
                else
                    r3=rand();
                    if r3>0.5
                        Xnew(i,j)=Best_P(1,j)-MOP*((UB-LB)*Mu+LB);
                    else
                        Xnew(i,j)=Best_P(1,j)+MOP*((UB-LB)*Mu+LB);
                    end
                end               
            end
            
           
            if (size(LB,2)~=1)   % if each of the UB and LB has more than one value 
                r1=rand();
                if r1<MOA
                    r2=rand();
                    if r2>0.5
                        Xnew(i,j)=Best_P(1,j)/(MOP+eps)*((UB(j)-LB(j))*Mu+LB(j));
                    else
                        Xnew(i,j)=Best_P(1,j)*MOP*((UB(j)-LB(j))*Mu+LB(j));
                    end
                else
                    r3=rand();
                    if r3>0.5
                        Xnew(i,j)=Best_P(1,j)-MOP*((UB(j)-LB(j))*Mu+LB(j));
                    else
                        Xnew(i,j)=Best_P(1,j)+MOP*((UB(j)-LB(j))*Mu+LB(j));
                    end
                end               
            end
            
        end
        
        Flag_UB=Xnew(i,:)>UB; % check if they exceed (up) the boundaries
        Flag_LB=Xnew(i,:)<LB; % check if they exceed (down) the boundaries
        Xnew(i,:)=(Xnew(i,:).*(~(Flag_UB+Flag_LB)))+UB.*Flag_UB+LB.*Flag_LB;
 
        Ffun_new(1,i)=F_obj(Xnew(i,:));  % calculate Fitness function 
        if Ffun_new(1,i)<Ffun(1,i)
            X(i,:)=Xnew(i,:);
            Ffun(1,i)=Ffun_new(1,i);
        end
        if Ffun(1,i)<Best_FF
        Best_FF=Ffun(1,i);
        Best_P=X(i,:);
        end
       
    end
    


    %Update the convergence curve
    Conv_curve(C_Iter)=Best_FF;
    
    %Print the best solution details after every 50 iterations
%     if mod(C_Iter,50)==0
%         display(['At iteration ', num2str(C_Iter), ' the best solution fitness is ', num2str(Best_FF)]);
%     end
     
    C_Iter=C_Iter+1;  % incremental iteration
   
end
end
%%
function X=initialization(N,Dim,UB,LB)


B_no= size(UB,2); % numnber of boundaries


if B_no==1
    X=rand(N,Dim).*(UB-LB)+LB;
end


% If each variable has a different lb and ub
if B_no>1
    for i=1:Dim
        Ub_i=UB(i);
        Lb_i=LB(i);
        X(:,i)=rand(N,1).*(Ub_i-Lb_i)+Lb_i;
    end
end
end

05.本代码效果图

获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复代码清单本公众号致力于解决找代码难,写代码怵。各位有什么急需的代码,欢迎后台留言~不定时更新科研技巧类推文,可以一起探讨科研,写作,文献,代码等诸多学术问题,我们一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MATLAB科研小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值