2023年智能算法之双曲正弦余弦优化器(SCHO),原理公式详解,附matlab代码

双曲正弦余弦优化器(Sinh Cosh Optimizer,SCHO)是一种新型元启发式算法,该算法基于双曲正弦和双曲余弦特性的数学启发,具有进化能力强、搜索速度快、寻优能力强的特点。该成果于2023年10月发表在SCI一区,Top顶刊Knowledge-Based Systems上。

SCHO的灵感来源有三点。首先,如何在勘探和开发之间取得平衡是一个巨大的挑战,其次,面对复杂多样的问题,仍需要提出新的元启发式算法。最后,基于数学启发的优化算法的提出,如sin、cos算法和算术优化算法(AOA),为研究元启发式算法指明了一个新的可能方向。双曲函数是三角函数中常见的一类,其中sinh和cosh是最基本的双曲函数。元启发式算法可以利用cosh和sinh的两个特性。一是cosh值总是大于1,这是勘探与开发的关键边界,另一种是sinh值在−1,1区间内,且接近于零,可以提高勘探开发效率。

算法原理

(1)初始化阶段

与其他元启发式算法一样,SCHO也从随机初始化一组候选解开始。初始化的候选解的数学公式如下所示: 其中X是由以下公式得到的随机候选解集合, 表示第i个解的第j个位置,N表示候选解的个数,dim为问题维数。 其中rand表示0,1中的随机值,ub和lb分别为变量的上界和下界。

(2)勘探阶段

在本研究中,探索下一个位置仍然与它的位置有关,并得到了迄今为止的最优解。在优化过程中,探索分为两个阶段,应该存在于以后的迭代中,以逃避局部最优。在这两个阶段之间切换的值通过以下数学公式: 其中Max迭代表示迭代的最大值,floor是MATLAB中向下舍入的函数,ct是用于设置两相切换点的系数。在第一阶段中,在早期的迭代中,搜索代理位置附近的搜索空间外部将被探索,然后搜索代理将逐渐接近获得的最佳解。第一阶段勘探位置更新函数的数学公式如下所示: 其中t表示当前迭代, 、 分别表示第i个解在当前迭代和下次迭代中的第j个位置; 为到目前为止得到的最优解的第j个位置,r1,r2为区间0,1内的随机数; 为第一勘探阶段 的权重系数,控制第一阶段候选解远离自身,逐渐向最优解探索,通过以下公式计算得到。 其中 为单调递减函数,由以下公式计算, 和 为0,1中的随机数; 是控制第一阶段勘探精度的敏感系数,固定为0.388; 从一个很小的值逐渐减小,这说明了自身位置对于位置更新的重要性,因此,候选解在第一阶段逐渐远离自己,然后寻找最优解。其中 为控制勘探精度的敏感系数,根据本案例实验,其值为0.45。 在第二阶段的探索中,搜索代理几乎不受最佳解的影响,因此它们基于当前位置进行无方向性的探索。其位置更新函数的数学公式如下所示: 其中,ε是一个极小的正数,根据本文实验,ε为0.003。W2为第二勘探阶段最佳的 的权重系数, 乘以ε大大削弱了最优解对当前解的影响,从而导致对 周围的候选解进行无向随机勘探,W2由以下公式计算得到: 其中r6为0,1中的随机数,a2为用以下公式计算得到的单谐递减函数: 式中,n为控制第二阶段勘探精度的敏感系数,根据本文实验,取值为0.5。

(3)开发阶段

为了充分利用搜索空间,开发分为两个阶段,在整个迭代过程中进行。在第一个开发阶段,开发了X的邻近空间,因此开发公式如下表示: 其中 , 属于区间0,1中的随机数。 是第一阶段开发的权重系数,它控制候选解从近到远地开发其周围的搜索空间,其数学公式如下所示: 其中 , 是0,1中的随机数,a1已由上面公式定义,u与第一勘探阶段相同,固定为0.388。

在开发的第二阶段,候选解将围绕迄今为止获得的最优解进行深度开发,并且围绕最优解的开发强度将随着迭代次数的增加而增加。位置更新函数如下所示: 其中 、 是区间0,1中的随机数, 控制第二开发阶段的程度,它的绝对值在后面的迭代中逐渐增加,增加了开发程度。方程中绝对值前面的系数用于保持候选解的多样性。

(4)有界搜索策略

为了充分利用潜在的搜索空间,在SCHO中采用了一种类似于后期动物狩猎的策略,称为有界搜索策略。通过在早期迭代中探索整个搜索区域,可以找到潜在的搜索空间。为了充分挖掘和利用潜力空间,首先将所有候选解随机初始化到该潜力空间中,然后对该空间进行深度挖掘和利用。该策略的每一开始都是通过以下公式计算: 其中k是从1开始的正整数, 由以下公式计算, 分别表示开始当前和下一个有界搜索策略的迭代次数。α是一个敏感系数,它控制着潜空间深部勘探开发的精度,本实验通过实验将α取为4.6。 其中β控制启动有界搜索策略的值,并设置为1.55。当SCHO每次都使用有界搜索策略时,优化问题的上界和下界将使用以下公式计算:

其中 和 表示潜在搜索空间的上界和下界, 表示次优解的第 个位置。

果展示

以为CEC2005函数集为例,进行结果展示:

MATLAB核心代码

properties 复制代码
function [Destination_fitness,Destination_position,Convergence_curve]=SCHO(N,Max_iteration,lb,ub,dim,fobj)


