捕鱼优化算法(Catch fish optimization algorithm,CFOA)是期刊“Cluster Computing ”的2024年智能优化算法
01.引言
本文受传统农村捕鱼方法的启发,提出了一种基于人类行为的元启发式优化算法:Catch Fish optimization algorithm (CFOA)。该算法模拟了农村渔民在池塘中捕鱼的过程,该过程主要分为两个阶段:勘探阶段和开发阶段。在探索阶段,有两个搜索阶段:第一,基于个人经验和直觉的个体捕获阶段,第二,基于人类熟练使用工具和协作的群体捕获阶段。在探索阶段从独立搜索过渡到群体捕获。开发阶段:所有渔民将鱼群围起来,共同打捞剩余的鱼,这是一种集体捕捞策略。CFOA模型就是基于这两个阶段。本文采用IEEE CEC 2014和IEEE CEC 2020测试函数对CFOA的优化性能进行了测试,并与其他11种优化算法进行了比较。采用IEEE CEC2017函数对CFOA的整体性能进行评价。实验结果表明,CFOA总体上表现出优异而稳定的优化能力。此外,我们将CFOA应用于数据聚类问题,最终结果表明,CFOA在处理聚类问题时的总体错误率小于20%,聚类效果较好。综合实验结果表明,CFOA在面对不同的优化问题时均表现出优异的优化效果。
02.优化算法的流程
本文提出的 CFOA 算法是用“Trouble-the Water to Catch the Fish”的隐喻构思的,模拟人类的捕鱼行为。隐含含义如下:
“烦水抓鱼”的本义是指将池塘中的水搅动,使鱼在浑浊的水中迷失方向,然后抓住机会不费吹灰之力就抓住它们的技术。在《三十六策略》[33]中,它比喻了在敌人或对手的队伍中制造混乱,并利用由此产生的混乱来获得好处。正如浑浊水域中的鱼难以辨别方向并容易受到捕食者的攻击一样,在复杂的冲突中,较弱的一方可能会动摇并带来可利用的机会。然而,抓住机会不能仅仅依靠等待;它需要积极主动地努力创造有利的局面。当情况变得复杂时,开始搅动水面可以采取战略行动。总之,CFOA 算法体现了在浑水摸鱼的主动和战略方法,与在混乱中寻找机会的古老智慧相一致。在农村捕鱼的过程涉及几个步骤。钓鱼前,人们通常会通过排干池塘来降低池塘中的水位。然后,他们要么用手进入池塘,要么用工具捕鱼。当水位下降时,鱼往往会寻找藏身之处,而池塘内人员的移动使水变得浑浊。在浑浊的水中,鱼需要浮出水面呼吸空气,使渔民更容易看到它们。这为渔民创造了有利的局面,但对鱼不利,因为它们在这种环境中变得更容易捕获。
CFOA 的核心理念是通过集团内部的协作努力实现最大的鱼类捕获量。个人可以使用工具并协作在复杂的水体中钓鱼,分享各自的捕鱼经验。根据这些经验,他们可以辨别出最佳的钓鱼方向,并找到更有利的鱼群聚集点。具体实施框架概述如下:
(1)人类和动物的区别在于思想和意识的领域。在渔民寻找鱼巢的过程中,他们积极扰动沿途的水,产生浑浊,有利于有利的捕鱼环境。每个已探查的渔场中隐藏的鱼数量因渔民而异。渔民借鉴他人的捕鱼经验,以这些信息为参考,利用他们的专业知识来确定寻找更好的鱼类种群的最佳位置。
(2)工具的使用和团队内的协作构成了人类的优势。渔民相互合作,使用渔网包围潜在的鱼类种群,防止鱼类逃脱,从而提高整体捕捞率。
(3)团队合作的最大潜力是通过集体包围来实现的。所有渔民将鱼驱赶到一个共同的位置,形成一个封闭的圆圈,以最大限度地聚集所有鱼,最终捕获到最多的鱼。
综上所述,捕捞鱼优化算法分两个阶段实现:探索阶段,涉及分散勘探优势和协作捕捞,以及开发阶段,通过协同包围努力来利用集体力量。
03.论文中算法对比图
04.部分代码
%% Catch Fish Optimization Algorithm
function [Best_score,Best_pos,cg_curve]=CFOA(SearchAgents_no,Max_EFs,lb,ub,dim,fobj)
%% ---------------------Initialization parameter--------------------------%
Fisher=initialization(SearchAgents_no,dim,ub,lb);
newFisher=Fisher;
EFs=0;
Best_score=inf;
Best_pos=zeros(1,dim);
cg_curve=zeros(EFs,1);
fit=inf.*ones(SearchAgents_no,1);
newfit=fit;
%% -----------------------Start iteration run-----------------------------%
while EFs<Max_EFs
for i=1:SearchAgents_no
Flag4ub = newFisher(i,:)>ub;
Flag4lb = newFisher(i,:)<lb;
newFisher(i,:)=(newFisher(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
newfit(i)=fobj(newFisher(i,:));
if newfit(i)<=fit(i)
fit(i)=newfit(i);
Fisher(i,:)=newFisher(i,:);
end
if newfit(i)<=Best_score
Best_pos=Fisher(i,:);
Best_score=fit(i);
end
EFs=EFs+1;
cg_curve(EFs)=Best_score;
if EFs>=Max_EFs
break;
end
end
if EFs<Max_EFs/2
alpha=((1-3*EFs/2*Max_EFs)^(3*EFs/2*Max_EFs));
p=rand;
pos=randperm(SearchAgents_no);
i=1;
while i <= SearchAgents_no
per=randi([3 4]); %Randomly determine the size of the group
%% ---------------------Independent search (p < α)------------------------%
if p < alpha || i+per-1>SearchAgents_no
r=randi([1 SearchAgents_no]);
while r==i
r=randi([1 SearchAgents_no]);
end
Exp=((fit(pos(i))-fit(pos(r)))/(max(fit)-Best_score));%
rs=rand(1,dim)*2-1;
rs=norm(Fisher(r,:)-Fisher(i,:)).*rand.*(1-EFs/Max_EFs)*rs/(rs*rs')^0.5;
newFisher(pos(i),:)=Fisher(pos(i),:)+(Fisher(pos(r),:)-Fisher(pos(i),:)).*Exp+(abs(Exp)^0.5).*rs;
i=i+1;
%% ------------------------Group capture (p ≥ α)--------------------------%
else
aim=sum(fit(pos(i:i+per-1))/sum(fit(pos(i:i+per-1))).*Fisher(pos(i:i+per-1),:));
newFisher(pos(i:i+per-1),:)=Fisher(pos(i:i+per-1),:)+rand(per,1).*(aim-Fisher(pos(i:i+per-1),:))+(1-2*EFs/Max_EFs).*(rand(per,dim)*2 -1);
i=i+per;
end
end
else
%% -------------------------Collective capture----------------------------%
sigma=(2*(1-EFs/Max_EFs)/((1-EFs/Max_EFs)^2+1)).^0.5;
for i=1:SearchAgents_no
W=abs(Best_pos-mean(Fisher)).*(randi([1 3])/3)*sigma;
newFisher(i,:)=Best_pos+(normrnd(0,W,1,dim));
end
end
end
end
05.本代码效果图
获取代码请关注MATLAB科研小白的个人公众号(即文章下方二维码),并回复优化算法本公众号致力于解决找代码难,写代码怵。各位有什么急需的代码,欢迎后台留言~不定时更新科研技巧类推文,可以一起探讨科研,写作,文献,代码等诸多学术问题,我们一起进步。