【Python】新鲜出炉的海洋捕食者算法Python版本 2020年发表的海洋捕食者算法《Marine Predators Algorithm: A nature-inspired metaheuristic》。作者只在原论文中给出了MATLAB代码网上也没有Python版本我自己用Python重写了MATLAB代码。 2020海洋捕食者算法 import numpy as np import random import math def initial(pop, dim, ub, lb): X np.zeros([pop, dim]) for i in range(pop): for j in range(dim): X[i, j] random.random() * (ub[j] - lb[j]) lb[j] # 均匀分布随机初始化 return X, lb, ub # 将超过边界的直接用边界值赋值 def BorderCheckForOne(x, ub, lb, pop, dim): if x ub[0]: x ub[0] elif x lb[0]: x lb[0] return x def levy(n, m, beta): num math.gamma(1beta)*math.sin(math.pi*beta/2) den math.gamma((1beta)/2) * beta * 2**((beta-1)/2) sigma_u (num/den)**(1/beta) u np.random.normal(0,sigma_u,(n,m)) v np.random.normal(0,1,(n,m)) return u/(np.abs(v)**(1/beta)) ## ^的用法好像有错 def MPA(pop, dim, lb, ub, MaxIter, fun): Top_predator_pos np.zeros(dim) #或者np.zeros([1,dim]) Top_predator_fit float(inf) Convergence_curve np.zeros(MaxIter) stepsize np.zeros([pop, dim]) # pop×dim fitness np.inf * np.ones([pop, 1]) # pop×1 # 初始化种群 X, lb, ub initial(pop, dim, ub, lb) Xmin lb[0] * np.ones([pop, dim]) Xmax ub[0] * np.ones([pop, dim]) Iter 0 FADs 0.2 P 0.5 while Iter MaxIter: # 对上一轮的进行复盘 for i in range(0, pop): # 1.边界检测 for j in range(0, dim): X[i, j] BorderCheckForOne(X[i, j], ub, lb, pop, dim) # 2.计算每个鲨鱼的适应度值 fitness[i, 0] fun(X[i, :]) if fitness[i, 0] Top_predator_fit: # 23个基准函数都是越小越好 Top_predator_fit fitness[i, 0].copy() Top_predator_pos X[i, :].copy() # Memory saving if Iter 0: fit_old fitness.copy() X_old X.copy() for i in range(pop): if fit_old[i, 0] fitness[i, 0]: fitness[i, 0] fit_old[i, 0].copy() # 如果上一轮的位置更好还是用上一轮的 X[i, :] X_old[i, :].copy() fit_old fitness.copy() X_old X.copy() # Levy Elite np.ones([pop, 1]) * Top_predator_pos CF (1-Iter/MaxIter)**(2*Iter/MaxIter) RL0.05*levy(pop, dim, 1.5) # levy返回一个pop×dim的矩阵 RB np.random.randn(pop, dim) # 满足正态分布的pop×dim大小矩阵 # 遍历每个个体 for i in range(pop): for j in range(dim): R random.random() # 公式12 if Iter MaxIter/3: stepsize[i, j] RB[i, j] * ( Elite[i, j]-RB[i, j]*X[i, j] ) X[i, j] X[i, j] P*R*stepsize[i, j] # 公式13 和 14 elif IterMaxIter/3 and Iter 2*MaxIter/3: if i pop/2: stepsize[i, j] RB[i, j] * (RB[i, j]*Elite[i, j]-X[i, j]) X[i, j] Elite[i, j] P*CF*stepsize[i, j] else: stepsize[i, j] RL[i, j] * (Elite[i, j]-RL[i, j]*X[i, j]) X[i, j] X[i, j] P * R *stepsize[i, j] # 公式15 else: stepsize[i, j] RL[i, j]*( RL[i, j]*Elite[i, j]-X[i, j]) X[i, j] Elite[i, j] P*CF*stepsize[i, j] # 对上一轮的进行复盘 for i in range(0, pop): # 1.边界检测 for j in range(0, dim): X[i, j] BorderCheckForOne(X[i, j], ub, lb, pop, dim) # 2.计算每个鲨鱼的适应度值 fitness[i, 0] fun(X[i, :]) if fitness[i, 0] Top_predator_fit: # 23个基准函数都是越小越好 Top_predator_fit fitness[i, 0].copy() Top_predator_pos X[i, :].copy() # Memory saving if Iter 0: fit_old fitness.copy() X_old X.copy() for i in range(pop): if fit_old[i, 0] fitness[i, 0]: fitness[i, 0] fit_old[i, 0].copy() # 如果上一轮的位置更好还是用上一轮的 X[i, :] X_old[i, :].copy() fit_old fitness.copy() X_old X.copy() # 对整体进行一个更新公式16 if random.random() FADs: U (np.random.rand(pop, dim) FADs) X X CF*np.multiply(Xmin np.multiply(np.random.rand(pop, dim), (Xmax-Xmin)), U) else: r random.random() stepsize (FADs*(1-r)r) * (X[random.sample(range(0, pop), pop),:] - X[random.sample(range(0, pop), pop),:]) X X stepsize Iter Iter1 if Iter!MaxIter: Convergence_curve[Iter] Top_predator_fit return Top_predator_fit, Top_predator_pos, Convergence_curve在23个基准函数上跑了一遍验证得代码正确fun 1 ---- 4 轮的平均值: 1.590879014464718e-22fun 2 ---- 4 轮的平均值: 3.1015801972813803e-13fun 3 ---- 4 轮的平均值: 2.1687101928786233e-05fun 4 ---- 4 轮的平均值: 2.738516688049143e-09fun 5 ---- 4 轮的平均值: 24.3651022631242fun 6 ---- 4 轮的平均值: 1.5518969799868655e-08fun 7 ---- 4 轮的平均值: 0.0007603777498045276fun 8 ---- 4 轮的平均值: -9759.428902632117fun 9 ---- 4 轮的平均值: 0.0fun 10 ---- 4 轮的平均值: 1.1923795284474181e-12fun 11 ---- 4 轮的平均值: 0.0fun 12 ---- 4 轮的平均值: 9.427489581332269e-10fun 13 ---- 4 轮的平均值: 2.018121184109257e-08fun 14 ---- 4 轮的平均值: 0.9980038377944498fun 15 ---- 4 轮的平均值: 0.00030748598780886593fun 16 ---- 4 轮的平均值: -1.0316284534898776fun 17 ---- 4 轮的平均值: 0.39788735772973816fun 18 ---- 4 轮的平均值: 2.999999999999924fun 19 ---- 4 轮的平均值: -3.862782147820756fun 20 ---- 4 轮的平均值: -3.3219951715813822fun 21 ---- 4 轮的平均值: -10.153199679022137fun 22 ---- 4 轮的平均值: -10.40294056677283fun 23 ---- 4 轮的平均值: -10.53640981666291

