【Python】新鲜出炉的海洋捕食者算法Python版本

2020年发表的海洋捕食者算法《Marine Predators Algorithm: A nature-inspired metaheuristic》。

作者只在原论文中给出了MATLAB代码,网上也没有Python版本,我自己用Python重写了MATLAB代码。

"""2020海洋捕食者算法
"""
import numpy as np
import random
import mathdef 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 xdef levy(n, m, beta):num = math.gamma(1+beta)*math.sin(math.pi*beta/2)den = math.gamma((1+beta)/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×dimfitness = 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 = 0FADs = 0.2P = 0.5while 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_posCF = (1-Iter/MaxIter)**(2*Iter/MaxIter)RL=0.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 Iter>MaxIter/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 + stepsizeIter = Iter+1if Iter!=MaxIter:Convergence_curve[Iter] = Top_predator_fitreturn Top_predator_fit, Top_predator_pos, Convergence_curve

在23个基准函数上跑了一遍,验证得代码正确

fun 1 ---- 4 轮的平均值: 1.590879014464718e-22
fun 2 ---- 4 轮的平均值: 3.1015801972813803e-13
fun 3 ---- 4 轮的平均值: 2.1687101928786233e-05
fun 4 ---- 4 轮的平均值: 2.738516688049143e-09
fun 5 ---- 4 轮的平均值: 24.3651022631242
fun 6 ---- 4 轮的平均值: 1.5518969799868655e-08
fun 7 ---- 4 轮的平均值: 0.0007603777498045276
fun 8 ---- 4 轮的平均值: -9759.428902632117
fun 9 ---- 4 轮的平均值: 0.0
fun 10 ---- 4 轮的平均值: 1.1923795284474181e-12
fun 11 ---- 4 轮的平均值: 0.0
fun 12 ---- 4 轮的平均值: 9.427489581332269e-10
fun 13 ---- 4 轮的平均值: 2.018121184109257e-08
fun 14 ---- 4 轮的平均值: 0.9980038377944498
fun 15 ---- 4 轮的平均值: 0.00030748598780886593
fun 16 ---- 4 轮的平均值: -1.0316284534898776
fun 17 ---- 4 轮的平均值: 0.39788735772973816
fun 18 ---- 4 轮的平均值: 2.999999999999924
fun 19 ---- 4 轮的平均值: -3.862782147820756
fun 20 ---- 4 轮的平均值: -3.3219951715813822
fun 21 ---- 4 轮的平均值: -10.153199679022137
fun 22 ---- 4 轮的平均值: -10.40294056677283
fun 23 ---- 4 轮的平均值: -10.53640981666291
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412578.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.如何关闭软件开机自启动

1.打开任务管理器 第一步 第二步 第三步

Flink编程——风险欺诈检测

Flink 风险欺诈检测 文章目录 Flink 风险欺诈检测背景准备条件FraudDetectionJob.javaFraudDetector.java 代码分析执行环境创建数据源对事件分区 & 欺诈检测输出结果运行作业欺诈检测器 欺诈检测器 v1&#xff1a;状态欺诈检测器 v2&#xff1a;状态 时间完整的程序期望的…

Java开发的审批流系统,前端使用vue,支持常态化工作审批流程

一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;快速开发平台&#xff0c;可插拔工作流服务。 二、项目介绍 本项目拥有用户管理&#xff0c;部门管理&#xff0c;代码生成&#xff0c;系统监管&#xff0c;报表&#xff0c;大屏展示&#xff0c;业…

uniapp APP接入Paypal

1. 登录paypal开发者中心&#xff0c; 2. 选择 Apps & Credentials 点击 Create App创建应用&#xff0c;创建后点击编辑按钮&#xff0c;如图&#xff1a; 3. 进入应用详情&#xff0c;勾选Log in with PayPal点击 Advanced Settings 添加return URL等信息并保存。如图&a…

如何使用VNC实现Win系统远程桌面Ubuntu图形化界面【内网穿透】

文章目录 推荐前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 …

封装日期时间组件

概述 该组件包含日期选择&#xff0c;任意时间选择、固定时间点选择。 子组件代码(date-picker.vue) <template><div id"date_picker"><el-popover placement"top" width"322" trigger"click" ref"popover&quo…

【干货】网络安全之URL过滤

热门IT课程【视频教程】-华为/思科/红帽/oraclehttps://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 URL过滤是一种针对用户的URL请求进行上网控制的技术&#xff0c;通过允许或禁止用户访问某些网页资源&#xff0c;达到规范上网行为和降低安全…

openGauss学习笔记-201 openGauss 数据库运维-常见故障定位案例-执行修改表分区操作时报错

文章目录 openGauss学习笔记-201 openGauss 数据库运维-常见故障定位案例-执行修改表分区操作时报错201.1 执行修改表分区操作时报错201.1.1 问题现象201.1.2 原因分析201.1.3 处理办法 openGauss学习笔记-201 openGauss 数据库运维-常见故障定位案例-执行修改表分区操作时报错…

2024-01-18

今天是我失业的第二天&#xff0c;很难受&#xff0c;但是生活需要继续 今日八股文内容&#xff1a; JVM&#xff1a;JVM由那些区域组成&#xff1a;堆。&#xff08;本地方法和java&#xff09;栈&#xff0c;方法区&#xff0c;程序计数器。线程私有的是栈和程序计数器 。…

transbigdata笔记:轨迹切片

1 方法介绍 在transbigdata笔记&#xff1a;轨迹停止点和行程提取-CSDN博客中&#xff0c;已经可以把轨迹点拆分成停止点和行程点&#xff0c;但是行程点只有起止位置&#xff0c;不包含行程轨迹信息为了进一步分析车辆的行驶轨迹&#xff0c;需要从每次行程的时间段中提取轨迹…

(二十)Flask之上下文管理第一篇(粗糙缕一遍源码)

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

风丘科技为您提供完整的ADAS测试方案

一 方案概述 随着5G通讯与互联网的快速发展&#xff0c;智能汽车和ADAS辅助系统的研究与发展在世界范围内也在如火如荼地进行。风丘科技紧跟时代脚步&#xff0c;经多年积累沉淀&#xff0c;携手整车厂与高校共同研发打造出了一套完整且适用于国内ADAS测试的系统方案。 | ADAS…