鮣鱼优化算法(Remora optimization algorithm,ROA)是一种受自然启发的群智能优化算法。该算法的灵感来自于海洋中的鮣鱼--通过寄生和随机寄主更换的思想,建立了一个基于寄生的框架。在ROA中,鮣鱼最初做了一个全球性的运动,探索阶段,并将这一阶段命名为“自由旅行”。这个阶段包括一个“大全局”运动,对应于旗鱼身上的移除吸附,并更新旗鱼的位置以进行远距离位置更新。此外,还有一个“小全球”运动,这是一个尝试在“实验攻击”中更新鮣鱼本身。同时,尝试的结果作为是否更换寄主的重要依据。在勘探阶段,鮣鱼执行部分更新。在这个阶段,鮣鱼逐渐向目标收敛。这个阶段被命名为“进食”。鮣鱼的取食方式有两种,即跟随大型宿主进食或以宿主身上的寄生虫为食。
该成果于2021年发表在知名一区SCI期刊“Expert Systems with Applications”上。被引次数高达232次
鮣鱼如下图。鮣鱼有一个非常长的身体,头部是平的,并逐渐成为圆柱形向后。在顶部,有吸盘变形的第一背鳍。它的鳍从吸盘中心向两侧分裂,形成约21-28个鳍瓣。鮣鱼以其在鲸鱼或其他海洋动物或远洋船体上游泳的能力而闻名。这样的习惯不仅省力,而且不受敌人的侵扰。鮣鱼主要以其他鱼类或无脊椎动物为食。当它到达饵料丰富的海域时,就会离开宿主,摄取食物,然后吸附到新的宿主身上,继续转移到另一个海域。但在某些情况下,就像清洁工一样,它也有可能吃到载体外的残骸食物或外寄生虫。
![26a279f2add72fbdc1aff59f975587e4.png](https://img-blog.csdnimg.cn/img_convert/26a279f2add72fbdc1aff59f975587e4.png)
1、算法原理
(1)种群初始化:
在所提出的鮣鱼算法中,假设候选解为λ a,其在搜索空间中的位置R为问题的变量。在一维、二维、三维或超维空间中游动时,它们的位置矢量会发生相应的变化。当前位置是Ri =(Ri1,Ri2,Rid,Rid),其中i表示Rsa的数量,d表示Rsa在搜索空间中的维度。同理,RBest =(R* 1,R* 2,R* d,R* d)代表生物习性中的食物(目标),也代表算法中的最优解。在算法中,每个候选解都应该有一个相应的适应度函数。这里,它可以表示为f(Ri)= f(Ri1,Ri2,Rid,Rid)。f是计算适应度函数值的相应规则。f(RBest)= f(R* 1,R* 2,R* d,R* d)保存对应于最佳位置的最佳适应值。值得注意的是,搜索因子是找到解决方案的主要因素,并且它分散在搜索空间中。其他海洋生物或船只只是帮助鮣鱼进行位置更新的工具,它有自己的位置更新方式。有了这些工具,鮣鱼可以找到该地区的最佳位置。实际上,确定最佳位置有两种模式,主要根据是否主动选择不同的模式。
在本文提出的ROA算法中,假设候选解是鮣鱼,其在搜索空间中的位置R为问题的变量。当鮣鱼在一维、二维、三维或超维空间中游动时,它们的位置向量会发生相应的变化。当前位置为Ri = (Ri1, Ri2,⋯,Rid),其中i表示鮣鱼的个数,d表示鮣鱼在搜索空间中的维度。同样,RBest = (R* 1, R* 2,⋯,R* d)表示生物习惯中的食物(目标),也表示算法中的最优解。在算法中,每个候选解都应该有对应的适应度函数。这里可以表示为f(Ri) = f(Ri1, Ri2,⋯,Rid)。F为计算适应度函数值的相应规则。f(RBest) = f(R * 1, R* 2,⋯,R* d)保存最佳迁移位置对应的最佳适应度值。值得注意的是,鮣鱼是寻找解决方案的主要因素,并且它分散在搜索空间中。其他海洋生物或船舶只是在位置更新方面协助搬运的工具,它有自己的更新位置的方法。
(2)探索阶段
当鮣鱼附着在剑鱼身上时,它的位置可以被认为是同时更新的。基于该算法的精英思想,对其位置更新公式进行改进,得到如下公式:
其中t表示当前迭代次数,t表示最大迭代次数。rand是一个随机位置。精英们选择了鮣鱼的历史最佳位置来领导更新。同时,加入了随机选取的模组,保证了对搜索空间的探索。鮣鱼对不同寄主的选择主要取决于它是否吃过猎物,即当前获得的适应度函数值是否优于上一代。实际上,当前适应度函数值是通过“经验攻击”获得的。
为了确定是否有必要更换寄主,需要在寄主周围不断地迈出一小步,类似于经验的积累。将以上思路建模后,公式如下:
其中Rpre代表上一代的位置,可以看作是一种经验。Ratt表示试探性的一步。当鮣鱼采取这种积极的步骤时,可以被视为一种“小全球”运动,因此,它被称为“全球性”运动。该机制在兼顾可预测性的同时有效地跳出局部最优,并得到了更广泛的发展。在这一步之后,还需要一个判断的步骤,在这之后,鮣鱼随机选择是否更换寄主。算法中这一步的判断可以表示为当前解f(Rt i)和尝试解f(Ratt)的适应度函数值之间的比较。以求解最小值问题为例,其公式如下:
然后,鮣鱼选择不同的进料方法进行局部优化,这将在下一节中进行说明。
(3)开发阶段(Exploitation)
在原有WOA算法的基础上,推导出了附着在鲸体上的触角的位置更新公式。公式如下所示:
在更大的解空间中,当鮣鱼在鲸鱼上时,它们的位置可以被视为相同。其中D是猎人与猎物之间的距离(当前最优解),α是[- 1,1]中的随机数,a在[- 2,- 1]之间线性下降。
寄主取食是开发过程中的进一步细分。在这个阶段,解空间可以简化为主机的位置空间。在宿主身上或周围移动可以被认为是小步骤,可以用数学模型表示为:
这里用A表示一个小的移动步长,这个移动步长与寄主和移除体的体积空间有关。为了区分宿主和移除物在溶液空间中的位置,本文使用移除因子C来缩小移除物的位置。假设寄主的体积为1,则鮣鱼的体积约为寄主体积的一小部分。下图为c = 0.1条件下的“宿主摄食”模型。
![6d0a2eedfece31f8b78ba8cecb992a84.png](https://img-blog.csdnimg.cn/img_convert/6d0a2eedfece31f8b78ba8cecb992a84.png)
由于寄主的卷是随机的,所以使用B来模拟随机的寄主卷空间。在鮣鱼取食宿主的过程中,可以看到搜索空间逐渐减小。为便于理解,ROA流程图如下图所示。
![3c317d51f567bb298460e0a49ce2b68c.png](https://img-blog.csdnimg.cn/img_convert/3c317d51f567bb298460e0a49ce2b68c.png)
ROA优化算法的伪代码如下
![5938e6237b88358f1786c72f3590cbc6.png](https://img-blog.csdnimg.cn/img_convert/5938e6237b88358f1786c72f3590cbc6.png)
2、结果展示
3、MATLAB核心代码
%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 鮣鱼优化算法(ROA)
unction [Score,BestRemora,Convergence]=ROA(Search_Agents,Max_iterations,...
Lowerbound,Upperbound,dimensions,objective)
tic;
BestRemora=zeros(1,dimensions);
Score=inf;
Remora=init(Search_Agents,dimensions,Upperbound,Lowerbound); % Generate initial remora population
Prevgen{1}=Remora;
Convergence=zeros(1,Max_iterations);
t=0;
while t<Max_iterations
%% Memory of previous generation
if t<=1
PreviousRemora = Prevgen{1};
else
PreviousRemora = Prevgen{t-1};
end
% Boundary check
for i=1:size(Remora,1)
Flag4Upperbound=Remora(i,:)>Upperbound;
Flag4Lowerbound=Remora(i,:)<Lowerbound;
Remora(i,:)=(Remora(i,:).*(~(Flag4Upperbound+Flag4Lowerbound)))+Upperbound.*Flag4Upperbound+Lowerbound.*Flag4Lowerbound;
fitness=objective(Remora(i,:));
% Evaluate fitness function of search agents
if fitness<Score
Score=fitness;
BestRemora=Remora(i,:);
end
end
% Make a experience attempt through equation (2)
for j=1:size(Remora,1)
RemoraAtt = Remora(j,:)+(Remora(j,:)-PreviousRemora(j,:))*randn; %Equation(2)
% Calculate the fitness function value of the attempted solution (fitnessAtt)
fitnessAtt=objective(RemoraAtt);
% Calculate the fitness function value of the current solution (fitnessI)
fitnessI=objective(Remora(j,:));
% Check if the current fitness (fitnessI) is better than the attempted fitness(fitnessAtt)
% if No, Perform host feeding by equation (9)
if fitnessI>fitnessAtt
V = 2*(1-t/Max_iterations); % Equation (12)
B = 2*V*rand-V; % Equation (11)
C = 0.1;
A = B*(Remora(j,:)-C*BestRemora); % Equation (10)
Remora(j,:)= Remora(j,:)+A; % Equation (9)
% If yes perform host conversion using equation (1) and (5)
elseif randi([0 1],1)==0
a=-(1+t/Max_iterations); % Equation (7)
alpha = rand*(a-1)+1; % Equation (6)
D = abs(BestRemora-Remora(j,:)); % Equation (8)
Remora(j,:) = D*exp(alpha)*cos(2*pi*a)+Remora(j,:); % Equation (5)
else
m=randperm(size(Remora,1));
Remora(j,:)=BestRemora-((rand*(BestRemora+Remora(m(1),:))/2)-Remora(m(1),:)); % Equation (1)
end
end
t=t+1 ;
fprintf('Iteration : %d, best score : %d\n',t,Score)
Prevgen{t+1}=Remora;
Convergence(t)=Score;
end
end
参考文献
[1]Jia H, Peng X, Lang C. Remora optimization algorithm[J]. Expert Systems with Applications, 2021, 185: 115665.
完整代码获取
后台回复关键词:
TGDM834