import numpy as np
import random
import matplotlib.pyplot as plt
np.set_printoptions(suppress=False)
'''
北极熊算法
浮冰漂移:全局搜索
具体捕猎:局部搜索
author:sugarMei
date:6/25
version:1.1
'''
'''
M:种群最大容量
m:种群当前规模大小
N:目标函数解的维度
T:迭代次数
V:最大视野距离
X:解集合
P:初始化种群数量百分比
K:动态调整规模参数
B:变量限制范围
'''
M, N, T, V, P, K, B = 100, 20, 100, 0.3, 0.75, 0.25, [-10, 10]
m = int(np.floor(M * P))
X = np.zeros((M, N))
def Func(x):
return (x[0] - 1) ** 2 + sum((i + 1) * (2 * x[i] ** 2 - x[i - 1]) ** 2 for i in range(1, len(x)))
fits = np.zeros(M)
def move(index, angle, radius, action):
temp = np.zeros(N)
for j in range(N):
result = 0
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)
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]
f_best = np.inf
x_best = 0
for i in range(m):
fits[i] = Func(X[i])
arg = np.argsort(fits[:m])
if fits[arg[0]] < f_best:
f_best = fits[arg[0]]
x_best = X[arg[0]]
t = 0
while t < T:
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)
tmp = move(i, angles, r, 'add')
if Func(tmp) < Func(X[i]):
X[i] = tmp
else:
tmp = move(i, angles, r, 'minus')
if Func(tmp) < Func(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 Func(tmp) < Func(X[i]):
X[i] = tmp
for i in range(m):
fits[i] = Func(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):
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:
X[arg[-1]:m] = X[arg[-1] + 1:m + 1]
m -= 1
print(t, " 当前最小适应度值:", f_best, '个体为:', x_best, '种群数量:', m)
t += 1
print("第", _, '次测试', "最小适应度值:", f_best, '个体为:', x_best)
res[_] = f_best
print('100个体、100次迭代、其他参数一致')
print('f4 函数的测试平均结果为:', np.mean(res))
print('标准方差:', np.std(res, ddof=1))