白鲸优化算法(Beluga whale optimization,BWO)Python实现
白鲸优化算法Python实现
- Python实现BWO
Python实现BWO
import numpy as np
import math
from copy import deepcopy
import matplotlib.pyplot as plt'''
白鲸优化算法python实现
参数
n:白鲸种群大小
tmax:最大迭代次数
lb:变量下限
ub:变量上限
nd:变量维数
fobj:目标函数
'''# 白鲸优化算法
def bwo(n, tmax, lb, ub, nd, fobj):# 记录每轮更新最优解变化best_fval = []# 位置矩阵# x = (np.random.random((n, nd)) - 0.5) * 2 * ubx = lb + np.random.random((n, nd)) * (ub - lb)# 适应值矩阵fobj_list = [fobj(x[i, ...]) for i in range(n)]fx = [f() for f in fobj_list]# 适应值拷贝矩阵temp_fx = deepcopy(fx)# 最优解和最优解值xposbest = x[np.argmin(fx)]fvalbest = min(fx)best_fval.append(fvalbest)for t in range(1, tmax + 1):# 位置拷贝矩阵temp_x = deepcopy(x)# 鲸落概率wf = 0.1 - 0.05 * (t / tmax)# 计算每只白鲸的平衡因子bfb0 = np.random.random(n)for b0_index in range(len(b0)):while b0[b0_index] == 0:b0[b0_index] = np.random.random()bf = b0 * (1 - t / (2 * tmax))# 更新每一只白鲸位置for i in range(n):# 探索阶段if bf[i] > 0.5:r1 = np.random.random()r2 = np.random.random()while r1 == 0:r1 = np.random.random()while r2 == 0:r2 = np.random.random()# 选择随机白鲸r = np.random.randint(0, n)while r == i:r = np.random.randint(0, n)pj = np.arange(nd)np.random.shuffle(pj)if nd <= n / 5:temp_x[i, pj[0]] = x[i, pj[0]] + (x[r, pj[0]] - x[i, pj[0]]) * (1 + r1) * np.sin(2 * np.pi * r2)temp_x[i, pj[1]] = x[i, pj[1]] + (x[r, pj[1]] - x[i, pj[1]]) * (1 + r1) * np.cos(2 * np.pi * r2)else:for j in range(int(nd / 2)):temp_x[i, 2 * j] = x[i, 2 * j] + (x[r, pj[1]] - x[i, 2 * j]) * (1 + r1) * np.sin(2 * np.pi * r2)temp_x[i, 2 * j + 1] = x[i, 2 * j + 1] + (x[r, pj[1]] - x[i, 2 * j + 1]) * (1 + r1) * np.cos(2 * np.pi * r2)# 开发阶段else:r3 = np.random.random()r4 = np.random.random()while r3 == 0:r3 = np.random.random()while r4 == 0:r4 = np.random.random()c1 = 2 * r4 * (1 - (t / tmax))# 随机白鲸r = np.random.randint(0, n)while r == i:r = np.random.randint(0, n)beta = 3 / 2delta = ((math.gamma(1 + beta) * np.sin((np.pi * beta) / 2))/ (math.gamma((1 + beta) / 2) * beta * (2 ** ((beta - 1) / 2)))) ** (1 / beta)u = np.random.randn(nd)v = np.random.randn(nd)lf = 0.05 * ((u * delta) / (abs(v) ** (1 / beta)))temp_x[i, ...] = r3 * xposbest - r4 * x[i, ...] + c1 * lf * (x[r, ...] - x[i, ...])# 处理超出边界值flaglb = np.asarray(temp_x[i, ...] < lb).astype(np.int8)flagub = np.asarray(temp_x[i, ...] > ub).astype(np.int8)flag = flaglb + flagubfor k in range(nd):if flag[k] == 0:flag[k] = 1else:flag[k] = 0temp_x[i, ...] = temp_x[i, ...] * flag + ub * flagub + lb * flaglbresult = fobj(temp_x[i, ...])temp_fx[i] = result()if temp_fx[i] < fx[i]:x[i, ...] = temp_x[i, ...]fx[i] = temp_fx[i]# 鲸落for i in range(n):if bf[i] <= wf:r5 = np.random.random()r6 = np.random.random()r7 = np.random.random()while r5 == 0:r5 = np.random.random()while r6 == 0:r6 = np.random.random()while r7 == 0:r7 = np.random.random()c2 = 2 * wf * n# 随机白鲸r = np.random.randint(0, n)xstep = (ub - lb) * (np.exp((-c2 * t) / tmax))temp_x[i, ...] = r5 * x[i, ...] - r6 * x[r, ...] + r7 * xstep# 处理超出边界值flaglb = np.asarray(temp_x[i, ...] < lb).astype(np.int8)flagub = np.asarray(temp_x[i, ...] > ub).astype(np.int8)flag = flaglb + flagubfor m in range(nd):if flag[m] == 0:flag[m] = 1else:flag[m] = 0temp_x[i, ...] = temp_x[i, ...] * flag + ub * flagub + lb * flaglbresult = fobj(temp_x[i, ...])temp_fx[i] = result()if temp_fx[i] < fx[i]:x[i, ...] = temp_x[i, ...]fx[i] = temp_fx[i]# 更改最优值temp_xposbest = x[np.argmin(fx)]temp_fvalbest = min(fx)if temp_fvalbest < fvalbest:fvalbest = temp_fvalbestxposbest = temp_xposbestbest_fval.append(fvalbest)return xposbest, fvalbest, best_fval# 求解适应值
def get_function_result(fname, *args):result = -1if fname == "f1":def f1():return sum(args[0] ** 2)result = f1if fname == "f2":def f2():sum1 = 0sum2 = 0for i in range(len(args[0])):sum1 += abs(args[0][i])for j in range(len(args[0])):sum2 *= abs(args[0][j])return sum1 + sum2result = f2elif fname == "f3":def f3():number = 0for i in range(len(args[0])):number += abs(args[0][i]) ** (i + 1)return numberresult = f3elif fname == "f4":def f4():sum1 = 0sum2 = 0for i in range(len(args[0])):sum1 += args[0][i]for j in range(len(args[0])):sum2 += sum1 ** 2return sum2result = f4elif fname == "f5":def f5():return np.max(abs(args[0]))result = f5elif fname == "f6":def f6():number = 0for i in range(len(args[0]) - 1):number += (100 * ((args[0][i + 1] - (args[0][i] ** 2)) ** 2) + ((args[0][i] - 1) ** 2))return numberresult = f6elif fname == "f7":def f7():number = 0for i in range(len(args[0])):number += ((args[0][i] + 0.5) ** 2)return numberresult = f7elif fname == "f8":def f8():sum = 0for i in range(len(args[0])):sum += (i + 1) * (args[0][i] ** 4)return sum + np.random.random()result = f8elif fname == "f10":def f10():sum = 0for i in range(len(args[0])):sum += args[0][i] * np.sin(np.sqrt(abs(args[0][i])))return -sumresult = f10elif fname == "f12":def f12():sum = 0for i in range(len(args[0])):sum += (args[0][i] ** 4) - 16 * (args[0][i] ** 2) + 5 * args[0][i]return 0.5 * sumresult = f12elif fname == "f13":def f13():sum = 0for i in range(len(args[0])):sum += (args[0][i] ** 2) - 10 * np.cos(2 * np.pi * args[0][i]) + 10return sumresult = f13elif fname == "f16":def f16():a = 0b = 0c = 0for i in range(len(args[0])):a += np.sin(args[0][i]) ** 2b += args[0][i] ** 2c += np.sin(np.sqrt(abs(args[0][i]))) ** 2number = (a - np.exp(-b)) * np.exp(-c)return numberresult = f16elif fname == "f21":def f21():number = 4 * (args[0][0] ** 2) - 2.1 * (args[0][0] ** 4) + (args[0][0] ** 6) / 3 \+ args[0][0] * args[0][1] - 4 * (args[0][1] ** 2) + 4 * (args[0][1] ** 4)return numberresult = f21return result# 获取目标函数相关参数
def get_functions_details(fname):if fname == "f1":lb = -100ub = 100nd = 30fobj = lambda x: get_function_result("f1", x)return lb, ub, nd, fobjelif fname == "f2":lb = -10ub = 10nd = 30fobj = lambda x: get_function_result("f2", x)return lb, ub, nd, fobjelif fname == "f3":lb = -1ub = 1nd = 30fobj = lambda x: get_function_result("f3", x)return lb, ub, nd, fobjelif fname == "f4":lb = -100ub = 100nd = 30fobj = lambda x: get_function_result("f4", x)return lb, ub, nd, fobjelif fname == "f5":lb = -100ub = 100nd = 30fobj = lambda x: get_function_result("f5", x)return lb, ub, nd, fobjelif fname == "f6":lb = -30ub = 30nd = 30fobj = lambda x: get_function_result("f6", x)return lb, ub, nd, fobjelif fname == "f7":lb = -100ub = 100nd = 30fobj = lambda x: get_function_result("f7", x)return lb, ub, nd, fobjelif fname == "f8":lb = -1.28ub = 1.28nd = 30fobj = lambda x: get_function_result("f8", x)return lb, ub, nd, fobjelif fname == "f10":lb = -500ub = 500nd = 30fobj = lambda x: get_function_result("f10", x)return lb, ub, nd, fobjelif fname == "f12":lb = -5ub = 5nd = 30fobj = lambda x: get_function_result("f12", x)return lb, ub, nd, fobjelif fname == "f13":lb = -5.12ub = 5.12nd = 30fobj = lambda x: get_function_result("f13", x)return lb, ub, nd, fobjelif fname == "f16":lb = -10ub = 10nd = 30fobj = lambda x: get_function_result("f16", x)return lb, ub, nd, fobjelif fname == "f21":lb = -5ub = 5nd = 2fobj = lambda x: get_function_result("f21", x)return lb, ub, nd, fobjif __name__ == '__main__':np.set_printoptions(suppress = False)# 白鲸种群数out_n = 50# 最大迭代次数out_tmax = 1000# 目标函数out_fobj = "f16"# 获取函数参数out_lb, out_ub, out_nd, out_fobj = get_functions_details(out_fobj)out_xposbest, out_fvalbest, out_best_fval = bwo(out_n, out_tmax, out_lb, out_ub, out_nd, out_fobj)plt.plot(range(len(out_best_fval)), out_best_fval)plt.xlabel("t")plt.ylabel("best_value")plt.show()print("xposbest = ", out_xposbest)print("fvalbest = ", f"{out_fvalbest: .10f}")
白鲸优化算法(Beluga whale optimization,BWO)Python实现相关推荐
- 白鲸优化算法(Beluga whale optimization,BWO)
白鲸优化算法(Beluga whale optimization,BWO) 一.算法灵感 二.算法介绍 2.1 初始化 2.2 探索阶段 2.3 开发阶段 2.4 鲸落阶段 2.5 算法伪代码 三.实 ...
- 智能优化算法:白鲸优化算法-附代码
智能优化算法:白鲸优化算法 摘要:白鲸优化算法([Beluga whale optimization,BWO)是由是由 Changting Zhong 等于2022 年提出的一种群体智能优化算法.其灵 ...
- 白鲸优化算法学习笔记
白鲸优化算法学习笔记 1. 引言 白鲸优化算法(Whale Optimization Algorithm,简称WOA)是一种基于自然界中的白鲸行为而发展起来的启发式优化算法.该算法模拟了白鲸群体的寻食 ...
- 单目标应用:白鲸优化算法(Beluga whale optimization,BWO)优化双向长短时记忆BiLSTM的权值和阈值(提供MATLAB代码)
一.算法简介 白鲸优化算法(Beluga whale optimization,BWO)由Changting Zhong等人于2022年提出,该算法模拟了白鲸游泳,觅食和"鲸鱼坠落" ...
- 基于白鲸优化算法的函数寻优算法
文章目录 一.理论基础 1.白鲸优化算法 (1)探索阶段 (2)开发阶段 (3)鲸落 2.BWO算法流程图 二.仿真实验与结果分析 三.参考文献 一.理论基础 1.白鲸优化算法 文献[1]从白鲸的行为 ...
- 【智能优化算法-白鲸优化算法】基于白鲸优化算法求解单目标优化问题附matlab代码
1 内容介绍 白鲸优化算法(Beluga whale optimization,BWO)由Changting Zhong等人于2022年提出,该算法模拟了白鲸游泳,觅食和"鲸鱼坠落" ...
- 鲸鱼优化算法(Whale Optimization Algorithm,WOA)
鲸鱼优化算法(Whale Optimization Algorithm,WOA) 一.算法灵感 二.算法介绍 2.1 初始化 2.2 包围猎物阶段 2.3 气泡网捕食法 2.3.1 收缩包围 2.3. ...
- 群体智能优化算法之鲸鱼优化算法(Whale Optimization Algorithm,WOA)
获取更多资讯,赶快关注上面的公众号吧! 文章目录 鲸鱼优化算法(Whale Optimization Algorithm,WOA) 1.1 灵感 1.2 数学建模和优化算法 1.2.1 包围捕食(En ...
- 白骨顶鸡优化算法(Coot Optimization Algorithm,COOT)
白骨顶鸡优化算法(Coot Optimization Algorithm,COOT) 一.算法灵感 二.算法介绍 2.1 初始化 2.2 跟随者位置更新(探索阶段) 2.2.1 主动更新 2.2.1. ...
最新文章
- 线程退出【Linux学习】pthread_create主线程与创建的新线程之间退出关系
- 擷取Registry內的螢幕EDID資訊(沒解決問題不過可以學下)
- 如何写出正确的二分查找?——利用循环不变式理解二分查找及其变体的正确性以及构造方式...
- elasticsearch5.4.3、kibana分布式安装
- 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值...
- LeetCode 518. 零钱兑换 II(动态规划)
- html5 下拉框 美化,纯js超酷select下拉框美化插件
- 为什么中小企业选择 SAP Business One?
- Intellij Idea15开发Web网站
- latex 箭头_Pandoc上手以及如何使得latex文件转换为Docx文件(MAC)
- LoRa无线技术介绍
- mysql hyperloglog_Redis HyperLogLog
- 【车牌识别】基于matlab车辆出入库计时系统【含Matlab源码 469期】
- 聚焦智能制造 香洲区产学研资对接合作活动 盈致科技成功牵手北理珠
- #define c# 报错_天轰穿C#教程之#define和#undef【原创】
- Unity 编辑器开发实战【Scene View】- UI Selector
- react中引入百度地图时,去掉百度地图的logo和信息
- 教你电脑休眠如何取消
- 优秀前端工程师必备: checkbox radio--单钩 多钩 大比较:你是♂||♀ , 还是 ♂♀...
- java集合系列——java集合概述(一)