布谷鸟优化算法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跑一遍就明白了
文章目录拉格朗日方程推导方程组微分方程算法化求解画图动图绘制温馨提示,只想看图的画直接跳到最后一节拉格朗日方程 此前所做的一切三体和太阳系的动画,都是基于牛顿力学的,而且直接对微分进行差分化,从而精度非常感人…...
Golang-Hello world
目录 安装 Go(如果尚未安装) 编写Hello world 使用Golang的外部包 自动下载需要的外部包...
this指针C++
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章 🔥座右铭:“不要等到什么都没有了,才下定决心去做” …...
SpringBoot+WebSocket实时监控异常
# 写在前面此异常非彼异常,标题所说的异常是业务上的异常。最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安排员工去处理。因为…...
Baumer工业相机堡盟相机如何使用自动曝光功能(自动曝光优点和行业应用)(C++)
项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具…...
HTML、CSS学习笔记7(移动适配:rem、less)
一、移动适配 rem:目前多数企业在用的解决方案vw / vh:未来的解决方案 1.rem(单位) 1.1使用rem单位设置尺寸 px单位或百分比布局可以实现吗? ————不可以 网页的根字号——HTML标签 1.2.rem移动适配 写法&#x…...
STM32感应开关盖垃圾桶
目录 项目需求 项目框图 编辑 硬件清单 sg90舵机介绍及实战 sg90舵机介绍 角度控制 SG90舵机编程实现 超声波传感器介绍及实战 超声波传感器介绍 超声波编程实战 项目设计及实现 项目需求 检测靠近时,垃圾桶自动开盖并伴随滴一声,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的功能,之前一直在弄图片识别追踪的功能,发现其强大的功能还有脸部识别和追踪的功能,就基于其面部网格的例子修改了一个国粹京剧的换脸程序。如果你不了解MindAR的环境配置可以先参考这篇文章:基于Mi…...
动态规划思路
拉勾教育版权所有:https://kaiwu.lagou.com/course/courseInfo.htm?courseId3 动态规划思路 1.最优子结构 2.重复计算子机构 3.依靠递归,层层向上传值,所以编程时初始化子结构很重要 动态规划步骤 1.判断动态规划的类型 1.线性规划 >&…...
HTTPS关键词语解释和简单通讯流程
1、 什么是HTTPS HTTPS是基于HTTP的上层添加了一个叫做TLS的安全层,对数据的加密等操作都是在这个安全层中进行处理的,其底层还是应用的HTTP。 2、 什么是对称加密; 加密和解密都是用同一个秘钥 3、 什么是非对称加密; 加密和…...
“前端开发中的三种定时任务及其应用“
前端定时任务是指在一定时间间隔内,自动执行指定的操作或函数。在前端开发中,定时任务被广泛应用于诸如数据更新、定时提醒、定时刷新页面等方面。在本文中,我们将介绍前端中常见的三种定时任务,分别是 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面试里很有可能被问的哦,赶紧收藏下来去背!!! 目录 1)C中有malloc/free,为什么还需要new/delete? 2)C中explicit关键字的作用? 3)C中static关键字的作用&a…...
自动计算30天内的股价最高价源代码
我可以回答这个问题。您可以使用以下代码来计算30天内股价的最高价: 复制 import pandas as pd import yfinance as yf # 设置股票代码和日期范围 symbol "AAPL" start_date "2021-01-01" end_date "2021-06-30" # 获取股票…...
国外SEO升级攻略!一看就懂!
SEO是搜索引擎优化的缩写,它是指通过优化网站内容和结构,提升网站在搜索引擎中的排名,从而获得更多的有价值的流量。 而关键词研究和选择是SEO优化中最基础也是最关键的环节,它决定了网站将面向哪些用户、哪些关键词和词组将被优…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
Springboot 高校报修与互助平台小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,高校报修与互助平台小程序被用户普遍使用,为…...
开源 vGPU 方案:HAMi,实现细粒度 GPU 切分
本文主要分享一个开源的 GPU 虚拟化方案:HAMi,包括如何安装、配置以及使用。 相比于上一篇分享的 TimeSlicing 方案,HAMi 除了 GPU 共享之外还可以实现 GPU core、memory 得限制,保证共享同一 GPU 的各个 Pod 都能拿到足够的资源。…...
