群体智能算法-北极熊算法(PBO)-python代码实现附详细注释

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:变量限制范围
'''
# 问题1:迭代陷于局部最优
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))


# Generate a population consisting of 75%M bears at random
# 论文提出的基础的算法是random 随机生成的


def Func(x):
    # Rastragin f4
    # return np.sum(x[:] ** 2 - 10 * np.cos(2 * np.pi * x[:]) + 10)
    # weierstrass
    # return np.sum((x + 0.5) ** 2)
    # Sphere f9
    # return np.sum(x ** 2)
    # Dixon-Price f1
    return (x[0] - 1) ** 2 + sum((i + 1) * (2 * x[i] ** 2 - x[i - 1]) ** 2 for i in range(1, len(x)))
    # Griewank f2
    # return
    # Rosenbrock f5
    # Styblinski - Tang f11
    # return
    # Weierstrass f12
    # return 0.5 * np.sum(x ** 4 - 16 * (x ** 2) + 5 * x)


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
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次
    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 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):
            # 从前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)
        t += 1
    print("第", _, '次测试', "最小适应度值:", f_best, '个体为:', x_best)

    res[_] = f_best
print('100个体、100次迭代、其他参数一致')
print('f4  函数的测试平均结果为:', np.mean(res))

print('标准方差:', np.std(res, ddof=1))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值