鲸鱼优化算法(Whale Optimization Algorithm, WOA)原理与MATLAB例程
鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种基于鲸鱼捕食行为的智能优化算法。它模拟了座头鲸在狩猎时的“气泡网”捕食策略。
文章目录
- 1.适应度函数
- 2. 更新公式
- 2.1 突袭行为
- 2.2 螺旋更新
- 3.线性递减参数
- 4. 边界处理
- MATLAB 实现示例
- 代码说明
- 注意事项
1.适应度函数
在优化问题中,适应度函数通常是我们希望最优化的目标函数。例如,Rosenbrock函数的公
式为:
f ( x ) = ∑ i = 1 n − 1 [ 100 ⋅ ( x i + 1 − x i 2 ) 2 + ( 1 − x i ) 2 ] f(x)=\sum\limits_{i=1}^{n-1}\begin{bmatrix}100\cdot(x_{i+1}-x_i^2)^2+(1-x_i)^2\end{bmatrix} f(x)=i=1∑n−1[100⋅(xi+1−xi2)2+(1−xi)2]
2. 更新公式
2.1 突袭行为
在突袭行为中,鲸鱼的位置更新公式为:
D = ∣ C ⋅ X ∗ − X i ∣ D=|C\cdot X^*-X_i| D=∣C⋅X∗−Xi∣
X i = X ∗ − A ⋅ D X_i=X^*-A\cdot D Xi=X∗−A⋅D
其中:
∙ \bullet ∙ X ∗ X^* X∗是当前最佳位置。
· A A A是一个控制参数,定义为:
A = 2 a ⋅ r − a A=2a\cdot r-a A=2a⋅r−a
∙ C \bullet C ∙C是随机数,定义为:
C = 2 ⋅ r a n d ( ) C=2\cdot rand() C=2⋅rand()
· D D D是当前鲸鱼与最佳位置之间的距离。
2.2 螺旋更新
在螺旋更新中,鲸鱼的位置更新公式为:
X i = D ⋅ e ( i ⋅ 2 π ) + X ∗ X_i=D\cdot e^{(i\cdot2\pi)}+X^* Xi=D⋅e(i⋅2π)+X∗
其中:
· D D D是与最佳位置的距离,计算为:
D = ∣ X ∗ − X i ∣ D=\begin{vmatrix}X^*-X_i\end{vmatrix} D= X∗−Xi
3.线性递减参数
在算法迭代过程中,参数 a a a逐渐减小,以影响鲸鱼的探索行为:
a = 2 − ( 2 m a x i t e r ⋅ i t e r ) a=2-\left(\frac{2}{max_iter}\cdot iter\right) a=2−(maxiter2⋅iter)
4. 边界处理
在更新位置后,确保鲸鱼的位置在设定的边界内:
X i = max ( min ( X i , u b ) , l b ) X_i=\max(\min(X_i,ub),lb) Xi=max(min(Xi,ub),lb)
下面是一个简单的MATLAB实现示例,展示如何使用鲸鱼优化算法进行函数优化。我们将以最小化一个简单的目标函数(例如, R o s e n b r o c k Rosenbrock Rosenbrock函数)为例。
MATLAB 实现示例
% Whale Optimization Algorithm (WOA) for Function Optimization% 设置参数
max_iter = 100; % 最大迭代次数
num_whales = 30; % 鲸鱼数量
dim = 2; % 问题维度
lb = -5; % 下界
ub = 5; % 上界% 初始化鲸鱼位置
whales = lb + (ub - lb) * rand(num_whales, dim);% 初始化最佳解
best_score = inf;
best_position = zeros(1, dim);% 目标函数:Rosenbrock函数
target_function = @(x) sum(100*(x(:,2) - x(:,1).^2).^2 + (1 - x(:,1)).^2);% 主循环
for iter = 1:max_iterfor i = 1:num_whales% 计算当前鲸鱼的位置的目标函数值fitness = target_function(whales(i, :));% 更新最佳解if fitness < best_scorebest_score = fitness;best_position = whales(i, :);endend% 更新鲸鱼位置a = 2 - iter * (2 / max_iter); % 线性递减参数for i = 1:num_whales% 选择随机鲸鱼r = rand();A = 2 * a * rand() - a; % 计算A值C = 2 * rand(); % 计算C值if rand() < 0.5% 突袭行为if abs(A) < 1% 更新位置D = abs(C * best_position - whales(i, :));whales(i, :) = best_position - A .* D;else% 随机位置random_whale = whales(randi(num_whales), :);D = abs(C * random_whale - whales(i, :));whales(i, :) = random_whale - A .* D;endelse% 螺旋更新distance_to_best = abs(best_position - whales(i, :));whales(i, :) = distance_to_best * exp(1i * 2 * pi * rand()) + best_position;end% 限制位置在边界内whales(i, :) = max(min(whales(i, :), ub), lb);end% 显示当前迭代的最佳结果disp(['Iteration ' num2str(iter) ': Best Score = ' num2str(best_score)]);
end% 显示最终结果
disp(['Global Best Position: ' num2str(best_position)]);
disp(['Global Best Score: ' num2str(best_score)]);
代码说明
-
参数设置:
max_iter
:最大迭代次数。num_whales
:鲸鱼的数量。dim
:问题的维度(此例中为2维)。lb
和ub
:搜索空间的上下界。
-
初始化:
- 随机生成鲸鱼的位置。
-
目标函数:
- 使用Rosenbrock函数作为优化目标。
-
主循环:
- 计算每只鲸鱼的适应度,并更新最佳解。
- 根据鲸鱼的行为(突袭行为和螺旋更新)更新鲸鱼的位置。
- 确保鲸鱼的位置在设定的边界内。
-
结果输出:
- 每次迭代输出当前最佳适应度,并在最后输出全局最佳位置和适应度。
注意事项
- 可以根据需要调整参数以实现不同的优化效果。
- 目标函数可以替换为其他需要优化的函数。
- 增加绘图功能可以更直观地展示优化过程。
相关文章:
鲸鱼优化算法(Whale Optimization Algorithm, WOA)原理与MATLAB例程
鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种基于鲸鱼捕食行为的智能优化算法。它模拟了座头鲸在狩猎时的“气泡网”捕食策略。 文章目录 1.适应度函数2. 更新公式2.1 突袭行为2.2 螺旋更新3.线性递减参数4. 边界处理 MATLAB 实现示例代码说明…...
MFC七段码显示实例
在MFC中添加iSenvenSegmentAnalogX控件,添加编辑框和按钮实现在编辑框中输入数字点击按钮后数字用七段码显示 1、在对话框中点击右键如下图添加控件和变量 2、在sevenDlg.h中添加代码 public: void ShowInd(int,double);3、在sevenDlg.cpp中添加代码 void CSe…...
【日常知识点】到底推不推荐用JWT?
👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区:个人社区 💞 个人主页:个人主页 🙉 专栏地址: ✅ Java 中级 🙉八股文专题:剑指大厂,手撕 J…...
网络编程项目之FTP服务器
项目介绍 模拟FTP核心原理:客户端连接服务器后,向服务器发送一个文件。文件名可以通过参数指定,服务器端接收客户端传来的文件(文件名随意),如果文件不存在自动创建文件,如果文件存在࿰…...
SpringBoot02:第一个springboot程序
3、第一个springboot程序 3.1、准备工作 我们将学习如何快速的创建一个Spring Boot应用,并且实现一个简单的Http请求处理。通过这个例子对Spring Boot有一个初步的了解,并体验其结构简单、开发快速的特性。 我的环境准备: java version "…...
快速入门HTML
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗 如有错误,欢迎指出~ 目录 第一个html文件 标签 h1~h6 p >段落标签 br > 换行标签 img >图片标签 a >超链接标签 表格标签 表单标签 表单控件 form表单 ⽆语义标签:div&span 综…...
RabbitMQ是一个开源的消息代理和队列服务器
RabbitMQ是一个开源的消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol,高级消息队列协议)协议实现,同时也支持其他消息协议如STOMP、MQTT等。作为一个可靠的消息传递服务,RabbitMQ在分…...
经典算法思想--并查集
前言 (最近在学习Java,所有函数都是用Java语言来书写的)前言部分是一些前提储备知识 在并查集(Union-Find)数据结构中,rank(中文称为“秩”)是用来表示树的高度或深度的一种辅助信息…...
挑战Java面试题复习第2天,百折不挠
挑战第 2 天 ArrayList和linkedList的区别HashMap和HashTable的区别Collection 与 Collections 的区别Java的四种引用泛型常用特点 ArrayList和linkedList的区别 底层数据结构: ArrayList:基于动态数组实现,支持快速随机访问。LinkedList&a…...
【vue之道】
vue之道 1. 一生二,二生万物思想2. 变化之律3. 变化之实在哪?4.而后学于形乃已!4.1 展示之形变4.2 动之气谓之指令4.3 血之养分的载体,于vue之绑定载具4.4 vue之道(万法规一篇) 1. 一生二,二生万…...
基于麻雀优化算法SSA的CEEMDAN-BiLSTM-Attention的预测模型
往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享! EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(一)EMD-CSDN博客 EMD、EEM…...
Linux:指令再认识
文章目录 前言一、知识点1. Linux下一切皆文件,也就是说显示器也是一种文件2. 指令是什么?3. ll 与 ls -l4. 日志5. 管道6. 时间戳 二、基本指令1. man指令2. cp指令3. mv指令4. 查看文件1)cat/tac指令——看小文件2)more/less指令…...
PHP如何抛出和接收错误
在PHP中,抛出和接收错误通常涉及异常处理机制,以及错误和异常的处理函数。以下是如何在PHP中抛出和接收错误的详细指南: 抛出错误(异常) 在PHP中,你可以使用throw关键字来抛出一个异常。这通常在你检测到…...
计算机网络:网络层 —— IPv4 地址的应用规划
文章目录 IPv4地址的应用规划定长的子网掩码变长的子网掩码 IPv4地址的应用规划 IPv4地址的应用规划是指将给定的 IPv4地址块 (或分类网络)划分成若干个更小的地址块(或子网),并将这些地址块(或子网)分配给互联网中的不同网络,进而可以给各网络中的主机…...
Mongodb命令大全
Mongodb命令大全 一、数据库相关命令二、集合相关命令三、文档(数据)相关命令1、_id 字段说明2、查询2.1、 查询操作符2.2、内嵌文档查询2.3、数组文档查询2.4、去重查询2.5、查询排序 sort2.6、分页查询2.7、指定列投影查询返回2.8、查询统计个数 count 3、聚合查询3.1、查询用…...
宇视设备视频平台EasyCVR视频融合平台果园/鱼塘/养殖场/菜园有电没网视频监控方案
在那些有电无网的偏远地区,如果园、鱼塘、养殖场或菜园,视频监控的实现面临着独特的挑战。宇视设备视频平台EasyCVR提供了一种创新的解决方案,通过结合太阳能供电和4G摄像头技术,有效地解决了这些场景下的监控需求。 在有电没网的…...
面试题:ABCD四个线程,A线程最后执行
我觉得是一个很高频的面试题,ABCD四个线程,A线程要等到BCD线程执行完再执行,怎么做 因为我刚复习完AQS,所以立马想到了CountDownLatch,但是看面试官反应他最想听到的应该是join方法,所以面试后就总结了几种…...
代码随想录算法训练营第46期Day43
leetcode.322零钱兑换 class Solution { public: //无限个硬币->完全背包int coinChange(vector<int>& coins, int amount) {vector<int> dp(10010,INT_MAX);//dp代表的在某个数值下最小的硬币数,要求是最小的硬币数,所以初始值要尽可…...
前端处理API接口故障:多接口自动切换的实现方案
因为在开发APP,一个接口如果不通(被挂了)又不能改了重新打包让用户再下载软件更新,所以避免这种情况,跟后端讨论多备用接口地址自动切换的方案,自动切换到备用的接口地址,并保证后续所有的请求都…...
多租户架构的全景分析(是什么?基本概念、实现策略、资源管理和隔离、数据安全与隔离、性能优化、扩展性与升级、案例研究)
文章目录 1. 多租户的基本概念2. 多租户的实现策略2.1 独立数据库模式2.2 共享数据库-独立Schema模式2.3 共享数据库-共享Schema模式 3. 资源管理和隔离4. 数据安全与隔离5. 性能优化6. 扩展性与升级7. 案例研究总结 多租户架构在云计算和SaaS应用中越来越流行,因为…...
Git使用问题汇总附带解决方法(持续更新)
Git使用问题汇总附带解决方法 一 git pull 代码时报错: Auto packing the repository in background for optimum performance. See “git help gc“ 一 git pull 代码时报错: Auto packing the repository in background for optimum performance. See …...
Spring Boot驱动的植物健康监测革命
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理植物健康系统的相关信息成为必然。开发合适…...
element 中 el-dialog 在不同的文件中使用
在实际中工作,我们经常需要使用 el-dialog 来做一个弹框的功能。最常见的就是在父组件中点击一个按纽,然后弹出一个框。而这个框就是子组件。同时,父子组件是分布在不同的文件中。 <!--父组件--> <template> <div> <…...
QT中采用QCustomPlot 实现将buffer中的数据绘制成折线图,并且图形随着数据更新而更新
QT中采用QCustomPlot 实现将buffer中的数据绘制成折线图,并且图形随着数据更新而更新 为了在 Qt 中将缓冲区的数据动态绘制成折线图,并随着数据的更新而实时更新,可以使用 QCustomPlot 或 Qt 自带的绘图功能,比如 QGraphicsView,或者在更简单的情况下使用 QPainter 在 QW…...
1688API商品详情接口如何获取
获取 1688API商品详情接口主要有以下步骤: 一、注册开发者账号: 访问 1688 开放平台,进行开发者账号注册。这是获取 API 接口使用权限的第一步,注册信息要确保真实准确。 二、了解接口规范和政策: 在 1688 开放平台…...
pytorch + d2l环境配置
文章目录 前言一、安装软件二、配置具体环境 前言 一直想写一篇 pytorch d2l的深度学习环境配置。但一直都不是很顺利,配置过很多次,都会遇到一些各种依赖项的兼容性问题。但这个是没有办法的,各种开源包都在不断维护过程中,版本…...
Go使用exec.Command() 执行脚本时出现:file or directory not found
使用 Go 提供的 exec.Command() 执行脚本时出现了未找到脚本的 bug,三个排查思路 : exec.Command(execName, args…) 脚本名字不允许相对路径 exec.Command(execName, args…) execName 只能有脚本名,不允许出现参数 如果你是使用 Windows …...
细节性知识(宏定义解析与宏的外部引用)
目录 一、问:#define N 50 中的N可以用来做运算比较吗? 二、宏定义怎么外部引用? 例子 总结 一、问:#define N 50 中的N可以用来做运算比较吗? 解析:在C语言中,#define N 50 是一个预处理指…...
面试中的JVM:结合经典书籍的深度解读
写在前面 🔥我把后端Java面试题做了一个汇总,有兴趣大家可以看看!这里👉 ⭐️在无数次的复习巩固中,我逐渐意识到一个问题:面对同样的面试题目,不同的资料来源往往给出了五花八门的解释&#…...
使用语音模块的开发智能家居产品(使用雷龙LSYT201B 语音模块)
在这篇博客中,我们将探讨如何使用 LSYT201B 语音模块 进行智能设备的语音交互开发。通过这个模块,我们可以实现智能设备的语音识别和控制功能,为用户带来更为便捷和现代的交互体验。 1. 语音模块介绍 LSYT201B 是一个基于“芯片算法”的语音…...
网站是否必须做认证/国外广告联盟平台
摘要:单日总数据处理量超 10 万亿,峰值大概超过每秒 3 亿,OPPO 大数据平台研发负责人张俊揭秘 OPPO 基于 Apache Flink 构建实时数仓的实践,内容分为以下四个方面:建设背景顶层设计落地实践未来展望重要:公…...
网站建设寻求/腾讯新闻发布平台
在C#中,new关键字主要有如下三种用法: new 运算符 用于创建对象和调用构造函数。new 修饰符 用于隐藏基类成员的继承成员。new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。1.new 运算符 1).用于创建对象和调用构造函数 示例:Cl…...
用文本文件做网站/媒体135网站
\Users\你的用户\.android\adb_usb.ini .android目录是隐藏的,需要开启隐藏目录显示。 打开文件后我的机器默认的是0x1949,估计应该都是这个。 在下面追加 kindlefire的: 0x0006 小米2的 : 0x2717 文件是这样的最后 -…...
市场营销一般在哪上班/安卓优化大师官方版
命令简介:该命令用来列出目前与过去登录系统的用户相关信息。指令所在路径:/usr/bin/last 执行last指令时,它会读取位于/var/log目录下名称为wtmp的文件,并把该给文件的内容记录的登录系统的用户名单全部显示出来。默认是显示wtmp…...
大连做网站的网络公司/seo哪个软件好
一、安装Java SE JKD A、下载 http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteIdocomen 选择最新版本,当前最新版本 1.8.0 。下载 jdk-8u45-linux-x64.tar.gz 。 B、解压下载包,添加环境变量。 $ sudo vim ~/.bash…...
如何做网站跳转页面/长春网站建设模板
Echarts是一款声明式的可视化图表库,相比于其他图表库,其主要的优势在于易用性、内置丰富的交互以及高性能。本文在Echarts5发布之际,笔者重新学习echarts,主要结合18年Echarts的一篇文章,来对Echarts有一个更深入的了…...