目录
0 引言
旗鱼算法(Sailfish Optimizer,SFO)是学者于2019年提出一种自然启发式算法,该算法模拟旗鱼合作捕食,交替攻击猎物从而建立模型。
1 数学模型
SFO的数学模型是以旗鱼捕食过程构建,具体可分为发现猎物并包围猎物、攻击部分小鱼拖累整个小鱼种群、分散小鱼、旗鱼改变颜色进行交替攻击。因此对这几个方面进行建模,具体如下:
1)初始化:在算法中假设旗鱼是候选解,问题的变量是旗鱼在搜索空间中的位置。因此,解决方案空间中的种群是随机生成的。具体如下:
其中m表示旗鱼的数量,d表示变量的数量,𝑆𝐹𝑖,𝑗表示第i条旗鱼的第j维值的适应;𝑆𝐹𝐹𝑖𝑡𝑛𝑒𝑠𝑠存储每个旗鱼的适应度值。𝑆𝐹𝑝𝑜𝑠𝑖𝑡𝑖𝑜𝑛矩阵的第一行被送入适应度函数,输出结果表示𝑆𝐹𝐹𝑖𝑡𝑛𝑒𝑠𝑠矩阵中相应旗鱼的适应度值。n为沙丁鱼数量,𝑆𝑖,𝑗为第i个沙丁鱼的第j维值,𝑆𝑝𝑜𝑠𝑖𝑡𝑖𝑜𝑛矩阵表示所有沙丁鱼的位置。
2)精英种群矩阵:在SFO算法中,每次迭代都会保存最佳位置的旗鱼,并将其视为精英。此外,如前所述,沙丁鱼会在群体捕食时被旗鱼用喙部划伤。因此,每次迭代中受伤沙丁鱼的位置也会被保存,这个沙丁鱼将被选为旗鱼协同捕食的最佳目标。第i次迭代中具有最高适应度的精英旗鱼和受伤沙丁鱼的位置分别称为𝑋𝑒𝑙𝑖𝑡𝑒𝑖_𝑆𝐹和𝑋𝑖𝑛𝑗𝑢𝑟𝑒𝑑𝑖_𝑆。
3)交替攻击策略:旗鱼大多在没有同伴攻击时才会袭击猎物群。换句话说,旗鱼通过时间上的协调攻击可以提高捕猎成功。旗鱼追逐并驱赶猎物。旗鱼帆鱼的驱赶行为会根据周围其他猎手的位置调整自己的位置,而无需直接协调。在SFO算法中,第i次迭代时,旗鱼𝑋𝑖𝑛𝑒𝑤_𝑆𝐹的新位置更新如下:
其中𝑋𝑒𝑙𝑖𝑡𝑒𝑖_𝑆𝐹表示迄今为止形成的精英帆鱼的位置,𝑋𝑖𝑛𝑗𝑢𝑟𝑒𝑑𝑖_𝑆决定了迄今为止形成的受伤沙丁鱼的最佳位置,𝑋𝑜𝑙𝑑𝑖_𝑆𝐹是当前帆鱼的位置,𝑟𝑎𝑛𝑑(0,1)是0到1之间的随机数,𝜆𝑖是第i次迭代生成的系数;𝑃𝐷表示猎物密度,𝑁𝑆𝐹和𝑁𝑆分别表示算法每个周期中旗鱼和沙丁鱼的数量。此外,由于初始沙丁鱼数量通常大于旗鱼,因此𝑁𝑆𝐹由𝑁𝑆×𝑃𝑃定义,其中𝑃𝑃表示形成初始旗鱼种群的沙丁鱼比例。
4)狩猎和捕获猎物:在群体捕猎的初期,几乎不会观察到沙丁鱼被完全屠杀的情况。在95%的情况下,当旗鱼的喙击中沙丁鱼的身体时,会去除沙丁鱼的鳞片。这导致大量沙丁鱼群中的个体身体受到严重伤害。同时随着捕猎时间的推移,旗鱼的攻击力量会逐渐减弱。由于频繁且激烈的攻击,猎物体内的能量储备也会减少,可能会影响其对旗鱼位置方向信息的感知能力,从而影响群体的逃逸机动。
式中𝑋𝑒𝑙𝑖𝑡𝑒𝑖_𝑆𝐹是迄今为止形成的精英帆鱼的最佳位置,𝑋𝑜𝑙𝑑𝑖_𝑆是当前沙丁鱼的位置,𝑟是介于0和1之间的随机数,𝐴𝑃表示每次迭代中生成的帆鱼攻击力;其中𝐴和𝜀是用于线性减少功率攻击值的系数,从𝐴到0。通过使用𝐴𝑃参数,可以计算出更新位置的沙丁鱼数量(𝛼)及其变量的数量(𝛽);𝑑𝑖是第i次迭代时的变量数量,𝑁𝑆是算法每个循环中沙丁鱼的数量。根据𝐴𝑃参数,如果旗鱼的触碰强度较低(𝐴𝑃< 0.5),仅更新𝛼个沙丁鱼的𝛽个变量。然而,如果旗鱼的触碰强度较高(𝐴𝑃≥0.5),所有沙丁鱼的位置都将被更新。基本上,𝐴𝑃和𝑟参数帮助SFO在优化过程中表现出更随机的行为,并且在所有迭代中对局部最优停滞非常有帮助。
5)狩猎和捕获猎物:在捕猎的最后阶段,从鱼群中分离出来的受伤沙丁鱼会被迅速捕捉。在所提出的算法中,假设当沙丁鱼比相应的旗鱼更健壮时,就会捕获猎物。在这种情况下,旗鱼的位置会用被猎沙丁鱼的最新位置来替代,以增加捕获新猎物的机会。该方程如下:
式中𝑋𝑆𝑖表示第i次迭代时沙丁鱼的当前位置,𝑋𝑆𝐹𝑖表示第i次迭代时旗鱼的当前位置。
2 优化方式
前篇对支持向量机(支持向量机原理及MATLAB代码复现-CSDN博客)原理讲解,从支持向量机模型运算过程中,可以了解到模型高维映射核函数参数g和处罚因子c对模型预测结果影响最为重要。因此结合上述SFO原理介绍,可以将支持向量机的超参数作为将支持向量机的超参数作为旗鱼和沙丁鱼个体位置,每一个种群位置对应支持向量机的预测值,将这个预测值作为适应度进行旗鱼对沙丁鱼的攻击及狩猎策略和攻击策略,进而必优更新精英个体。
3 MATLAB代码
3.1 伪代码
3.2 主函数代码
for i =1:dim
x_SF(:,i) = lb(i)+(ub(i)-lb(i))*rand(NSF,1);
x_F(:,i) = lb(i)+(ub(i)-lb(i))*rand(NF,1);
end
for j=1:NSF
Fitness_SF(j)=SYD(x_SF(j,:),net);
net.trainParam.showWindow = 0;
end
for j=1:NF
Fitness_F(j)=SYD(x_F(j,:),net);
net.trainParam.showWindow = 0;
end
% 精英
[Fbest_SF,eliteSF]=min(Fitness_SF);%Fbest_S最优的旗鱼
[Fbest_F,injuredS]=min(Fitness_F);%Fbest_F最好的沙丁鱼
x_eliteSF=x_SF(eliteSF,:);%最优旗鱼的位置
x_injuredS=x_F(injuredS,:);%最佳沙丁鱼的位置
PD = NSF/(NSF+NF); %%Eq(8) 猎物密度
ks = 0.5/MaxIt;%线性递减功率攻击值的系数
for it = 1:MaxIt
A=4*(1-it/MaxIt);%线性递减功率攻击值的系数
%每次迭代时旗鱼的攻击力量
AP=A*(1-(2*it*ks));%Eq(10)
for ii=1:NSF
lamda=2*rand*PD-PD; %Eq(7)系数
%旗鱼的新位置
x_SF(ii,:)=x_eliteSF-lamda*(rand*0.5*(x_eliteSF+x_injuredS)-x_SF(ii,:));%Eq(6)
end
alpha=ceil(AP*NF_rest);%Eq(11)
beta=ceil(AP*dim);%Eq(12)
for jj=1:NF_rest
if AP<0.5%旗鱼的攻击力量弱,根据 a 和 β 的值选择一组沙丁鱼
sizepop_value=randperm((NF_rest-alpha+1), alpha)+alpha-1;
D_value=randperm((dim-beta+1), beta)+ beta-1;
for kk=1:dim
if ismember(jj,sizepop_value) && ismember(kk,D_value)
x_F(jj,kk)=rand*(x_eliteSF(kk)-x_F(jj,kk)+AP);%Eq(9)
end
end
x_F(jj,:)=rand*(x_eliteSF-x_F(jj,:)+AP);%Eq(9)
else
x_F(jj,:)=rand*(x_eliteSF-x_F(jj,:)+AP);%Eq(9)
end
end
for k=1:dim
Flag4ub=x_SF(:,k)>ub(k);
Flag4lb=x_SF(:,k)<lb(k);
x_SF(:,k)=(x_SF(:,k).*(~(Flag4ub+Flag4lb)))+ub(k).*Flag4ub+lb(k).*Flag4lb;
Flag4ub=x_F(:,k)>ub(k);
Flag4lb=x_F(:,k)<lb(k);
x_F(:,k)=(x_F(:,k).*(~(Flag4ub+Flag4lb)))+ub(k).*Flag4ub+lb(k).*Flag4lb;
end
% 计算所有旗鱼和沙丁鱼的适应度
for i=1:NSF
Fitness_SF(i)=SYD(x_SF(i,:),net);%旗鱼个体适应度
net.trainParam.showWindow = 0;
end
for j=1:NF_rest
Fitness_F(j)=SYD(x_F(j,:),net);%沙丁鱼个体适应度
net.trainParam.showWindow = 0;
end
%更新适应度值、位置
[fbest_SF,eliteSF]=min(Fitness_SF);
[fbest_F,injuredS]=min(Fitness_F);
% 更新最优旗鱼和最佳沙丁鱼
if fbest_SF<Fbest_SF
Fbest_SF=fbest_SF;
x_eliteSF=x_SF(eliteSF,:);
end
if fbest_F< Fbest_F
Fbest_F=fbest_F;
x_injuredS=x_F(injuredS,:);
end
%用受伤的沙丁鱼代替旗鱼
replace_num_SF=ceil(rand*NSF);
if Fitness_SF(replace_num_SF)> fbest_F
x_SF(replace_num_SF,:)=x_F(injuredS,:);
Fitness_SF(replace_num_SF)= fbest_F;
% 将猎杀的沙丁鱼从种群中剔除
x_F(injuredS,:)=[];
Fitness_F(injuredS)=[];
NF_rest=NF_rest-1;
end
HisBestFit(it)=Fbest_SF;
end
end
3.3 SFO-SVM/SVR
旗鱼算法优化支持向量机的回归预测及分类模型的MATLAB代码复现: