当前位置: 首页 > news >正文

布谷鸟优化算法C++

#include <iostream>
#include <vector>
#include <cmath>
#include <random>
#include <time.h>
#include <fstream>
#define pi acos(-1)
//5只布谷鸟
constexpr int NestNum = 40;    
//pi值
//规定X,Y 的取值范围
constexpr double X_max = 5;
constexpr double X_min = 0;
constexpr double Y_max = 5;
constexpr double Y_min = 0;
//最大迭代次数
constexpr int MaxIterationTimes = 300;
//被宿主发现的概率
constexpr double Pa = 0.25;

//自变量结构体
struct Nest {
    double x;
    double y;
    double fitness;
};
void fitFunc(Nest& nest);
int findBetterNest(std::vector<Nest>&);
std::vector<Nest> levy(std::vector<Nest> OldNestPop, std::size_t bestNum);
std::vector<Nest> RandomAbandonPaNestPop(std::vector<Nest> OldNestPop);
//随机数引擎
static std::default_random_engine e(time(0));
static std::uniform_real_distribution<double> u(0, 1);
int main(void)
{
    bool flag_output = false;
    double Xold;
    double Xnew;
    double Yold;
    double Ynew;
    std::ofstream outfileX("D:\\cuckoo\\cuckooX.txt");
    std::ofstream outfileY("D:\\cuckoo\\cuckooY.txt");
    std::ofstream outfileZ("D:\\cuckoo\\cuckooZ.txt");
    //现在的鸟巢群
    std::vector<Nest> current_nestPop;
    //迭代次数
    int num = 0;
    //最优鸟巢
    int BestNestCurrent;    
    //初始化
    for (int i = 0; i < NestNum; ++i)
    {
        Nest nestinitial;
        nestinitial.x = (X_max - X_min) * u(e) + X_min;
        nestinitial.y = (Y_max - Y_min) * u(e) + Y_min;
        fitFunc(nestinitial);
        current_nestPop.push_back(nestinitial);
    }
    //for (auto i : nestPop)
    //{
    //    std::cout << i.fitness << std::endl;
    //}
    //寻找最优个体
    BestNestCurrent = findBetterNest(current_nestPop);
    outfileX << current_nestPop[BestNestCurrent].x << std::endl;
    outfileY << current_nestPop[BestNestCurrent].y << std::endl;
    outfileZ << current_nestPop[BestNestCurrent].fitness << std::endl;
    while (num < MaxIterationTimes)
    {
        //储存上次的最优解的X,Y
        Xold = current_nestPop[BestNestCurrent].x;
        Yold = current_nestPop[BestNestCurrent].y;
        //levy飞行--位置更新
        std::vector<Nest> NewNestPop = levy(current_nestPop, BestNestCurrent);
        //用适应值较好的鸟窝位置替换适应值较差的鸟窝位置
        for (decltype(NewNestPop.size()) i = 0; i < NewNestPop.size(); ++i)
        {
            if (i != BestNestCurrent && NewNestPop[i].fitness < current_nestPop[i].fitness)
            {
                current_nestPop[i] = NewNestPop[i];
            }
        }//此时得到更优的鸟窝位置
        //存安去险 保留鸟窝中被发现概率较小的鸟窝位置,并随机改变发现概率较大的鸟窝位置
        NewNestPop = RandomAbandonPaNestPop(current_nestPop);
        for (decltype(NewNestPop.size()) i = 0; i < NewNestPop.size(); ++i)
        {
            if (i != BestNestCurrent && NewNestPop[i].fitness < current_nestPop[i].fitness)
            {
                current_nestPop[i] = NewNestPop[i];
            }
        }//此时得到更优的鸟窝位置

        BestNestCurrent = findBetterNest(current_nestPop);//现在的最优鸟巢位置
        Xnew = current_nestPop[BestNestCurrent].x;
        Ynew = current_nestPop[BestNestCurrent].y;

        if (Xnew != Xold || Ynew != Yold)
        {
            outfileX << current_nestPop[BestNestCurrent].x << std::endl;
            outfileY << current_nestPop[BestNestCurrent].y << std::endl;
            
        }

        outfileZ << current_nestPop[BestNestCurrent].fitness << std::endl;
        /*std::cout << current_nestPop[BestNestCurrent].fitness << std::endl;
        std::cout << "(x,y)" << '(' << current_nestPop[BestNestCurrent].x << ',' << current_nestPop[BestNestCurrent].y << ')' << std::endl;*/
        //outfileX << current_nestPop[BestNestCurrent].x << std::endl;
        //outfileY << current_nestPop[BestNestCurrent].y << std::endl;
        //outfileZ << current_nestPop[BestNestCurrent].fitness << std::endl;

        num++;
    }

    std::cout << current_nestPop[BestNestCurrent].fitness << std::endl;
    return 0;
}

void fitFunc(Nest& nest)
{
    
    nest.fitness = -sin(nest.x) * pow(sin(nest.x * nest.x / pi), 20) - sin(nest.y) * pow(sin(2 * nest.y * nest.y / pi), 20);
    
    //nest.fitness = -(nest.x - 1) * (nest.x - 1) + 1;
}

