北极海雀优化算法(Arctic puffin optimization,APO)是一种受北极海雀生存和捕食行为启发的元启发式优化算法。APO包括空中飞行(探索)和水下觅食(开发)阶段。在搜索阶段,引入了Levy飞行和速度因子机制,增强了算法跳出局部最优的能力,提高了收敛速度。在开发阶段,采用协同、自适应变化因子等策略,确保算法能有效利用当前最优解,引导搜索方向。此外,APO通过行为转换因子实现了勘探和开发阶段之间的动态转换,有效地平衡了全局搜索和局部发展。
![fbd58c990ef6dd2293e78f526abb46cb.png](https://img-blog.csdnimg.cn/img_convert/fbd58c990ef6dd2293e78f526abb46cb.png)
该成果于2024年发表在计算机领域二区SCI期刊“Advances in Engineering Software”上。APO方法具有更好的迭代优化性能和出色的鲁棒性。
![0afc2645c907e5b5cf08b5f98eeb7b6f.png](https://img-blog.csdnimg.cn/img_convert/0afc2645c907e5b5cf08b5f98eeb7b6f.png)
1、算法原理
(1)初始化
北极海雀表现出强烈的集体主义,无论是在迁徙期间还是在它们的栖息地,总是成群结队地移动和合作。每一只北极海雀都代表着一个参与优化的潜在解决方案。初始化种群的生成过程由以下方程描述:
其中 表示第i只北极海雀的位置;rand生成一个介于0和1之间的随机数;ub和lb分别表示上界和下界;N是种群中的个体数量。
(2)空中飞行阶段(探索)
北极海雀依靠独特的飞行和觅食策略来驾驭它们具有挑战性的生存。在日常生活中,它们必须在海洋和空气之间灵活适应,满足自己的营养需求,适应不同的环境。如图所示,在空中航行中,海雀使用两种关键策略来应对不同的情况。第一种策略涉及空中搜索,第二种策略涉及俯冲猎物。这两个阶段表现出的不同行为策略证明了北极海雀在不同情况下的适应性,使它们能够成功地生存和繁殖。随后,本文将对这两种策略进行详细的考察,并阐明它们在北极海雀生活中的意义。
![3d0d10bb2e9d5212b8cc5bc1c335c18c.png](https://img-blog.csdnimg.cn/img_convert/3d0d10bb2e9d5212b8cc5bc1c335c18c.png)
第一种策略是空中搜索:
北极海雀通常以队形或群体进行协调飞行,这是一种合作行动,可以提高飞行效率和合作狩猎的机会。它们保持相对较低的飞行高度,以便于捕获潜在的水下食物资源。在这一阶段,它们专注于侦察潜在的猎物,同时保持对附近潜在捕食者的警惕。在有利的条件下,或者当捕食者稀少,鱼类种群丰富时,它们会熟练地加速接近水面,以更好地捕获猎物。以下是与该策略相关的位置更新公式。
式中r为1 ~ N - 1之间的随机整数,不包括i; 表示当前i是总体中的候选解; 是从当前总体中随机选择的一个候选解,L(D)为Levy飞行产生的随机数;D是维数;α是符合标准正态分布的随机数。
在空中搜索策略中,北极海雀利用利维飞行系数,类似于它们强大的翅膀,来改变它们的位置。Levy飞行以其独特的远距离跳跃而闻名,使海雀能够有效地探索食物资源。这种飞行搜索策略有助于它们迅速覆盖广阔的海洋区域,持续接近潜在的食物来源,并有效地搜索食物资源。同时,当面对海鸥等空中捕食者时,海雀采用轮换飞行战术来防御对手,这给攻击者寻找突破带来了挑战。因此,在空中搜索海雀的战略中,关键的战略是确定合适的捕捞地点。这一阶段的飞行策略增强了算法的全局搜索能力,使其能够更好地探索问题空间,增加了发现全局最优解的机会。
第二种策略是突袭捕食:
在北极海雀捕食过程中,俯冲是一个至关重要的策略,因为它们迅速改变飞行方向,以加快食物捕获速度。面对其他竞争对手,这种突袭策略至关重要,因为他们必须确保更快、更成功地捕获猎物才能生存。为了模拟这种俯冲行为,APO引入了一个速度系数S来调整海雀在俯冲过程中的位移。以下是位置更新方程。
在这种飞行策略中,北极海雀在第一阶段通过引入速度系数S来调整其位移,其中π是一个数学常数,大约等于3.14.S在调节北极海雀飞行的速度和方向方面发挥了关键作用。在数学上,S是一个速度系数,它允许海雀通过调整飞行速度的大小和方向来灵活地适应不同的摄食需求。有了S这一参数,该算法更接近海雀的空中行为,使其在面对竞争和不确定性时更加灵活,从而适应更复杂的空中环境。此外,引入参数S的分布特性,增加了算法的随机性和多样性,增强了北极海雀的探索能力。因此,猛扑捕食阶段的设置进一步提高了算法在解空间的搜索效率。增强了算法在处理不同上下文时的适应性和搜索能力。
为了在不同的场景中获得最优结果,该算法选择将两个阶段生成的候选位置合并到一个新的解中。然后根据适应度对这些解决方案进行排序,并选择前N个个体来形成新的种群。方程式的描述如下:
其中,sort是根据新总体的适应度值,从小到大进行排序。
(3)水下觅食阶段(开发)
北极海雀的生存策略涉及两个关键方面:空中飞行和水下觅食。水下觅食包括三种主要策略,每一种策略都在特定的环境中使用,以提高捕食效率。如图所示,这三种策略分别是聚集觅食、加强搜索和躲避捕食者。以下章节将详细介绍这些阶段,并探讨它们在北极海雀生活中的关键作用。
![faee3b7604e610d3a04c932cd3a13d7a.png](https://img-blog.csdnimg.cn/img_convert/faee3b7604e610d3a04c932cd3a13d7a.png)
集合觅食是第一个水下策略:
在北极海雀的觅食行为中,它们经常采取集体策略,聚集在水面附近的鱼群周围。这种合作捕食行为提高了捕猎效率和成功率。合作觅食使它们能够有效地合作,集体包围和捕获鱼群,从而增加成功捕食的机会。此外,海雀停留在海面上观察其他成员的行为,以确定潜水热点或食物资源。下面的公式描述了位置更新。
其中F为合作因子,调节北极海雀的捕食行为。变量r1, r2, r3是1到N−1之间的随机整数(不包括i), Xt r1,Xt r2,Xt r3是从当前总体中随机选择的候选解,
加强搜索是第二个水下战略:
随着捕食的进行,北极海雀可能会在一段时间后感觉到它们当前觅食区域的食物资源耗尽或耗尽。为了继续满足它们的营养需求,它们必须改变水下位置,以寻找更多的鱼或其他水下食物来源。该阶段的位置更新公式如下:
其中,T表示迭代的总次数,t表示当前迭代计数,Rand是一个随机数。在增强搜索过程的第二阶段,参数(1+f)起着关键作用,其中f是用于调整北极海雀在水中的位置的自适应因子。这种适应因素的设计灵感来自于海雀在觅食过程中适应环境的灵活性。具体地说,随着迭代次数的增加,参数f会逐渐调整,以便海雀可以根据搜索的进度和随机性来决定是否改变位置,以寻找更丰富的食物资源。
躲避捕食者是第三种水下策略:
这一策略被用来描述北极海雀在发现附近的捕食者时的行为。它们用一种特殊的声音或叫声来警告其他海雀,表明危险的存在。这种叫声是一种危险信号,会引起其他海雀的警觉,促使它们离开危险区域。与此同时,当发现捕食者在附近时,北极海雀会迅速改变位置,迅速沿着一条更大的路径游向安全区域,以躲避危险。以下是该策略使用的位置更新方程:
式中β是0到1之间均匀分布的随机数。在这一策略中,特别是在面对危险情况时,存在一种巧妙的平衡机制。这种机制涉及两种不同的行为模式:一种是逐渐躲避危险,另一种是迅速躲避危险。在算法中,这种双行为策略模拟了在不同情况下如何摆脱局部最优。当rand≥0.5表明捕食者接近时,北极海雀选择立即躲避,更大幅度地改变他们的位置。这是一种利用已知信息增强跳跃能力的方法,帮助算法在可能的局部最优中找到更好的解决方案。
总之,海雀在水下觅食时采用不同的策略,包括收集饲料、密集搜寻和躲避捕食者。在不同的条件下,这些策略可能导致不同的觅食结果。该算法选择将三个不同位置方程中的候选位置合并为一个新的解,以在各种情况下获得最优结果。根据适应度对解进行排序,并选出前N个个体。方程描述如下:
这种综合策略允许模型同时考虑多种觅食场景,最终选择最适合的位置作为最优解。这增强了海雀在面对不同情况时的觅食和生存能力。
APO所对应的算法流程图如下图所示
![995e2ca41e30261f6a8739a66d948655.png](https://img-blog.csdnimg.cn/img_convert/995e2ca41e30261f6a8739a66d948655.png)
APO对应的伪代码过程如下图所示
![e229664ad53a303744ee53182061a960.png](https://img-blog.csdnimg.cn/img_convert/e229664ad53a303744ee53182061a960.png)
2、结果展示
3、MATLAB核心代码
%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 北极海雀优化算法(Arctic puffin optimization,APO)
function [BestF,BestX,curve]=APO(N,T,lb,ub,dim,fobj)
PopPos=zeros(N,dim);
PopFit=zeros(N,1);
for i=1:N
PopPos(i,:)=rand(1,dim).*(ub-lb)+lb;
PopFit(i)=fobj(PopPos(i,:));
end
BestF=inf;
BestX=[];
for i=1:N
if PopFit(i)<=BestF
BestF=PopFit(i);
BestX=PopPos(i,:);
end
end
curve=zeros(T,1);
%% -------------------Start iteration------------------------------------%
for It=1:T
for i=1:N
theta1=(1-It/T);
B=2*log(1/rand)*theta1;
%% -------------------1.Aerial Flight Stage-------------------%
if B > 0.5
while true
K = [1:i-1, i+1:N];
RandInd = K(randi([1,N-1]));
step1 = PopPos(i, :) - PopPos(RandInd, :);
if norm(step1) ~= 0 && ~isequal(PopPos(i, :), PopPos(RandInd, :))
break;
end
end
%% -------------------1.1 Aerial search.-------------------%
Y=PopPos(i,:) + Levy(dim) .* step1 +round(0.5*(0.05+rand))*randn;
%% -------------------1.2 Swooping predation.-------------------%
R=rand(1,dim);
step2=(R-0.5)*pi;
S=tan(step2);
Z=Y.*S;
Y = SpaceBound(Y, ub, lb);
Z = SpaceBound(Z, ub, lb);
NewPop=[Y;Z];
NewPopfit=[fobj(Y);fobj(Z)];
[~,sorted_indexes]=sort(NewPopfit);
newPopPos=NewPop(sorted_indexes(1),:);
else
%% -------------------2.Underwater Foraging Stage-------------------%
F=0.5;
K = [1:i - 1, i + 1:N];
RandInd = K(randi([1, N - 1], 1, 3));
f=(0.1*(rand-1)*(T-It))/T;
while true
RandInd = K(randi([1 N-1], 1, 3));
step1 = PopPos(RandInd(2), :) - PopPos(RandInd(3), :);
if norm(step1) ~= 0 && RandInd(2) ~= RandInd(3)
break;
end
end
%% -------------------2.1 Gathering foraging-------------------%
if rand<0.5
W = PopPos(RandInd(1), :) + F .* step1;
else
W = PopPos(RandInd(1), :) + F .*Levy(dim).* step1;
end
%% -------------------2.2Intensifying search-------------------%
Y=(1+f)* W ;
%% -------------------2.3Underwater Foraging Stage-------------------%
while true
rand_leader_index1 = floor(N * rand() + 1);
rand_leader_index2 = floor(N * rand() + 1);
X_rand1 = PopPos(rand_leader_index1, :);
X_rand2 = PopPos(rand_leader_index2, :);
step2 = X_rand1 - X_rand2;
if norm(step2) ~= 0 && ~isequal(X_rand1, X_rand2)
break;
end
end
Epsilon = unifrnd(0, 1);
if rand<0.5
Z = PopPos(i, :) + Epsilon .* step2; % Eq.(11)4.3
else
Z = PopPos(i, :) + F .* Levy(dim) .* step2;
end
NewPop=[W;Y;Z];
NewPopfit=[fobj(W);fobj(Y);fobj(Z)];
[~,sorted_indexes]=sort(NewPopfit);
newPopPos=NewPop(sorted_indexes(1),:);
end
newPopPos = SpaceBound(newPopPos, ub, lb);
newPopFit = fobj(newPopPos);
if newPopFit < PopFit(i)
PopFit(i) = newPopFit;
PopPos(i, :) = newPopPos;
end
end
for i=1:N
if PopFit(i)<BestF
BestF=PopFit(i);
BestX=PopPos(i,:);
end
end
curve(It)=BestF;
end
end
function o=Levy(Dim)
beta=1.5;
sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
u=randn(1,Dim)*sigma;
v=randn(1,Dim);
step=u./abs(v).^(1/beta);
o=step;
end%
微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work
%代码清单:https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu
参考文献
[1]Wang W, Tian W, Xu D, et al. Arctic puffin optimization: A bio-inspired metaheuristic algorithm for solving engineering design optimization[J]. Advances in Engineering Software, 2024, 195: 103694.
完整代码获取
后台回复关键词:
TGDM835
获取更多代码:
或者复制链接跳转:
https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu