【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(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×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)

        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 + stepsize

        Iter = Iter+1
        if Iter!=MaxIter:
            Convergence_curve[Iter] = Top_predator_fit

    return 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
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【自控实验】4. 数字仿真实验

本科课程实验报告&#xff0c;有太多公式和图片了&#xff0c;干脆直接转成图片了 仅分享和记录&#xff0c;不保证全对 使用matlab中的simulink进行仿真 实验内容 线性连续控制系统的数字仿真 根据开环传递函数G(S)的不同&#xff0c;完成两个线性连续控制系统的仿真。 …

C#上位机与欧姆龙PLC的通信12----【再爆肝】上位机应用开发(WPF版)

1、先上图 继上节完成winform版的应用后&#xff0c;今天再爆肝wpf版的&#xff0c;看看看。 可以看到&#xff0c;wpf的确实还是漂亮很多&#xff0c;现在人都喜欢漂亮的&#xff0c;颜值高的&#xff0c;现在是看脸时代&#xff0c;作为软件来说&#xff0c;是交给用户使用的…

【目标检测】YOLOv5算法实现(七):模型训练

本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github&#xff0c;删减了源码中部分内容&#xff0c;满足个人科研需求。   本系列文章主要以YOLOv5为例完成算法的实现&#xff0c;后续修改、增加相关模…

vue3hooks的使用

在 Vue 3 中&#xff0c;hooks 是用于封装组件逻辑的方法&#xff0c;类似于 Vue 2 中的 mixins。 使用 Hooks 可以提高代码的可维护性、可读性、可复用性和可测试性&#xff0c;降低代码之间的耦合度&#xff0c;使得组件的状态更加可控和可预测。 要使用 hooks&#xff0c;…

【VRTK】【Unity】【游戏开发】更多技巧

课程配套学习项目源码资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 本篇将较为零散但常用的VRTK开发技巧集合在一起,主要内容: 创建物理手震动反馈高亮互动对象【创建物理手】 非物理手状态下,你的手会直接…

MATLAB - 四旋翼飞行器动力学方程

系列文章目录 前言 本例演示了如何使用 Symbolic Math Toolbox™&#xff08;符号数学工具箱&#xff09;推导四旋翼飞行器的连续时间非线性模型。具体来说&#xff0c;本例讨论了 getQuadrotorDynamicsAndJacobian 脚本&#xff0c;该脚本可生成四旋翼状态函数及其雅各布函数…

C++|44.智能指针

文章目录 智能指针unique_ptr特点一——无法进行复制 shared_ptr特点一——可复制特点二——计数器&#xff08;用于确定删除的时机&#xff09; 其他 智能指针 通常的指针是需要特殊地去申请对应的空间&#xff0c;并在不使用的时候还需要人工去销毁。 而智能指针相对普通的指…

ubuntu20.04网络问题以及解决方案

1.网络图标消失&#xff0c;wired消失&#xff0c;ens33消失 参考&#xff1a;https://blog.51cto.com/u_204222/2465609 https://blog.csdn.net/qq_42265170/article/details/123640669 原始是在虚拟机中切换网络连接方式&#xff08;桥接和NAT&#xff09;&#xff0c; 解决…

Java-网络爬虫(三)

文章目录 前言一、爬虫的分类二、跳转页面的爬取三、网页去重四、综合案例1. 案例三 上篇&#xff1a;Java-网络爬虫(二) 前言 上篇文章介绍了 webMagic&#xff0c;通过一个简单的入门案例&#xff0c;对 webMagic 的核心对象和四大组件都做了简要的说明&#xff0c;以下内容…

LeetCode---121双周赛---数位dp

题目列表 2996. 大于等于顺序前缀和的最小缺失整数 2997. 使数组异或和等于 K 的最少操作次数 2998. 使 X 和 Y 相等的最少操作次数 2999. 统计强大整数的数目 一、大于等于顺序前缀和的最小缺失整数 简单的模拟题&#xff0c;只要按照题目的要求去写代码即可&#xff0c;…

高级分布式系统-第6讲 分布式系统的容错性--进程的容错

分布式系统的容错原则既适用于硬件&#xff0c; 也适用于软件。 两者的主要区别在于硬件部件的同类复制相对容易&#xff0c; 而软件组件在运行中的同类复制&#xff08; 进程复制&#xff09; 涉及到更为复杂的分布式操作系统的容错机制。 以下是建立进程失效容错机制的一些基…

腾讯云添加SSL证书

一、进入腾讯云SSL证书&#xff1a; ssl证书控制台地址 选择“我的证书”&#xff0c;点击"申请免费证书" 2、填写域名和邮箱&#xff0c;点击“提交申请” 在此页面中会出现主机记录和记录值。 2、进入云解析 DNS&#xff1a;云解析DNS地址 进入我的解析-记录…

css3基础语法与盒模型

css3基础语法与盒模型 前言CSS3基础入门css3的书写位置内嵌式外链式导入式&#xff08;工作中几乎不用&#xff09;行内式 css3基本语法css3选择器标签选择器id选择器class类名原子类复合选择器伪类元素关系选择器序号选择器属性选择器css3新增伪类![在这里插入图片描述](https…

AI教我学编程之C#类型

前言 在上一课 中我们通过C#入门程序了解到关于C#的基础知识&#xff0c;这节课我们来感受作为C家族最大的黑马&#xff0c;在TIOBE榜单 上受欢迎程度未来两个月可能超越java的存在&#xff1a;C#的魅力 重点先知 1、C#程序或DLL的源代码是一组类型声明。 2、对于可执行程序&…

高压消防泵:科技与安全性的完美结合

在现代社会&#xff0c;随着科技的不断发展&#xff0c;各种高科技设备层出不穷&#xff0c;为我们的生活带来了极大的便利。在森林火灾扑救领域&#xff0c;恒峰智慧科技研发的高压消防泵作为一种高效、节能、绿色、环保的优质设备&#xff0c;将科技与安全性完美地结合在一起…

【面试突击】注册中心面试实战

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

uniapp 如何使用echarts 以及解决tooltip自定义不生效问题

使用的是echarts-for-wx插件&#xff1b; 正常写法案例&#xff1a;给tooltip数值加个% <template><view><uni-ec-canvas class"uni-ec-canvas"id"uni-ec-canvas"ref"canvas"canvas-id"uni-ec-canvas":ec"ec&quo…

蚁群算法(ACO)解决旅行商(TSP)问题的python实现

TSP问题 旅行商问题&#xff08;Travelling Salesman Problem, 简记TSP&#xff0c;亦称货郎担问题)&#xff1a;设有n个城市和距离矩阵D [dij]&#xff0c;其中dij表示城市i到城市j的距离&#xff0c;i, j 1, 2 … n&#xff0c;则问题是要找出遍访每个城市恰好一次的一条回…

Salesforce财务状况分析

纵观Salesforce发展史和十几年财报中的信息&#xff0c;Salesforce从中小企业CRM服务的蓝海市场切入&#xff0c;但受限于中小企业的生命周期价值和每用户平均收入小且获客成本和流失率不对等&#xff0c;蓝海同时也是死海。 Salesforce通过收购逐渐补足品牌和产品两块短板&am…

Unity中URP下实现深度贴花

文章目录 前言一、场景设置二、实现思路1、通过深度图求出像素所在视图空间的Z值2、通过模型面片的求出像素在观察空间下的坐标值3、结合两者求出 深度图中像素的 XYZ值4、再将此坐标转换到模型的本地空间&#xff0c;把XY作为UV来进行纹理采样 三、URP下实现1、通过深度图求出…