int findBetterNest(std::vector<Nest>& nestPop)
{
    int BestNum = 0;
    for (decltype(nestPop.size()) i = 0; i < nestPop.size(); ++i)
    {
        if (nestPop[i].fitness < nestPop[BestNum].fitness)
        {
            BestNum = i;
        }
    }

    return BestNum;
}

std::vector<Nest> levy(std::vector<Nest> OldNestPop,std::size_t bestNum)
{
    double beta = 1.5;
    //    double alpha = 0.01 * R(e);//有的论文写
    double alpha = 0.4;
    double sigma_u = pow((tgamma(1 + beta) * sin(pi * beta / 2)) / (beta * tgamma((1 + beta) / 2) * pow(2, (beta - 1) / 2)), 1 / beta);
    double sigma_v = 1;

    static std::normal_distribution<double> R(0, sigma_u);
    static std::normal_distribution<double> R1(0, sigma_v);

    for (auto& i : OldNestPop) 
    {
        //前面的系数是保证最优鸟巢不会进行levy飞行
        double stepX = (i.x - OldNestPop[bestNum].x) * R(e) / (pow(abs(R1(e)), 1 / beta));
        double stepY = (i.x - OldNestPop[bestNum].x) * R(e) / (pow(abs(R1(e)), 1 / beta));
        //按范围更新X
        if (i.x + alpha * stepX > X_max)
        {
            i.x = X_max;
        }
        else if(i.x + alpha * stepX < X_min)
        {
            i.x = X_min;
        }
        else
        {
            i.x = i.x + alpha * stepX;
        }
        //按范围更新Y
        if (i.y + alpha * stepY > Y_max)
        {
            i.y = Y_max;
        }
        else if (i.y + alpha * stepY < Y_min)
        {
            i.y = Y_min;
        }
        else
        {
            i.y = i.y + alpha * stepY;
        }

        fitFunc(i);
    }

    return OldNestPop;
}

std::vector<Nest> RandomAbandonPaNestPop(std::vector<Nest> OldNestPop)
{
    double step_sizeX = 0;
    double step_sizeY = 0;
    static std::uniform_int_distribution<int> randomInt(0, OldNestPop.size() - 1);
    for(decltype(OldNestPop.size()) i = 0;i < OldNestPop.size();++i)
    {
        if (u(e) < Pa)//被宿主发现了,要重新寻找新巢
        {
            step_sizeX = u(e) * (OldNestPop[randomInt(e)].x - OldNestPop[randomInt(e)].x);
            step_sizeY = u(e) * (OldNestPop[randomInt(e)].y - OldNestPop[randomInt(e)].y);

            if (OldNestPop[i].x + step_sizeX > X_max)
            {
                OldNestPop[i].x = X_max;
            }
            else if(OldNestPop[i].x + step_sizeX < X_min)
            {
                OldNestPop[i].x = X_min;
            }
            else
            {
                OldNestPop[i].x += step_sizeX;
            }
            
            if (OldNestPop[i].y + step_sizeY > Y_max)
            {
                OldNestPop[i].y = Y_max;
            }
            else if (OldNestPop[i].y + step_sizeY < Y_min)
            {
                OldNestPop[i].y = Y_min;
            }
            else
            {
                OldNestPop[i].y += step_sizeY;
            }


            fitFunc(OldNestPop[i]);
        }
    }

    return OldNestPop;
}

 

相关文章:

布谷鸟优化算法C++

#include <iostream> #include <vector> #include <cmath> #include <random> #include <time.h> #include <fstream> #define pi acos(-1) //5只布谷鸟 constexpr int NestNum 40; //pi值 //规定X,Y 的取值范围 constexpr double X_…...

三体到底是啥?用Python跑一遍就明白了

文章目录拉格朗日方程推导方程组微分方程算法化求解画图动图绘制温馨提示&#xff0c;只想看图的画直接跳到最后一节拉格朗日方程 此前所做的一切三体和太阳系的动画&#xff0c;都是基于牛顿力学的&#xff0c;而且直接对微分进行差分化&#xff0c;从而精度非常感人&#xf…...

Golang-Hello world

目录 安装 Go(如果尚未安装) 编写Hello world 使用Golang的外部包 自动下载需要的外部包...

this指针C++

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章 &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下定决心去做” &#x1…...

SpringBoot+WebSocket实时监控异常

# 写在前面此异常非彼异常&#xff0c;标题所说的异常是业务上的异常。最近做了一个需求&#xff0c;消防的设备巡检&#xff0c;如果巡检发现异常&#xff0c;通过手机端提交&#xff0c;后台的实时监控页面实时获取到该设备的信息及位置&#xff0c;然后安排员工去处理。因为…...

Baumer工业相机堡盟相机如何使用自动曝光功能(自动曝光优点和行业应用)(C++)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…...

HTML、CSS学习笔记7(移动适配:rem、less)

