2024新算法大蔗鼠算法,原理详解,MATLAB代码免费获取

大蔗鼠算法(GCRA)是一种受自然启发的群智能优化算法。该算法的灵感来自于大蔗鼠交配季节和非交配季节的智能觅食行为。由于高度夜行性,它们在芦苇和草地上觅食时可以留下足够的线索。这些小径随后将通向食物和水源以及住所。当它们离开散布在它们领地周围的不同避难所去觅食并留下足迹时,就进入了探索阶段。如图所示,大蔗鼠生活在由图底部的阴影部分描绘的水源附近,可以看到高大的藤状草,并且白色空间和路径表示通过藤状特征到达先前已知的食物源的路径。

6eda0ef5a596bdda680f9533b9372981.png

该成果于2024年发表在计算机领域三区cell旗下的Heliyon期刊上。

495728172c673e82b5452c8306d7c50a.png

大蔗鼠有很强的领地意识,只有雄性会用鼻子决斗。它们也是群居动物,群居中有一个占统治地位的雄性,许多雌性和幼崽。大蔗鼠的觅食包括用它们特别适应的上门牙切割甘蔗和草。它们是高度夜行性的动物,当它们在芦苇和草丛中觅食时,它们会留下痕迹。这些小径随后会通向食物、水源和住所。

1、算法原理

(1)种群初始化

GCRA的优化过程开始于使用以下公式随机生成大蔗鼠(GCR)种群(X)。该生成利用上界(UB)和下界(LB)。

其中,X表示整个大蔗鼠种群,第j维中第i个位置的个体大蔗鼠(x,ij)是使用下式随机生成的。最后,n和d分别表示种群规模和问题维度:

其中rand是0到1之间的随机数。

在GCRA设计的框架内,被认为是优势的大蔗鼠被认为是最适合的,或者位置向量产生目标函数的最佳值。考虑到这只最适合的老鼠引导着整个群体,并且知道过去寻找食物或住所的路线如下图所示,其他老鼠的位置会根据优势雄鼠的位置进行调整:

式中,xi,jnew表示新的大蔗鼠位置,xi,j表示当前的大蔗鼠位置,xk,j在第j维中为雄性主导。

25bb5942192d2c284757f2b66c27dded.png

(2)探索阶段

大蔗鼠在它们的领地(沼泽、河岸和耕地)周围建造它们的庇护所(巢或浅洞)。它们离开不同的庇护所去觅食,要么沿着小路找到以前的食物来源,要么寻找新的食物来源并留下痕迹。下图显示了大蔗鼠在它们的领地内到处寻找食物,看起来在行走的老鼠代表了优势老鼠的不同位置,看起来在进食的老鼠代表了找到的食物来源。据推测,占主导地位的雄鼠保留了这些踪迹的信息,而其他老鼠则根据这些数据调整自己的位置。根据优势雄鼠的位置确定剩余鼠群在搜索空间中的新位置,如下式所示。

bda0546cd7c5ab51d1fabccb73267d7b.png

其中,Xi表示第i个大蔗鼠的即将到来的或新的状态,Xi,jnew表示其在第j维中的值,Xi,j表示当前的大蔗鼠位置,Xk,j是第j维中的主导雄性,Fxk是主导雄性的目标函数的值,Fxi是目标函数的当前值,C是在问题空间边界内定义的随机数,模拟分散的食物源和庇护所,大蔗鼠模拟丰富的食物源的影响,其然后促使更多的开发,r是模拟减少的食物源的系数,其迫使寻找新的食物源或庇护所。

其中,Citer是当前迭代,Maxiter是最大迭代。

e578ef27383b2d6aa5e830e1e38d5c6d.png

(3)开发阶段

繁殖季节因生境而异,通常发生在雨季。众所周知,雄性在繁殖季节会脱离群体。假设是,一旦群体分开,觅食活动集中在食物来源丰富的地区。下图显示了单独的群体只在有希望的区域内觅食。这个阶段的模拟从随机选择一只雌性开始,因为繁殖发生在丰富的食物来源周围,所以这种强化发生在被选中的雌性周围。

919a17b1c68ddff63b925af934fef7e9.png

其中,xm,j代表随机选择的雌性在第j维中的位置,随机取1至4的值,模拟每个雌性大蔗鼠每年产生的幼崽数量。

8057ccee340c03a471b6c9f21a21698e.png

GCRA对应的算法伪代码如下所示。

9d6f320c6aee59b115ac6bef13c5d20d.png 624a7275ab47c0f42f7a92301defd7c4.png

GCRA对应的流程图如下所示。

675f8173c3b70df35a9b1359268d2619.png

2、结果展示

e8a78da2f14e48c9899b237bbfe5766d.png

dfe48d4db212359945c73879f7db0d77.png

7f834bfe3df24422c7e6782296c3c052.png

3、MATLAB核心代码