相关新闻

最新新闻

N1盒子刷OpenWRT软路由系统结合内网穿透工具轻松实现远程连接

N1盒子刷OpenWRT软路由系统结合内网穿透工具轻松实现远程连接

文章目录前言1. 制作刷机固件U盘1.1 制作刷机U盘需要准备以下软件:1.2 制作步骤2. N1盒子降级与U盘启动2.1 N1盒子降级2.2 N1盒子U盘启动设置2.3 使用U盘刷入OpenWRT2.4 OpenWRT后台IP地址修改2.5 设置旁路由&无线上网3. 安装cpolar内网穿透3.1 下载公钥3.2 将c…

2026/7/23 18:50:32
【Rust自学】10.1. 提取函数以消除重复代码

【Rust自学】10.1. 提取函数以消除重复代码

10.1 提取函数以消除重复代码 10.1.1. 重复代码 看个例子: fn main(){let number_list vec![1,2,3,4,5];let mut largest number_list[0];for &item in number_list.iter(){if item > largest{largest item;}}println!("The largest number is {}…

2026/7/23 18:50:32
做照明工程前一定要搞懂的三个实际问题

做照明工程前一定要搞懂的三个实际问题

很多业主在启动照明相关项目前,总会被几个共性问题卡住:不知道项目周期怎么排,预算摸不准,改造成本能不能赚回来也没谱。这些问题没有统一答案,得结合项目实际情况拆解开来看。很多人问泛光照明工程从设计到施工要多久…

2026/7/23 18:50:32
城市照明项目里的那些实用参考标准

城市照明项目里的那些实用参考标准

不少项目方在启动照明相关工程时,总会遇到几个绕不开的实际问题:泛光照明工程从设计到施工要多久,商业文旅街区做灯光改造一平方多少钱,办公楼照明节能改造多长时间能回本。这些问题并没有统一的标准答案,但从已落地的…

2026/7/23 18:50:32
融资融券的交易机制、操作条件与风险是什么?为什么两融现在利率最低?

融资融券的交易机制、操作条件与风险是什么?为什么两融现在利率最低?

大家好,我是ArthurGoo,在写这篇文章前,先说句得罪人的话:90%的散户根本就不该碰两融。很多人以为,辛辛苦苦往账户里倒腾资金,熬过了那20天日均50万的资产考核、顺利开通了权限,就是拿到了通往财…

2026/7/23 18:50:32
深入解析EMIF异步写入:Select Strobe与Extended Wait模式实战

深入解析EMIF异步写入:Select Strobe与Extended Wait模式实战

1. 项目概述与核心价值在嵌入式系统开发中,尤其是基于德州仪器(TI)C2000、AM335x等系列处理器的项目,外部存储器接口(EMIF)的配置与调试往往是硬件驱动工程师的“必修课”,也是性能与稳定性的关…

2026/7/23 18:45:32

月新闻