声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类算法的家人,可关注我的VX公众号:python算法小当家,不定期会有很多免费代码分享~
猎食者优化算法 Python代码免费获取
猎食者优化算法(hunter–prey optimizer,HPO)是于2022年提出的一种新型智能优化算法。该算法的灵感来自于捕食动物(如狮子、豹和狼)以及猎物(如雄鹿和瞪羚)的行为。HPO具有收敛速度快,寻优能力强的特点。免费python代码获取见文末。
猎食者优化算法原理解析
算法初始化
每个初始种群成员在搜索空间中随机生成,如公式(1)所示:
x i = r a n d ( 1 , d ) ⋅ ( u b − l b ) + l b x_i = rand(1,d) \cdot (ub - lb) + lb xi=rand(1,d)⋅(ub−lb)+lb
其中,$ X_i 是猎人位置或猎物位置, 是猎人位置或猎物位置, 是猎人位置或猎物位置, lb $ 是问题变量的最小值(下边界),$ ub $ 是问题变量的最大值(上边界),$ d$ 是问题的变量(维度)数。公式(2)定义了搜索空间的下边界和上边界。需要注意的是,一个问题的所有变量可以有相同或不同的上下边界。
l b = [ l b 1 , l b 2 , . . . , l b d ] , u b = [ u b 1 , u b 2 , . . . , u b d ] lb = [lb_1, lb_2, ..., lb_d], \quad ub = [ub_1, ub_2, ..., ub_d] lb=[lb1,lb2,...,lbd],ub=[ub1,ub2,...,ubd]
猎食者搜索策略
在生成初始种群并确定每个代理的位置后,使用目标函数计算每个解决方案的适应度 O i = f ( x ⃗ ) O_i = f(\vec{x}) Oi=f(x)。目标函数 F ( x ) F(x) F(x) 可以是最大化(效率、性能等)或最小化(成本、时间等)。计算适应度函数确定了解决方案的好坏,但我们不能通过一次运行获得最优解。需要定义并重复多次的搜索机制以引导搜索代理到最优位置。搜索机制通常包括两个步骤:探索和开发。探索指算法倾向于高度随机行为,使解决方案显著变化。解决方案的显著变化导致进一步探索搜索空间并发现有希望的区域。在找到有希望的区域后,必须减少随机行为,以便算法可以在这些有希望的区域进行搜索,这称为开发。对于猎人搜索机制,我们提出公式(3)。
x i , j ( t + 1 ) = x i , j ( t ) + 0.5 [ 2 C Z P p o s ( j ) − x i , j ( t ) ] + [ 2 ( 1 − C ) Z μ ( i ) − x i , j ( t ) ] x_{i,j}(t + 1) = x_{i,j}(t) + 0.5 \left[2CZP_{pos(j)} - x_{i,j}(t)\right] + \left[2(1 - C)Z\mu(i) - x_{i,j}(t)\right] xi,j(t+1)=xi,j(t)+0.5[2CZPpos(j)−xi,j(t)]+[2(1−C)Zμ(i)−xi,j(t)]
公式(3)更新了猎人位置,其中 $ x(t) $ 是当前猎人位置,$ x(t + 1) $ 是猎人的下一位置,$Ppos 是猎物位置, 是猎物位置, 是猎物位置, mu 是所有位置的平均值, 是所有位置的平均值, 是所有位置的平均值, Z $ 是通过公式(4)计算的自适应参数。
P = R 1 ⃗ < C ; I D X = ( P = = 0 ) P = \vec{R_1} < C; \quad IDX = (P == 0) P=R1<C;IDX=(P==0)
Z = R 2 ⊗ I D X + R 3 ⃗ ⊗ ( ∼ I D X ) Z = R_2 \otimes IDX + \vec{R_3} \otimes (\sim IDX) Z=R2⊗IDX+R3⊗(∼IDX)
其中, v e c R 1 vec{R_1} vecR1 和 R 3 ⃗ \vec{R_3} R3 是范围在 [ 0 , 1 ] [0,1] [0,1] 的随机向量, P P P 是一个取值为0和1的随机向量,值等于问题变量的数量,$ R_2 $是范围在 [ 0 , 1 ] [0,1] [0,1] 的随机数, I D X IDX IDX 是满足条件 ( P = = 0 ) (P == 0) (P==0) 的向量 R 1 ⃗ \vec{R_1} R1 的索引号。参数$ Z 的结构及其与参数 的结构及其与参数 的结构及其与参数 C $的关系如下图所示。
C 是探索和开发之间的平衡参数,其值在迭代过程中从 1 递减到 0.02。C 的计算公式如下:
C = 1 − i t ( 0.98 M a x I t ) C = 1 - it \left( \frac{0.98}{MaxIt} \right) C=1−it(MaxIt0.98)
其中 $it 是当前迭代值 是当前迭代值 是当前迭代值MaxIt$ 是最大迭代次数。首先根据公式(6)计算所有位置的平均值$ \mu $,然后计算每个搜索代理与该平均位置的距离
μ = 1 n ∑ i = 1 n x i ⃗ \mu = \frac{1}{n} \sum_{i=1}^{n} \vec{x_i} μ=n1i=1∑nxi
我们根据公式(7)计算基于欧几里得距离的距离
D e u c ( i ) = ( ∑ j = 1 d ( x i , j − μ j ) 2 ) 1 2 D_{euc}(i) = \left( \sum_{j=1}^{d} (x_{i,j} - \mu_j)^2 \right)^{\frac{1}{2}} Deuc(i)=(j=1∑d(xi,j−μj)2)21
根据公式(8),距离所有位置平均值最远的搜索代理被视为猎物位置$ P_{pos} $
P p o s ⃗ = x i ⃗ ∣ i = i n d e x o f M a x ( e n d ) s o r t ( D e u c ) \vec{P_{pos}} = \vec{x_i}|_{i = index \ of \ Max(end)sort(D_{euc})} Ppos=xi∣i=index of Max(end)sort(Deuc)
如果我们在每次迭代中总是选择与平均位置$\mu $距离最远的搜索代理作为猎物位置,算法会出现后期收敛问题。根据猎食场景,当猎人捕获猎物时,猎物死亡,下一次猎人移动到新猎物位置。为解决此问题,我们考虑使用递减机制,如公式(9)所示。
k b e s t = r o u n d ( C × N ) k_{best} = round(C \times N) kbest=round(C×N)
其中 N 是搜索代理的数量。
现在,我们改变公式(8),并根据公式(10)计算猎物位置
P p o s ⃗ = x i ⃗ ∣ i = s o r t e d D e u c ( k b e s t ) \vec{P_{pos}} = \vec{x_i}|_{i = sorted \ D_{euc}(k_{best})} Ppos=xi∣i=sorted Deuc(kbest)
我们假设最佳安全位置是全局最优位置,因为这将使猎物有更好的生存机会,而猎人可能会选择其他猎物。
x i , j ( t + 1 ) = T p o s ( j ) + C Z cos ( 2 π R 4 ) × ( T p o s ( j ) − x i , j ( t ) ) x_{i,j}(t + 1) = T_{pos(j)} + CZ \cos(2\pi R_4) \times (T_{pos(j)} - x_{i,j}(t)) xi,j(t+1)=Tpos(j)+CZcos(2πR4)×(Tpos(j)−xi,j(t))
其中,$ x(t) $ 是当前猎物位置,$x(t + 1) $ 是猎物的下一位置,$ T_{pos} $ 是最优全局位置,$Z $ 是通过公式(4)计算的自适应参数,$ R_4$ 是范围在$ [-1, 1] 的随机数。 的随机数。 的随机数。C$ 是探索和开发之间的平衡参数,其值在迭代过程中递减,计算如公式(5)所示。
这里出现的问题是如何在该算法中选择猎人和猎物。为回答这个问题,我们结合公式(3)和(11)得到公式(12)
其中,$ R_5 $ 是范围在$ [0, 1]$ 的随机数,$\beta $是一个调节参数,在本研究中设定为 0.1。如果 $R_5 $ 的值小于 $ \beta $,搜索代理被认为是猎人,搜索代理的下一个位置更新为公式(12a);如果 $ R_5 $的值大于 β \beta β,搜索代理被认为是猎物,搜索代理的下一个位置更新为公式(12b)。
猎食者算法流程图
作者所提算法的流程图如下图所示。
猎食者优化算法性能测试
下面我们用猎食者优化算法进行部分标准函数测试。
代码获取
关注VX公众号 Python算法小当家 回复关键词 HPO