北极熊优化算法PBO的理论知识以及python代码实现

本文详细介绍了北极熊优化算法,包括其条件假设、浮冰漂移(全局搜索)和海豹捕捉(局部搜索)策略,以及Python代码实例。通过模拟北极熊觅食行为优化求解问题,展示了动态种群管理和适应值更新的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

北极熊优化算法

1.条件假设

在北极熊算法 中,假 设 种 群 由 k k k k k个 北 极 熊 组 成,每 个 北极熊代表解空间中的一个具有 n n n个维度的点 x = ( x 0 , x 1 , … , x n − 1 ) x= (x_0,x_1, …,x_{n-1}) x=(x0x1xn1),在第 t t t次 迭 代 时 第 i i i 个 点 的 第 j j j 维 度 的 坐 标 用 ( x j i ) t ({{x_j}^i})^t xji)t 表示。

2.浮冰漂移 (全局搜索)策略

如果一只饥饿的北极熊在它最近邻范围内找不到任何 东西吃,那么它就站上一个大而稳定的浮冰,浮 冰 在 很 长 一段时间内不会因为北极熊体重太大而破裂。北 极 熊 利 用 浮冰朝远处可能有海豹的聚集地漂移。漂移可能需要几天 时间,在这段时间内北极熊也在周围的冰面和水域中寻找 食物。北极熊的浮冰漂移现象在算法中用公式 (1)来 表示。
( x j i ) t = ( x j i ) t − 1 + s i g n ( w ) × α + γ ( 1 ) ({{x_j}^i})^t=({{x_j}^i})^{t-1}+sign(w)×\alpha+\gamma\qquad\qquad\qquad(1) (xji)t=xji)t1+sign(w)×α+γ(1)

α α α是区间 ( 0 , 1 ] (0,1] (0,1]之间的随机数, γ γ γ [ 0 , w ] [0,w] [0,w]区间内 的随机 数, s i g n ( w ) sign(w) sign(w) 函数是分段函数, 根 据 w w w 的 取 值 ( 负 , 0 , 正 ) ({负,0,正}) () s i g n ( w ) sign(w) sign(w)函数的结果为{ − 1 , 0 , 1 {-1,0,1} 1,0,1}, w w w 是两个北极熊之间的欧式距离 (公式 (2))。
w = ∑ k = 0 n − 1 ( x k b e s t − x k i ) 2 ( 2 ) w = \sqrt{\sum_{k=0}^{n-1}({x_k}^{best}-{x_k}^{i})^2}\qquad\qquad\qquad(2) wk=0n1(xkbestxki)2 (2)
在北极熊算法的迭代过程中的每个个体都根据公式 (1)进行全局搜 索 探 索,但是只有在某只熊探索到比当前 位置更好的 位 置 时,才更新该只熊的位置。因 为 只 有 在 熊 距离海豹聚集地更近的时候,它才有很大希望捕成功 (如 图2所示)。
在这里插入图片描述

3.海豹捕捉 (局部搜索)策略