%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 大蔗鼠算法(GCRA)
%%
% Greater Cane Rat Algorithm (GCRA)                                       %
function[Score,Position,Convergence]=gcra4(Search_Agents,Max_iterations,Lower_bound,Upper_bound,dimension,objective)
Position=zeros(1,dimension);
Score=inf; 
% Alpha_pos=zeros(1,dimension);
% Alpha_score=inf; 
Gcanerats=init(Search_Agents,dimension,Upper_bound,Lower_bound);
Convergence=zeros(1,Max_iterations);
l=1;
for i=1:size(Gcanerats,1)  
        Flag4Upper_bound=Gcanerats(i,:)>Upper_bound;
        Flag4Lower_bound=Gcanerats(i,:)<Lower_bound;
Gcanerats(i,:)=(Gcanerats(i,:).*(~(Flag4Upper_bound+Flag4Lower_bound)))+Upper_bound.*Flag4Upper_bound+Lower_bound.*Flag4Lower_bound;               
        fitness=objective(Gcanerats(i,:));
        if fitness<Score 
            Score=fitness; 
            Position=Gcanerats(i,:);
            Alpha_pos1=Position;
            Alpha_score=Score;
        end
 end
while l<Max_iterations+1
    Alpha_pos=max(Alpha_pos1);
%     Alpha_pos=Alpha_pos1(nn);
   GR_m=randperm(Search_Agents-1,1); 
   GR_rho=0.5;
   GR_r= Alpha_score-l*(Alpha_score/Max_iterations);
    x = 1;
    y = 4;
    GR_mu = floor((y-x).*rand(1,1) + x);
    GR_c=rand;
    GR_alpha=2*GR_r*rand-GR_r;
    GR_beta=2*GR_r*GR_mu-GR_r;
    for i=1:size(Gcanerats,1)
        for j=1:size(Gcanerats,2)  
            Gcanerats(i,j)= (Gcanerats(i,j)+Alpha_pos)/2; 
        end
    end
    for i=1:size(Gcanerats,1)
        for j=1:size(Gcanerats,2)  
           if rand<GR_rho
%                  dd=Alpha_pos;
                 Gcanerats(i,j)= Gcanerats(i,j)+GR_c*(Alpha_pos-GR_r*Gcanerats(i,j)); 
                 Flag4Upper_bound=Gcanerats(i,j)>Upper_bound;
                 Flag4Lower_bound=Gcanerats(i,j)<Lower_bound;
Gcanerats(i,j)=(Gcanerats(i,j).*(~(Flag4Upper_bound+Flag4Lower_bound)))+Upper_bound.*Flag4Upper_bound+Lower_bound.*Flag4Lower_bound;
                 fitness=objective(Gcanerats(i,j));
                  if fitness<Score 
                        Score=fitness; 
                        Position=Gcanerats(i,j);
                  else
                      Gcanerats(i,j)= Gcanerats(i,j)+GR_c*(Gcanerats(i,j)-GR_alpha*Alpha_pos); 
                      Flag4Upper_bound=Gcanerats(i,j)>Upper_bound;
                      Flag4Lower_bound=Gcanerats(i,j)<Lower_bound;
Gcanerats(i,j)=(Gcanerats(i,j).*(~(Flag4Upper_bound+Flag4Lower_bound)))+Upper_bound.*Flag4Upper_bound+Lower_bound.*Flag4Lower_bound;
                       fitness=objective(Gcanerats(i,j));
                      if fitness<Score 
                            Score=fitness; 
                            Position=Gcanerats(i,j);
                      end
                  end
            else
                 Gcanerats(i,j)= Gcanerats(i,j)+GR_c*(Alpha_pos-GR_mu*Gcanerats(GR_m,j));
                 Flag4Upper_bound=Gcanerats(i,j)>Upper_bound;
                 Flag4Lower_bound=Gcanerats(i,j)<Lower_bound;
Gcanerats(i,j)=(Gcanerats(i,j).*(~(Flag4Upper_bound+Flag4Lower_bound)))+Upper_bound.*Flag4Upper_bound+Lower_bound.*Flag4Lower_bound;
                 fitness=objective(Gcanerats(i,j));
                  if fitness<Score 
                        Score=fitness; 
                        Position=Gcanerats(i,j);
                  else
                      Gcanerats(i,j)= Gcanerats(i,j)+GR_c*(Gcanerats(GR_m,j)-GR_beta*Alpha_pos); 
                      Flag4Upper_bound=Gcanerats(i,j)>Upper_bound;
                      Flag4Lower_bound=Gcanerats(i,j)<Lower_bound;
                      Gcanerats(i,j)=(Gcanerats(i,j).*(~(Flag4Upper_bound+Flag4Lower_bound)))+Upper_bound.*Flag4Upper_bound+Lower_bound.*Flag4Lower_bound;               
                      fitness=objective(Gcanerats(i,j));
                      if fitness<Score 
                            Score=fitness; 
                            Position=Gcanerats(i,j);
                      end
                  end
            end
            Alpha_pos1=Position;
            Alpha_score=Score;
        end
    end
    l=l+1;
    Convergence(l)=Score;
end

参考文献

[1]Agushaka J O, Ezugwu A E, Saha A K, et al. Greater Cane Rat Algorithm (GCRA): A Nature-Inspired Metaheuristic for Optimization Problems[J]. Heliyon, 2024.


完整代码获取

后台回复关键词:

TGDM833

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淘个代码_

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值