蛇优化算法(SO),浅谈改进思路,MATLAB代码直接复制,

今天为大家带来的智能算法是:蛇优化算法(Snake Optimizer, SO),该算法是Hashim, F. A.和 Hussien, A. G两位教授于2022年提出的优化算法,其算法灵感来蛇的觅食和繁殖行为和模式。

01 算法原理简述

模拟了蛇在不同温度、不同食物条件下的不同行为模式,进行最优值的寻找。 SO 算法的灵感来源于蛇的交配模式。只有在温度较低且食物可用的条件下,蛇才会发生交配行为;否则蛇只 会寻找食物或者吃现有的食物。基于此,将考虑蛇优化算法的搜索过程分为两个阶段,即勘探和开发。勘探模式发生在食物不足的情况下,在该模式下蛇种 群的每一个个体都会四处勘探寻找食物。如果食物充足,蛇将处于开发模式。在温度较高的情 况下,蛇会关注与吃可用的食物;而在温度下较低的情况 下,就会发生交配过程。在交配过程中,蛇种群可能会发 生战斗,雄性间会相互战斗以获得最佳的雌性,雌性亦然。待交配完成后,雌性就会产卵,并选择是否孵化来替代现 种群中最差的雄性和雌性个体,如下图所示。

7586bb4f8f74bb523e7f79a03c85e783.png

算法流程图:

da3092246b96867c7e57e4d7f99dca24.jpeg

参考文献:[1]李圣涵,叶琳琳.基于蛇优化算法的Otsu图像分割方法[J].国外电子测量技术,2023,42(02):30-37.

02 算法效果展示

在CEC2005函数进行测试,种群个数设置为50,迭代次数为1000次,并与灰狼算法和粒子群算法进行比较。

5b067324ac56577560aa95895e326e38.png

ac82cd3ee11d986879eac12f06aa96a1.png

de3cb19aa755544dad42e83e88d3301d.png

5d7ef9b24f4e07796f518c661ec9dc86.png

9f1f1d49e3574d1990b681b8109fb7c7.png

浅浅分析一下蛇算法的曲线,在F1,F5,F10这种单目标优化的问题上,前期的搜索效果并不好,这个时候大家可以加上混沌映射的方法,增加粒子多样性,增强全局搜索能力,必然会有奇效。对于F10这样的优化问题,可以加一些黄金正弦或者莱维飞行的方式增强跳出局部最优解的能力。

关于莱维飞行,黄金正弦,混沌映射前期的文章已经讲了很多了,这一期就不给大家加了,想自己改进的小伙伴可以参考前期的这几个文章。融合黄金正弦,十种混沌映射,搞定!把把最优值,本文思路可用于所有智能算法的改进基于改进莱维飞行和混沌映射(10种混沌映射随意切换)的金鹰优化算法,附matlab代码

03 蛇算法的完整代码,可直接复制

function [Xfood, fval,gbest_t] = SO(N,T,fobj, dim,lb,ub)
%initial 
vec_flag=[1,-1];
Threshold=0.25;
Thresold2= 0.6;
C1=0.5;
C2=.05;
C3=2;
X=lb+rand(N,dim)*(ub-lb);
for i=1:N
 fitness(i)=feval(fobj,X(i,:));   
end
[GYbest, gbest] = min(fitness);
Xfood = X(gbest,:);
%Diving the swarm into two equal groups males and females
Nm=round(N/2);%eq.(2&3)
Nf=N-Nm;
Xm=X(1:Nm,:);
Xf=X(Nm+1:N,:);
fitness_m=fitness(1:Nm);
fitness_f=fitness(Nm+1:N);
[fitnessBest_m, gbest1] = min(fitness_m);
Xbest_m = Xm(gbest1,:);
[fitnessBest_f, gbest2] = min(fitness_f);
Xbest_f = Xf(gbest2,:);
for t = 1:T
    Temp=exp(-((t)/T));  %eq.(4)
  Q=C1*exp(((t-T)/(T)));%eq.(5)
    if Q>1        Q=1;    end
    % Exploration Phase (no Food)
if Q<Threshold
    for i=1:Nm
        for j=1:1:dim
            rand_leader_index = floor(Nm*rand()+1);
            X_randm = Xm(rand_leader_index, :);
            flag_index = floor(2*rand()+1);
            Flag=vec_flag(flag_index);
            Am=exp(-fitness_m(rand_leader_index)/(fitness_m(i)+eps));%eq.(7)
            Xnewm(i,j)=X_randm(j)+Flag*C2*Am*((ub-lb)*rand+lb);%eq.(6)
        end
    end
    for i=1:Nf
        for j=1:1:dim
            rand_leader_index = floor(Nf*rand()+1);
            X_randf = Xf(rand_leader_index, :);
            flag_index = floor(2*rand()+1);
            Flag=vec_flag(flag_index);
            Af=exp(-fitness_f(rand_leader_index)/(fitness_f(i)+eps));%eq.(9)
            Xnewf(i,j)=X_randf(j)+Flag*C2*Af*((ub-lb)*rand+lb);%eq.(8)
        end
    end