Destination_position=zeros(1,dim);
Destination_fitness=inf;
Destination_position_second=zeros(1,dim);
Convergence_curve=zeros(1,Max_iteration);
Position_sort = zeros(N,dim);
%Initialize SCHO parameters
u=0.388;
m=0.45;
n=0.5;
p=10;
q=9;
Alpha=4.6;
Beta=1.55;
BS=floor(Max_iteration/Beta);
ct=3.6;
T=floor(Max_iteration/ct);
BSi=0;
BSi_temp=0;
ub_2=ub;
lb_2=lb;
%Initialize the set of random solutions
X=initialization(N,dim,ub,lb);
Objective_values = zeros(1,size(X,1));
% Calculate the fitness of the first set and find the best one
for i=1:size(X,1)
    Objective_values(1,i)=fobj(X(i,:));
    if Objective_values(1,i)<Destination_fitness
        Destination_position=X(i,:);
        Destination_fitness=Objective_values(1,i);
    end
end
Convergence_curve(1)=Destination_fitness;
t=2; 
%Main loop
while t<=Max_iteration    
    for i=1:size(X,1) % in i-th solution
        for j=1:size(X,2) % in j-th dimension
            %update A by using Eq. (17)
            cosh2=(exp(t/Max_iteration)+exp(-t/Max_iteration))/2;
            sinh2=(exp(t/Max_iteration)-exp(-t/Max_iteration))/2;
            r1=rand();
            A=(p-q*(t/Max_iteration)^(cosh2/(sinh2)))*r1; 
            % enter the bounded search strategy
            if t==BSi
ub_2=Destination_position(j)+(1-t/Max_iteration)*abs(Destination_position(j)-Destination_position_second(j));
lb_2=Destination_position(j)-(1-t/Max_iteration)*abs(Destination_position(j)-Destination_position_second(j));
                if ub_2>ub
                    ub_2=ub;
                end
                if lb_2<lb
                    lb_2=lb;
                end
                X=initialization(N,dim,ub_2,lb_2);                
                BSi_temp=BSi;
                BSi=0;
            end
        % the first phase of exploration and exploitation    
        if t<=T%3.6-3.62  
            r2=rand();
            r3=rand();
            a1=3*(-1.3*t/Max_iteration+m);
            r4=rand();
            r5=rand();
            if A>1
                sinh=(exp(r3)-exp(-r3))/2;
                cosh=(exp(r3)+exp(-r3))/2;
                W1=r2*a1*(cosh+u*sinh-1);
                if r5<=0.5
                    X(i,j)=Destination_position(j)+r4*W1*X(i,j);
                else
                    X(i,j)=Destination_position(j)-r4*W1*X(i,j);  
                end                
            else
                sinh=(exp(r3)-exp(-r3))/2;
                cosh=(exp(r3)+exp(-r3))/2;
                W3=r2*a1*(cosh+u*sinh);
                if r5<=0.5
                    X(i,j)=Destination_position(j)+r4*W3*X(i,j);
                else
                    X(i,j)=Destination_position(j)-r4*W3*X(i,j);  
                end
            end
        else
            % the second phase of exploration and exploitation
            r2=rand();
            r3=rand();
            a2=2*(-t/Max_iteration+n);
            W2=r2*a2;
            r4=rand();
            r5=rand();
            if A<1
                sinh=(exp(r3)-exp(-r3))/2;
                cosh=(exp(r3)+exp(-r3))/2;
                X(i,j)= X(i,j)+(r5*sinh/cosh*abs(W2*Destination_position(j)-X(i,j)));
            else
                if r4<=0.5
                    X(i,j)=X(i,j)+(abs(0.003*W2*Destination_position(j)-X(i,j)));
                else
                    X(i,j)=X(i,j)+(-abs(0.003*W2*Destination_position(j)-X(i,j)));  
                end
            end 
        end
        end
        BSi=BSi_temp;
    end
    for i=1:size(X,1)         
        % Check if solutions go outside the search spaceand bring them back
        Flag4ub=X(i,:)>ub_2;
        Flag4lb=X(i,:)<lb_2;
        X(i,:)=(X(i,:).*(~(Flag4ub+Flag4lb)))+(ub_2+lb_2)/2.*Flag4ub+lb_2.*Flag4lb;        
        % Calculate the objective values
        Objective_values(1,i)=fobj(X(i,:));
%         % Update the destination if there is a better solution
        if Objective_values(1,i)<Destination_fitness
            Destination_position=X(i,:);
            Destination_fitness=Objective_values(1,i);
        end
    end
    %find the second solution
    if t==BS
        BSi=BS+1;
        BS=BS+floor((Max_iteration-BS)/Alpha);
        temp = zeros(1,dim);
        temp2 = zeros(N,dim);
 %sorting
        for i=1:(size(X,1)-1)
          for j=1:(size(X,1)-1-i)
            if Objective_values(1,j) > Objective_values(1,j+1)
              temp(1,j) = Objective_values(1,j);
              Objective_values(1,j) = Objective_values(1,j+1);
              Objective_values(1,j+1) = temp(1,j);
              temp2(j,:) = Position_sort(j,:);
              Position_sort(j,:) = Position_sort(j+1,:);
              Position_sort(j+1,:) = temp2(j,:);   
                end
            end
        end
        Destination_position_second=Position_sort(2,:);%the second solution
    end
    Convergence_curve(t)=Destination_fitness;
    t=t+1;
end

参考文献

1 Bai J, Li Y, Zheng M, et al. A sinh cosh optimizerJ. Knowledge-Based Systems, 2023, 282: 111081.

完整代码获取方式:后台回复关键字:

TGDM101

相关推荐
Scott9999HH6 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社7 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海7 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖8 小时前
JDK 26 新特性详解
java·开发语言
马优晨9 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区10 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大11 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai11 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜11 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa11 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio