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

news2024/11/17 6:20:50

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
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python元组(tuple)

目录 元组元组的创建和删除访问元组元素修改元组元组方法 元组 元组是有序且不可更改的集合。在 Python 中&#xff0c;元组是用圆括号编写的。 元组的创建和删除 实例 创建元组&#xff1a; thistuple ("a", "b", "c") print(thistuple)删除…

微软等开源评估ChatGPT、Phi、Llma等,统一测试平台

微软亚洲研究院、中国科学院自动化研究所、中国科学技术大学和卡内基梅隆大学联合开源了&#xff0c;用于评估、分析大语言模型的统一测试平台——PromptBench。 Prompt Bench支持目前主流的开源、闭源大语言模型&#xff0c;例如&#xff0c;ChatGPT、GPT-4、Phi、Llma1/2、G…

Ps:操控变形

Ps菜单&#xff1a;编辑/操控变形 Edit/Puppet Warp 操控变形 Puppet Warp命令能够借助网格随意扭曲特定图像区域&#xff0c;同时可保持其他区域不变。 其应用范围小至精细的图像修饰&#xff08;如发型设计&#xff09;&#xff0c;大至总体的变换&#xff08;如重新定位手臂…

【J-Flash基本使用总结】

【J-Flash基本使用总结】 VX&#xff1a;hao541022348 ■ 烧录文件■ 创建新的工程■ 烧录模式-SWD模式■ 烧录 ■ 读单片机Flash数据■ 设置或解除读保护 ■ 烧录文件 ■ 创建新的工程 接着点击 Options –> Project Settings…&#xff0c;选择CPU > Device &#xff…

Hive基础知识(十一):Hive的数据导出方法示例

1. Insert 导出 1&#xff09;将查询的结果导出到本地 hive (default)> insert overwrite local directory /opt/module/hive/data/export/student select * from student5; Automatically selecting local only mode for query Query ID atguigu_20211217153118_31119102-…

libignition-gazebo-diff-drive-system.so是什么

因该就是个动态链接库&#xff0c;库文件之类 而且就是gazebo6版本也就是ign 这个版本的动态链接库有个特点&#xff1a;全部都是以.so结尾&#xff0c;所以很可能ign的插件plugin都是带.so的 abcdegx.so elvikorflsd.so fvlwirjgiojf.so等

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑新能源配网三相不平衡治理的电动汽车充电策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题表明研究着重于开发一种电动汽车充电策略&#xff0c;该策略考虑了在新能源配电网络中存在的三相不平衡问题。解读如下&#xff1a; 电动汽车充…

java中数组

文章目录 java中数组思维导图数组数组概念 数组定义格式详解数组的访问 常见异常数组索引值越界异常&#xff1a;ArrayIndexOutOfBoundsException空指针异常&#xff1a;NullPointerException 案例例一打印A-Z和0-9例二数组转置输出 java中数组 思维导图 数组 数组概念 组就…

LLaMA-Factory添加adalora

感谢https://github.com/tsingcoo/LLaMA-Efficient-Tuning/commit/f3a532f56b4aa7d4200f24d93fade4b2c9042736和https://github.com/huggingface/peft/issues/432的帮助。 在LLaMA-Factory中添加adalora 1. 修改src/llmtuner/hparams/finetuning_args.py代码 在FinetuningArg…

C++:cout 的一些注意事项

有时cout不会将结果立即输出到屏幕&#xff08;也就是缓冲&#xff09;&#xff0c;该情况不会对竞赛测评有影响。 例子如下&#xff1a; ps:用puts立即输出 原因&#xff1a; 解决方法&#xff1a;在每一个cout后跟\n或flush cout << "This will be immediately d…

Linux/SwagShop

Enumeration nmap 仍然一样&#xff0c;先使用nmap探索目标开放端口情况 看到开启了22端口和80端口&#xff0c;还是一样的&#xff0c;先从80端口开始探索&#xff0c;从nmap给出的结果&#xff0c;我们可以看到有一个域名&#xff0c;因此在/etc/hosts中添加域名到IP的映射…

集简云动作管理平台上线:创建强大且可分享的AI助手(GPTs)

OpenAI的GPT Store于昨天上线&#xff0c;用户可以找到好用的GPTs&#xff0c;也可以将自己的GPTs分享到GPT Store中。未来&#xff08;预计今年1季度&#xff09;甚至可以从GPTs Store中获取利润分成。 要创建强大的GPTs离不开调用外部的软件工具&#xff0c;比如查询CRM/ERP软…

索引不是银弹

数据库索引&#xff1a;不是银弹 使用环境索引分类创建索引的代价最佳实践不是所有针对索引列的查询都能使用索引加速查询 索引只能匹配列的前缀条件涉及函数操作的无法使用索引联合索引只能匹配左边的列 总结 数据库索引是优化性能的良药&#xff0c;但却不是银弹&#xff01…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块一

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

Nginx配置负载均衡实例

Nginx配置反向代理实例二 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 负载均衡实例实现的效果 浏览器地址栏输入地址http://192.168.0.101/test/a.html&#xff0c;刷新页面进行多次请求&#xff0c;负载均衡效果&#xff0c;平均分配到8080端口服务和8…

ElasticSearch 学习9 spring-boot ,elasticsearch7.16.1实现中文拼音分词搜索

一、elasticsearch官网下载&#xff1a;Elasticsearch 7.16.1 | Elastic 二、拼音、ik、繁简体转换插件安装 ik分词&#xff1a;GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized d…

python 异常处理 try...except...finally..

python 异常处理&#xff1a; 简单的异常处理主要依靠内置异常处理结构体&#xff0c;代码结构如下&#xff1a; try: … except ValueError as e: # 异常判断&#xff0c;出现ValueError错误时处理机制 … except ZeroDivisionError as e: # 异常判断&#xff0c;出现ZeroDiv…

书生·浦语大模型--第二节课笔记

书生浦语大模型--第二节课 大模型及InternLM基本介绍实战部分demo部署准备工作模型下载代码准备终端运行web demo 运行 Lagent 智能体工具调用 Demo准备工作Demo 运行 浦语灵笔图文理解创作 Demo环境准备下载模型下载代码运行 大模型及InternLM基本介绍 大模型 定义&#xff…

数据结构中的一棵树

一、树是什么&#xff1f; 有根有枝叶便是树&#xff01;根只有一个&#xff0c;枝叶可以有&#xff0c;也可以没有&#xff0c;可以有一个&#xff0c;也可以有很多。 就像这样&#xff1a; 嗯&#xff0c;应该是这样&#xff1a; 二、一些概念 1、高度 树有多高&#x…