else %Exploitation Phase (Food Exists)
    if Temp>Thresold2  %hot
        for i=1:Nm
            flag_index = floor(2*rand()+1);
            Flag=vec_flag(flag_index);
            for j=1:1:dim
                Xnewm(i,j)=Xfood(j)+C3*Flag*Temp*rand*(Xfood(j)-Xm(i,j));%eq.(10)
            end
        end
        for i=1:Nf
            flag_index = floor(2*rand()+1);
            Flag=vec_flag(flag_index);
            for j=1:1:dim
                Xnewf(i,j)=Xfood(j)+Flag*C3*Temp*rand*(Xfood(j)-Xf(i,j));%eq.(10)
            end
        end
    else %cold
        if rand>0.6 %fight
            for i=1:Nm
                for j=1:1:dim
                    FM=exp(-(fitnessBest_f)/(fitness_m(i)+eps));%eq.(13)
                    Xnewm(i,j)=Xm(i,j) +C3*FM*rand*(Q*Xbest_f(j)-Xm(i,j));%eq.(11)
                    
                end
            end
            for i=1:Nf
                for j=1:1:dim
                    FF=exp(-(fitnessBest_m)/(fitness_f(i)+eps));%eq.(14)
                    Xnewf(i,j)=Xf(i,j)+C3*FF*rand*(Q*Xbest_m(j)-Xf(i,j));%eq.(12)
                end
            end
        else%mating
            for i=1:Nm
                for j=1:1:dim
                    Mm=exp(-fitness_f(i)/(fitness_m(i)+eps));%eq.(17)
                    Xnewm(i,j)=Xm(i,j) +C3*rand*Mm*(Q*Xf(i,j)-Xm(i,j));%eq.(15
                end
            end
            for i=1:Nf
                for j=1:1:dim
                    Mf=exp(-fitness_m(i)/(fitness_f(i)+eps));%eq.(18)
                    Xnewf(i,j)=Xf(i,j) +C3*rand*Mf*(Q*Xm(i,j)-Xf(i,j));%eq.(16)
                end
            end
            flag_index = floor(2*rand()+1);
            egg=vec_flag(flag_index);
            if egg==1;
                [GYworst, gworst] = max(fitness_m);
                Xnewm(gworst,:)=lb+rand*(ub-lb);%eq.(19)
                [GYworst, gworst] = max(fitness_f);
                Xnewf(gworst,:)=lb+rand*(ub-lb);%eq.(20)
            end
        end
    end
end
    for j=1:Nm
         Flag4ub=Xnewm(j,:)>ub;
         Flag4lb=Xnewm(j,:)<lb;
        Xnewm(j,:)=(Xnewm(j,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
        y = feval(fobj,Xnewm(j,:));
        if y<fitness_m(j)
            fitness_m(j)=y;
            Xm(j,:)= Xnewm(j,:);
        end
    end
    
    [Ybest1,gbest1] = min(fitness_m);
    
    for j=1:Nf
         Flag4ub=Xnewf(j,:)>ub;
         Flag4lb=Xnewf(j,:)<lb;
        Xnewf(j,:)=(Xnewf(j,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
        y = feval(fobj,Xnewf(j,:));
        if y<fitness_f(j)
            fitness_f(j)=y;
            Xf(j,:)= Xnewf(j,:);
        end
    end
    
    [Ybest2,gbest2] = min(fitness_f);
    
    if Ybest1<fitnessBest_m
        Xbest_m = Xm(gbest1,:);
        fitnessBest_m=Ybest1;
    end
    if Ybest2<fitnessBest_f
        Xbest_f = Xf(gbest2,:);
        fitnessBest_f=Ybest2;
        
    end
    if Ybest1<Ybest2
        gbest_t(t)=min(Ybest1);
    else
        gbest_t(t)=min(Ybest2);
        
    end
    if fitnessBest_m<fitnessBest_f
        GYbest=fitnessBest_m;
        Xfood=Xbest_m;
    else
        GYbest=fitnessBest_f;
        Xfood=Xbest_f;
    end
    
end
fval = GYbest;
end

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

关键词:TGDM827

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
优化算法(Snake Optimization Algorithm,简称SOA)是一种模拟自然界的行为特点和觅食策略而提出的一种优化算法。它是一种改进的粒子群优化算法,具有全局搜索能力强、收敛速度快等特点。 优化算法的思想是模拟在觅食时的行动,通过不断移动来寻找到最优解。在算法中,的位置代表了一个候选解,而它的移动路径表示了解空间的搜索过程。会根据当前位置和搜索方向来决定下一步的移动方向,并根据适应度函数对每个候选解进行评价和排序,并调整自身搜索方向。 在Matlab中实现优化算法,首先需要定义适应度函数,即问题的优化目标。然后,初始化的位置和搜索方向,设定迭代次数和停止准则。在每次迭代中,根据当前位置和搜索方向更新的位置,并计算适应度值。根据适应度值对进行排序和选择操作,选择出较优的个体作为新一代的种群。接着,通过变异操作引入新的搜索方向,以增加算法的搜索能力。最后,重复迭代过程直至满足停止准则或达到设定的迭代次数。 在Matlab中,可以利用向量和矩阵的运算以及循环等功能实现优化算法的具体操作。可以使用Matlab提供的优化函数来最大化或最小化适应度函数,并根据需求进行相应的参数设置。 总之,优化算法是一种基于的行为特点和觅食策略而提出优化算法,可以在Matlab中进行实现。通过模拟的移动和搜索过程,寻找到最优解。通过合理设置参数和适应度函数,可以使优化算法在不同问题的优化中具有较好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天吃饺子

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值