在捕猎过程 中,北极熊在北极冰面上漫步着探寻潜在 的猎物,此时它不仅观察冰面上的情况,水下的情况也在 它的视野监 视 之 下。为 了 发 现 猎 物,北极熊悄悄地向最佳 地点移动。一旦北极熊基本到达攻击位置或者它被海豹发 现,他就以最大速度攻击猎物。海豹通常最有可能待在冰 上,然而当有 危 险 的 时 候,它们也会跳入水 中。北 极 熊 也 会立刻跳入 水 中,利用潜水和游泳的优势,北 极 熊 可 以 在 水下迅速追上猎物并把它的牙齿刺入海豹体内,随 后 北 极 熊把海豹拖上浮 冰 享 用 美 味。北极熊的这种捕捉海豹的策 略,在算法中作为局部搜索策略。每只熊的移动方式按照 修改的三叶草方程公式 ( 3 ) (3) (3)进行,北极熊的视野半径用两 个参数表示: θ ∈ [ 0 , 0 , 3 ] θ{\in} [0,0,3] θ[0,0,3]限定了北极熊的能见距离, φ 0 ∈ [ 0 , 0 , 3 ] φ_0{\in}[0,0,3] φ0[0,0,3]表示围绕猎物行进的斜角度。
r = 4 a c o s ( φ 0 ) s i n ( φ 0 ) ( 3 ) r=4acos(φ_0)sin(φ_0)\qquad\qquad\qquad\qquad(3) r=4acos(φ0)sin(φ0)(3)
r作用于每只熊自身移动过程中每一维度上的坐标的更 新过程中,如公式 (4)所示。
x 0 n e w = x 0 d d ± r c o s ( φ 1 ) x 1 n e w = x 1 d d ± r [ s i n ( φ 1 ) + c o s ( φ 1 ) ] x 2 n e w = x 1 d d ± r [ s i n ( φ 1 ) + s i n ( φ 2 ) + c o s ( φ 3 ) ] ( 4 ) x n − 2 n e w = x n − 2 d d ± r [ ∑ s i n ( φ k ) + c o s ( φ n − 1 ) ] x n n e w = x n d d ± r [ ∑ s i n ( φ k ) + c o s ( φ n ) ] {x_0}^{new}={x_0}^{dd}±rcos(φ_1) \qquad\qquad\qquad\\ {x_1}^{new}={x_1}^{dd}±r[sin(φ_1)+cos(φ_1)]\qquad\qquad\qquad\\ {x_2}^{new}={x_1}^{dd}±r[sin(φ_1)+sin(φ_2)+cos(φ_3)]\qquad\qquad\qquad(4) \\ {x_{n-2}}^{new}={x_{n-2}}^{dd}±r[\sum{sin(φ_k)}+cos(φ_{n-1})]\qquad\qquad\qquad\\ {x_{n}}^{new}={x_{n}}^{dd}±r[\sum{sin(φ_k)}+cos(φ_{n})]\qquad\qquad\qquad\\ x0new=x0dd±rcos(φ1)x1new=x1dd±r[sin(φ1)+cos(φ1)]x2new=x1dd±r[sin(φ1)+sin(φ2)+cos(φ3)]4xn2new=xn2dd±r[sin(φk)+cos(φn1)]xnnew=xndd±r[sin(φk)+cos(φn)]
 每个 φ φ φ的取值为 [ 0 , 2 π ] [0,2π] [0,2π],公式中的 “+”号表示北极熊向 前 探 寻,如果位置不理想,北 极 熊 就 向 “-”号 方 向探寻,两个方向都不理想,北 极 熊 就 原 地 不 动。如 果 北 极熊是在二维平面上进行捕猎,则它的行进路径与三叶草某片叶子的形状极其相似 (图3)。  在这里插入图片描述
饥饿引发熊群繁衍与灭绝策略 (动态种群规模调整策略) 在算法执行初期,熊群规模只是最大容量的75%,剩 余的25%为后期的熊群增长、最好个体繁殖后代和最差解 的消亡作准备。在算法的每一次迭代中,个体会因饥饿而死亡或者在成功捕猎后繁殖后代。这个机制代表了北极的 严酷条件,算法引入 k k k作为 [ 0 , 1 ] [0,1] [0,1]区间上的随机数,采用 公式 (5)确定熊的死亡或生存决策。
D e a t h i f   k < 0.5 R e p r o d u c t i o n i f   k > 0.75 ( 5 ) Death\qquad\qquad\qquad if\,k<0.5\\ \qquad Reproduction\qquad if\,k>0.75\qquad\qquad(5) Deathifk<0.5Reproductionifk>0.75(5)
死亡策略是针对最虚弱的一只熊,熊 死 亡 的 条 件 是: 种群数量要保证多于种群容 ( 6 ) (6) (6)进行。
( x j R e p r o d u c t i o n ) t = ( x j b e s t ) t + ( x j i ) t / 2 ( 6 ) ({x_j}^{Reproduction})^t={({{x_j}^{best}})^t+({{x_j}^{i}})^t}/2\qquad(6) (xjReproduction)t=(xjbest)t+(xji)t/2(6)

算法步骤

1)定义参数:适应值 f f f、解维度、迭代次 数 T T T、种 群 最大容量 n n n和视野最大距离等;

2)随机生成初始种群 75 % n 75%n 75n并记录最好解;

3)对种群中的每个北极熊,随机设置每个维度的斜角度值 φ φ φ

4)利用公式 (3)计算搜索半径 r r r

5)在 “+”号作用下采用公式 (4)计算北极熊新位 置,如果新位置更好,更新当前位置;

6)在 “-”号作用下采用公式 (4)计算北极熊新位 置,如果新位置更好,更新当前位置;

7)根据公式 (1)和 w w w,决策北极熊的位置;

8)对种群进行排序,选出排序第一位的北极熊判断是 否更新全局最好解;

9)随机从当前种群 10 10% 10个最好解中,选择 1 1 1个与全局 最好解不同的解;

10)随机产生 k k k值,如 果 k < 0.25 k<0.25 k<0.25且 熊 数 量 大 于 50 % 50% 50,则移除种群中排序在最后一名的解;

11)如果熊的数量小于 n − 1 n-1 n1,则根据公式 (6)繁衍1 只新熊加入种群;

12)判断是否达到最大迭代次数,是则转13),否则跳 转到3);

