北极熊优化算法PBO的理论知识以及python代码实现
北极熊优化算法
1.条件假设
在北极熊算法 中,假 设 种 群 由 k 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=(x0,x1,…,xn−1),在第 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)t−1+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,正})
(负,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)
w=k=0∑n−1(xkbest−xki)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)](4)xn−2new=xn−2dd±r[∑sin(φk)+cos(φn−1)]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 75%n并记录最好解;
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 n−1,则根据公式 (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.