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

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

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

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

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

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

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

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


GCRA对应的流程图如下所示。
2、结果展示
3、MATLAB核心代码
%%
% 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
点击下方卡片关注,获取更多代码