13)输出全局最好解和适应值,退出算法。

Python代码实现

参数设定
'''
# 全局参数设定
'''
M:种群最大容量
m:种群当前规模大小
N:目标函数解的维度
T:迭代次数
V:最大视野距离
X:解集合
P:初始化种群数量百分比
K:动态调整规模参数
B:变量限制范围
'''
# 问题1:迭代陷于局部最优
M, N, T, V, P, K, B = 30, 20, 201, 0.3, 0.75, 0.25, [-32, 32]
m = int(np.floor(M * P))
寻优函数
def function(X):
    y1 = 0
    for i in X:
        y1 += i*i
    y2 = 0
    for i in X:
        y2 += np.cos(2*np.pi*i)
    y = -20 * np.exp(-0.2 * np.sqrt(1 / 30 * y1))-np.exp(1/30*y2)+20+np.exp(1)
    return y
浮冰漂移 (全局搜索)策略
fits = np.zeros(M)

def move(index, angle, radius, action):
    # print('index, angle, radius, action, N', index, angle, radius, action, N)
    temp = np.zeros(N)
    for j in range(N):
        # print("j:", j)
        result = 0
        # 计算sin部分的累加值
        for k in range(j):
            result += np.sin(angle[k])
        if 'add'.__eq__(action):
            temp[j] = X[index][j] + radius * (result + np.cos(angle[j]))
        else:
            temp[j] = X[index][j] - radius * (result + np.cos(angle[j]))
    return temp
海豹捕捉 (局部搜索)策略
res = np.zeros(50)
# main loop
fitness = np.zeros(T)
for _ in range(1):
    # 初始化
    m = int(np.floor(M * P))
    # X = np.zeros((M, N))
    #
    # # 随机初始化
    # X[:m] = np.random.random((m, N)) * (B[1] - B[0]) + B[0]
    X = np.loadtxt(open("./pop_Ackley.csv", "rb"), delimiter=",", skiprows=0)
    f_best = np.inf
    x_best = 0
    for i in range(m):
        fits[i] = function(X[i])

    arg = np.argsort(fits[:m])

    if fits[arg[0]] < f_best:
        f_best = fits[arg[0]]
        x_best = X[arg[0]]
    # 测试一次 迭代T次
    t = 0

    while t < T:
        # area search
        # 视野半径后期变大 跳出局部最优
        # 对种群每一只北极熊
        for i in range(m):
            # 局部搜索
            angles = np.random.random(N) * 2 * np.pi
            sta = np.random.random() * V
            angle0 = np.random.random() * np.pi / 2
            r = 4 * sta * np.cos(angle0) * np.sin(angle0)
            # using the sign of add
            tmp = move(i, angles, r, 'add')
            if function(tmp) < function(X[i]):
                X[i] = tmp
            else:
                tmp = move(i, angles, r, 'minus')
                if function(tmp) < function(X[i]):
                    X[i] = tmp
            # 全局搜索
            # 决策北极熊的位置
            w = np.sqrt(np.sum((x_best - X[i]) ** 2))
            alpha = np.random.random()
            gamma = np.random.random() * w
            tmp = X[i] + np.sign(w) * alpha + gamma
            if function(tmp) < function(X[i]):
                X[i] = tmp

        # 统计当前适应度值
        for i in range(m):
            fits[i] = function(X[i])
        arg = np.argsort(fits[:m])

        if fits[arg[0]] < f_best:
            f_best = fits[arg[0]]
            x_best = X[arg[0]]
        # 种群的动态变化
        k = np.random.random()
        # 种群繁衍
        if m < M - 1 and k > (1 - K):
            # 从前10%中随机抽取一个 个体与最好个体交配 生成新的个体
            idx = random.randint(1, np.floor(m * 0.1) + 1)
            X[m] = (x_best + X[arg[idx]]) / 2
            m += 1
        # 最弱个体死亡
        if m > M * 0.5 and k < K:
            # arg中排序最后的为最弱个体
            # 死亡之后 后面的所有个体往前移动一个位置
            X[arg[-1]:m] = X[arg[-1] + 1:m + 1]
            m -= 1
        print(t, " 当前最小适应度值:", f_best, '个体为:', x_best, '种群数量:', m)
        fitness[t] = f_best
        t += 1
    print("第", _, '次测试', "最小适应度值:", f_best, '个体为:', x_best)

    res[_] = f_best
寻优结果

在这里插入图片描述

下载链接

北极熊优化算法无差错下载链接

参考文献

[1]张亮, 韩毅, 邓丽丽. 国外新型智能优化算法——北极熊算法[J]. 计算机测量与控制, 2020, 28(3):7.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Performer_Cherry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值