一、移动适配 rem&#xff1a;目前多数企业在用的解决方案vw / vh&#xff1a;未来的解决方案 1.rem&#xff08;单位&#xff09; 1.1使用rem单位设置尺寸 px单位或百分比布局可以实现吗&#xff1f; ————不可以 网页的根字号——HTML标签 1.2.rem移动适配 写法&#x…...

STM32感应开关盖垃圾桶

目录 项目需求 项目框图 ​编辑 硬件清单 sg90舵机介绍及实战 sg90舵机介绍 角度控制 SG90舵机编程实现 超声波传感器介绍及实战 超声波传感器介绍 超声波编程实战 项目设计及实现 项目需求 检测靠近时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c;2秒后关盖…...

进程跟线程的区别

进程跟线程的区别 文章目录进程跟线程的区别前言一.什么线程二.线程与进程的联系三.线程与进程有什么不同前言 现代所有计算机都能同时做几件事情,当一个用户程序正在运行时,计算机还能同时读取磁盘,并向屏幕打印输出正文.在一个多道操作程序中,cpu由一道程序向另外一道程的切…...

[ICLR 2016] Unsupervised representation learning with DCGANs

目录 IntroductionModel ArchitectureReferencesIntroduction 作者提出了用 CNN 搭建 GAN,使得 GAN 训练更加稳定的一系列准则,并将满足这些设计理念的模型称为 DCGANs (Deep Convolutional GANs). 此外,作者将 trained discriminators 用于图像分类任务,相比于其他无监督算…...

QT编程从入门到精通之十五:“第五章:Qt GUI应用程序设计”之“5.1 UI文件设计与运行机制”之“5.1.2 项目管理文件”

目录 第五章:Qt GUI应用程序设计 5.1 UI文件设计与运行机制 5.1.2 项目管理文件 第五章:Qt GUI应用程序设计 在“Qt 程序创建基础”上,本章将继续深入地介绍Qt Creator设计GUI应用程序的方法...

基于Three.js和MindAR实现的网页端WebAR人脸识别追踪功能的京剧换脸Demo(含源码)

前言 近段时间一直在玩MindAR的功能&#xff0c;之前一直在弄图片识别追踪的功能&#xff0c;发现其强大的功能还有脸部识别和追踪的功能&#xff0c;就基于其面部网格的例子修改了一个国粹京剧的换脸程序。如果你不了解MindAR的环境配置可以先参考这篇文章&#xff1a;基于Mi…...

动态规划思路

拉勾教育版权所有&#xff1a;https://kaiwu.lagou.com/course/courseInfo.htm?courseId3 动态规划思路 1.最优子结构 2.重复计算子机构 3.依靠递归&#xff0c;层层向上传值&#xff0c;所以编程时初始化子结构很重要 动态规划步骤 1.判断动态规划的类型 1.线性规划 >&…...

HTTPS关键词语解释和简单通讯流程

1、 什么是HTTPS HTTPS是基于HTTP的上层添加了一个叫做TLS的安全层&#xff0c;对数据的加密等操作都是在这个安全层中进行处理的&#xff0c;其底层还是应用的HTTP。 2、 什么是对称加密&#xff1b; 加密和解密都是用同一个秘钥 3、 什么是非对称加密&#xff1b; 加密和…...

“前端开发中的三种定时任务及其应用“

前端定时任务是指在一定时间间隔内&#xff0c;自动执行指定的操作或函数。在前端开发中&#xff0c;定时任务被广泛应用于诸如数据更新、定时提醒、定时刷新页面等方面。在本文中&#xff0c;我们将介绍前端中常见的三种定时任务&#xff0c;分别是 setTimeout、setInterval 和…...

华为OD机试题 - 猜字谜(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:猜字谜题目输入输出描述备注示例一输入输出示例二输入输出思路C…...

python@pyside样式化

文章目录refWidget类创建样式化文件qss引用样式并启动应用ref Styling the Widgets Application - Qt for PythonQt Style Sheets Reference | Qt Widgets 5.15.12 Widget类创建 创建一个简单界面(菜单主要内容)它们是水平布局 主要内容包括一段文本和一个按钮,它们是垂直布…...

C++经典15道面试题目(文末含大题)

今天给大家找了几个C面试里很有可能被问的哦&#xff0c;赶紧收藏下来去背&#xff01;&#xff01;&#xff01; 目录 1&#xff09;C中有malloc/free&#xff0c;为什么还需要new/delete? 2&#xff09;C中explicit关键字的作用? 3&#xff09;C中static关键字的作用&a…...

自动计算30天内的股价最高价源代码

我可以回答这个问题。您可以使用以下代码来计算30天内股价的最高价&#xff1a; 复制 import pandas as pd import yfinance as yf # 设置股票代码和日期范围 symbol "AAPL" start_date "2021-01-01" end_date "2021-06-30" # 获取股票…...

国外SEO升级攻略!一看就懂!

SEO是搜索引擎优化的缩写&#xff0c;它是指通过优化网站内容和结构&#xff0c;提升网站在搜索引擎中的排名&#xff0c;从而获得更多的有价值的流量。 而关键词研究和选择是SEO优化中最基础也是最关键的环节&#xff0c;它决定了网站将面向哪些用户、哪些关键词和词组将被优…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...