鲸鱼优化算法(Whale Optimization Algorithm)
注意:本文引用自专业人工智能社区Venus AI
更多AI知识请参考原站 ([www.aideeplearning.cn])
算法背景
鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种模拟鲸鱼捕食行为的优化算法。想象一下,你在大海上划船,突然一只庞大的鲸鱼跃出水面。鲸鱼猎食主要依靠两种策略:一是环绕并逐渐靠近猎物,二是制造强大的水柱把猎物推向水面。WOA正是基于这两种策略设计的。具体来说:
- 搜索猎物:在这个阶段,鲸鱼优化算法模拟鲸鱼在海洋中自由游动的行为,探索广阔的搜索空间以找到潜在的最优解。这一阶段的关键是随机性,算法中的解(鲸鱼)以随机的方式在搜索空间内移动,以确保没有遗漏任何可能的区域。这种方法类似于鲸鱼在海洋中随机游动以搜索食物源。每个解的位置更新都是不可预测的,但目的是探索尽可能多的区域,以提高找到高质量解的机会。
- 环绕猎物:当算法检测到一个有希望的解时,它进入了环绕猎物阶段。在这个阶段,其他解(鲸鱼)开始聚焦于这个潜在的最佳解,执行更有目的性的搜索。这类似于鲸鱼发现了一群鱼并开始围绕着它们游动,准备捕食。解的位置更新在这一阶段变得更加精确和集中,他们会根据当前最佳解的位置来调整自己的方向和位置。这一阶段的目的是缩小搜索范围,并集中精力在最有希望的区域内寻找最优解。
- 气泡网攻击法:当解足够接近潜在的最优解时,鲸鱼优化算法模拟鲸鱼使用气泡网捕食的策略。这是一个高度精确的阶段,解在这里采取一种结合随机性和确定性的移动策略。模拟座头鲸制造气泡网的行为,解会创建一个虚拟的“气泡网”,逐渐缩小搜索范围并集中在最有希望的区域内。这个过程旨在细化和完善解,通过减少随机性和增加确定性的移动来接近最终的最优解。气泡网攻击法是一个高效的捕捉机制,确保算法能够精确地捕获最优解。
算法应用
- 工程优化
- 结构设计:在建筑工程中,WOA可以用于寻找最优的结构设计,以提高建筑物的稳定性和耐用性。
- 电力系统:在电力系统中,WOA被用来优化电网的负荷分配,减少能源损耗,提高能源使用效率。
- 机器学习
- 特征选择:WOA可以用于选择最有影响力的特征,提高机器学习模型的准确性和效率。
- 神经网络训练:WOA被用于优化神经网络的权重和结构,以提高训练效率和模型性能。
- 优化问题
- 旅行商问题(TSP):WOA可以用于解决TSP,即寻找最短的路径访问一系列位置并返回起点。
- 多目标优化:WOA在处理具有多个优化目标的问题时表现出色,能够找到满足所有目标的最优解。
- 图像处理
- 图像分割:WOA可用于图像分割,以识别和分离图像中的不同区域或对象。
- 图像增强:通过调整图像的特定参数,WOA可以用于改善图像的质量,如对比度和亮度调整。
- 调度问题
- 任务调度:在生产和服务行业,WOA可以用于优化资源分配和任务调度,提高效率和减少成本。
- 其他领域
- 包括生物信息学、化学、水资源管理等领域也在探索使用WOA来解决特定的优化问题。
鲸鱼优化算法之所以受欢迎,是因为它简单、灵活且易于实现,同时能够有效处理各种复杂的优化问题。然而,它也有局限性,比如在某些情况下可能会陷入局部最优解,或者在处理高维问题时效率较低。因此,研究者和工程师通常会根据具体问题调整和改进算法,以获得更好的性能。
算法计算流程
鲸鱼算法(Whale Optimization Algorithm,简称WOA)是一种模拟座头鲸捕食行为的启发式优化算法。下面我将详细介绍这个算法:
这个算法的关键在于两个公式:
第一个公式 :
想象一下: X∗(t) 是目前为止找到的最好的食物源(最优解),而 X(t) 是一只鲸鱼当前的位置。这个公式其实就是在计算鲸鱼和它的目标(最好的食物源)之间的距离。
为什么要乘以 C:C 是一个随机因子,它的作用是让鲸鱼在接近目标时不是直线移动,而是有点随机地绕着目标转,这模仿了鲸鱼在海中寻找食物时的不确定和灵活的行为。
第二个公式:
– 这个公式描述了什么:它告诉我们鲸鱼下一个时刻的位置。鲸鱼根据当前最好的食物源的位置和它自己与食物源的距离来更新自己的位置。
– 系数 A 的作用: 如果 A 的值大于 1,这意味着鲸鱼可能不直接向当前最好的食物源移动,而是可能选择另一个方向,去探索海洋中的其他区域。这种行为增加了探索新区域的机会,有助于发现更好的食物源。
总的来说,这两个公式一起工作,模拟了鲸鱼在海中寻找并捕捉食物的行为。它们帮助算法在“探索” (寻找新的可能解决方案区域) 和“开发” (在已知的最优解附近寻找更优解) 之间取得平衡。通过这种方式,WOA 试图高效地找到问题的最佳解决方案,就像鲸鱼在大海中高效地寻找食物一样。
1. 系数 A :
其中 a 是从 2 线性减少到0的参数,而 r 是 [0,1] 范围内的随机数。
– 目的: 系数 A 用于控制搜索代理 (鲸鱼) 向选定的目标或远离它移动的范围。它通过控制解的探索和开发 (exploration and exploitation) 平衡来模拟鲸鱼环绕猎物的行为。
– 设计逻辑: 当 |A|>1 时,鲸鱼会在搜索空间进行更广泛的探索,这有助于避免局部最优解。当 |A|<1 时,算法更侧重于细化当前的解,即在当前最优解周围进行密集搜索。随着 a 从 2 逐渐减少到0,算法逐渐从全局搜索(探索)过渡到局部搜索 (利用)。
– 为什么 A 从 2 线性减少到 0 ?
– 探索与利用平衡:WOA 旨在平衡探索 (探寻新区域) 与利用 (深入挖掘已知区域)的行为。当 A 的值较大(绝对值大于 1 )时,算法倾向于探索,因为解可能会跳到当前最佳解的较远位置。当 A 的值较小(绝对值小于 1) 时,算法则倾向于在当前最佳解的附近进行密集搜索,即利用。
– 线性递减:线性递减是一种简单且有效的方法,用于在算法的不同迭代阶段逐渐从探索转向利用。在早期阶段,较大的 A 值有助于广泛探索;随着算法的进行,逐渐减少 A 值有助于集中于最有希望的区域。
2. 系数 C :
其中 r 是 [0,1] 范围内的随机数。
– 目的: 系数 C 用于确定解 (鲸鱼) 环绕猎物的路径和方向。它决定了解如何更新其位置来接近或探索潜在的最优解。
– 设计逻辑: 通过将 C 设置为随机值的两倍,算法在解的位置更新中引入了随机性,从而模拟鲸鱼在捕食时的不确定和随机的动作。这有助于维持探索和利用之间的平衡,并且使算法能够适应不同的搜索环境和条件。
– 为什么通过将 C 设置为随机值的两倍?
– 随机性引入: 在优化算法中,随机性是一种重要的机制,用于避免陷入局部最优并探索解空间的不同区域。通过将 C 设置为随机值的两倍,算法在解的位置更新中引入了足够的随机性,同时保留了对当前最佳解的一定程度的吸引。
– 探索能力:使用 2⋅r 的设置能够让解有更大的机会探索离当前最佳解较远的区域,从而增强算法的全局搜索能力。
为什么不是其他的设置?
– 经验与实验:算法的这些特定设置通常基于经验和广泛的实验。研究者通过测试不同的参数设置和他们对算法性能的影响来确定最有效的设置。
– 平衡与适应性: 这些设置被认为在多种问题类型和复杂性上提供了较好的平衡和适应性。虽然其他设置也可能有效,但当前的设置已被证明在多个应用中表现良好。
算法详细示例
假设我们要最小化一个二维函数,初始群体大小为 30 ,迭代次数设为100。
初始化:
生成 30 个解(鲸鱼位置),每个解包含随机生成的 x 和 y 值。
迭代过程:
假设在某次迭代中,随机生成的a和r值为:
– a=1.5 (例如在迭代过程中的某一点)
– r=0.5
我们选择一个鲸鱼位置,例如 X(t)=(3,4) ,并假设当前最优解为 X∗(t)=(1,2) 。
1. 计算A和C:
– A=2×1.5×0.5−1.5=0
– C=2×0.5=1
2. 更新鲸鱼位置:
– 如果 |A|<1 (在这个例子中是0),鲸鱼靠近猎物。
– 首先计算 。
– 然后更新位置 。
3. 评估新位置:
– 计算新位置的函数值 。
– 这个值小于之前的解,即,因此更新为新的最优解。
这个过程会在每个迭代中重复进行,直到达到设定的迭代次数
代码实现
为了实现鲸鱼优化算法 (WOA) 并对其进行可视化,我们可以用Python编写一个简单的程序。在这个程序中,我们将针对目标函数进行优化。这个函数的全局最小值在点 (0,0) 处,函数值为 0 。
import numpy as np
import matplotlib.pyplot as plt# 目标函数
def objective_function(X):return X[0]**2 + X[1]**2# 鲸鱼优化算法类
class WhaleOptimizationAlgorithm:def __init__(self, objective, bounds, n_whales, n_iterations):self.objective = objectiveself.bounds = boundsself.n_whales = n_whalesself.n_iterations = n_iterationsself.dimension = len(bounds)self.X = np.zeros((self.n_whales, self.dimension))self.X_star = np.zeros(self.dimension)self.fitness_star = float('inf')def initialize(self):for i in range(self.n_whales):for j in range(self.dimension):self.X[i, j] = np.random.uniform(*self.bounds[j])def optimize(self):for t in range(self.n_iterations):a = 2 - t * (2 / self.n_iterations)a2 = -1 + t * (-1 / self.n_iterations)for i in range(self.n_whales):r1 = np.random.rand()r2 = np.random.rand()A = 2 * a * r1 - aC = 2 * r2b = 1l = (a2 - 1) * np.random.rand() + 1p = np.random.rand()for j in range(self.dimension):if p < 0.5:if abs(A) >= 1:rand_leader_index = np.random.randint(0, self.n_whales)X_rand = self.X[rand_leader_index, :]D_X_rand = abs(C * X_rand[j] - self.X[i, j])self.X[i, j] = X_rand[j] - A * D_X_randelse:D_Leader = abs(C * self.X_star[j] - self.X[i, j])self.X[i, j] = self.X_star[j] - A * D_Leaderelse:distance_to_Leader = abs(self.X_star[j] - self.X[i, j])self.X[i, j] = distance_to_Leader * np.exp(b * l) * np.cos(l * 2 * np.pi) + self.X_star[j]fitness = self.objective(self.X[i, :])if fitness < self.fitness_star:self.fitness_star = fitnessself.X_star = self.X[i, :].copy()# 用于可视化的数据return self.X, self.X_star, self.fitness_star# 设置参数
n_whales = 5 # 增加鲸鱼数量
n_iterations = 3 # 增加迭代次数
bounds = [(-10, 10), (-10, 10)]# 实例化并运行WOA
woa = WhaleOptimizationAlgorithm(objective_function, bounds, n_whales, n_iterations)
woa.initialize()
whales, best_whale, best_fitness = woa.optimize()# 三维可视化
fig = plt.figure(figsize=(12, 9))
ax = fig.add_subplot(111, projection='3d')x = np.linspace(bounds[0][0], bounds[0][1], 400)
y = np.linspace(bounds[1][0], bounds[1][1], 400)
x, y = np.meshgrid(x, y)
z = objective_function([x, y])# 绘制曲面
ax.plot_surface(x, y, z, cmap='viridis', alpha=0.6)# 绘制鲸鱼位置,增加点的透明度
ax.scatter(whales[:, 0], whales[:, 1], objective_function(whales.T), color='red', alpha=0.5)# 标记最佳位置,增加点的大小
ax.scatter(best_whale[0], best_whale[1], objective_function(best_whale), color='green', marker='*', s=200)ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
plt.title('3D Visualization of Whale Optimization Algorithm')
plt.show()
颜色渐变表示函数值,从中心的低值(接近最优解)到外围的高值。鲸鱼优化算法训练解决上述问题的可视化如下所示:
图中红色的点代表鲸鱼在优化过程中的位置,而绿色的星号标记了算法找到的最佳解决方案,位于中心附近,这表明函数的最小值点在 (0, 0)。通过这个可视化,我们可以直观地看到鲸鱼优化算法在搜索空间中是如何移动并逐渐接近最优解的。
相关文章:

鲸鱼优化算法(Whale Optimization Algorithm)
注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 算法背景 鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种模拟鲸鱼捕食行为的优化算法。想象一下,你…...

C++内存管理new-delete大法及实现原理
目录 前言: 一:C语言中区域划分的回顾及各个变量存在的位置 1.经典例题 编辑2.C/C中内存区域的划分 二:C内存管理方式 new delete操作符 1.对于内置类型 2.对于自定义类型 三:operator new和operator delete函数 1…...

Spring WebFlux响应式实现WebFilter解决跨域问题
WebFilter 是 Spring Framework 中用于处理 Web 请求的过滤器接口,它是在基于 Servlet 3.0 规范的基础上,为了支持响应式编程模型而引入的。与传统的 Servlet 过滤器相似,WebFilter 也允许开发者对进入的请求和返回的响应进行拦截、修改或者增…...

第4章 Redis,一站式高性能存储方案,笔记问题
点赞具体要实现功能有哪些? 可以点赞的地方:对帖子点赞,对评论点赞点一次是点赞,再点一次是取消赞统计点赞的数量(计数,string),帖子被点赞的数量,某个用户被点赞的数量…...

UVA540 Team Queue 解题报告
UVA540 Team Queue 解题报告 题目链接 https://vjudge.net/problem/UVA-540 题目大意 有t个团队的人正在排一个长队。每次新来一个人时,如果他有队友在排队,那么这个新人会插队到最后一个队友的身后。如果没有任何一个队友排队,则他会排到…...

基础贪心问题
1.部分背包问题 #include<iostream> #include<algorithm> using namespace std; const int N 110; double v[N], w[N]; pair<double, int> a[N]; int n, m;int main(){cin>>n>>m;double x, y;for(int i 0; i < n; i){cin>>v[i]>&g…...

day13 java final 类和对象的初始化执行顺序
final [面试题]请简述final关键字final修饰类(最终的类)-太监类:该类不能被继承。(比如:String StringBuilder,....) final修饰方法(最终的方法):不能被重写 final修饰的变量 :值不…...

蓝桥杯gcd汇总
gcd3014 问题描述 小明和小红是一对恋人,他们相爱已经三年了,在今年的七夕节,小明准备给小红一个特殊的礼物。他想要送给小红一些数字,让小红算出有多少对正整数 (a,b) 满足以下条件: clcm(a,b)−dgcd(a,b)x其中 c,…...

极市平台 | 综述:一文详解50多种多模态图像融合方法
本文来源公众号“极市平台”,仅用于学术分享,侵权删,干货满满。 原文链接:综述:一文详解50多种多模态图像融合方法 0 极市导读 本工作总结了50篇论文中Lidar和camera的多模态融合的一些概念方法。笔者结合原文以及自…...

数据结构系列-队列的结构和队列的实现
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 队列 队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除删除数据操作的特殊线性表,队列具有先进先出FIFO,…...

MySQL——查询数据的处理
一、并列 连接两个数据列的值,并进行输出的格式化处理(显示为一种统一的格式) concat( 列 1 格式化字 符 ) mysql> select concat(vend_name, vend_country) from vendors; --------------------------------- | concat(vend_name, ve…...
【机器学习300问】59、计算图是如何帮助人们理解反向传播的?
在学习神经网络的时候,势必会学到误差反向传播,它对于神经网络的意义极其重大,它是训练多层前馈神经网络的核心算法,也是机器学习和深度学习领域中最为重要的算法之一。要正确理解误差反向传播,不妨借助一个工具——计…...

ctfshow web入门 php特性 web108--web115
web108 ereg函数相当于而preg_match()函数 ereg函数的漏洞:00截断。%00截断及遇到%00则默认为字符串的结束 strrev函数就是把字符串倒过来 就是说intval处理倒过来的传参c0x36d(877)?ca%00778 web109 异常处理类 通过异常处理类Excepti…...

京东API接口采集商品详情数据(测试入口如下)
京东API接口采集商品详情数据 请求示例,API接口接入Anzexi58 在当今数字化时代,电商平台的API接口成为了获取商品详情数据的重要途径之一。作为中国最大的自营式电商企业,京东提供了丰富的API接口供开发者使用,以便获取京东平台上…...

Mac brew 安装软件
Mac brew 安装软件 homebrew 速度慢 将brew 切换到国内镜像源 # 速度一般 # 步骤一 cd "$(brew --repo)" git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git# 步骤二 cd "$(brew --repo)/Library/Taps/homebrew/homebr…...

【顶部距离计算】计算元素顶部与浏览器顶部的距离
在开发中,我们常常需要计算某个元素顶部与浏览器视口顶部的距离,只需要一个方法即可计算 解决:使用getBoundingClientRect()方法 代码示例: 接收一个参数element表示需要计算的元素 // 计算该元素的顶部距离浏览器的顶部距离 c…...

守护人类健康:人工智能赋能医疗领域创新应用
编者按:每年的4月7日是世界卫生日,又称世界健康日,旨在引起世界各国人民对卫生、健康工作的关注,提高人们对卫生领域的素质和认识,强调健康对于劳动创造和幸福生活的重要性。那么,如果医疗技术能够更加智能…...

linux常用指令(一)——cat、more、cp
cat命令: 用于查询看文件内容 语法:cat linux路径 参数必填,表示要查看文件的目录的路径,(相对,绝对,特殊路径符都可以使用) more命令: 用于查看文件内容,…...

基于RTThread的学习(三):正点原子潘多拉 QSPI 通信 W25Q128 实验
1、基于芯片创建工程 2、QSPI配置 2.1、RTThing_setting 设置组件 2.2、配置board.h 文件 2.3、cubemx生成QSPI的硬件初始化代码;HAL_QSPI_MapInit; 这里注意:你所买的开发板对应的qspi 连接的是否是cubemx 上边显示的,如果不是你需要将引脚…...

Mac反编译APK
文章目录 第一种方式: brew installapktool 使用说明dex2jar 使用说明 第二种方式: 下载安装包apktool 使用说明 (根据官方介绍没有操作成功,后续成功再更新这里)dex2jar 使用说明 安装 JD-GUI 查看jar包中的class文件JD-GUI 使用说明 第一种方式: brew install 安装过程可能很…...

Java数据结构-队列
目录 1. 队列概念2. 模拟实现队列2.1 链式队列2.2 循环队列 3. 双端队列4. 队列的应用4.1 用队列实现栈4.2 用栈实现队列 1. 队列概念 队列是一种只能在一端进行插入数据操作,另一端进行删除数据操作的数据结构,插入数据的叫队尾,删除数据的…...

JVM专题——类文件结构
本文部分内容节选自Java Guide和《深入理解Java虚拟机》, Java Guide地址: https://javaguide.cn/java/jvm/class-file-structure.html 🚀 基础(上) → 🚀 基础(中) → 🚀基础(下&am…...

零基础10 天入门 Web3之第2天
10 天入门 Web3之第2天Web3 是互联网的下一代,它将使人们拥有自己的数据并控制自己的在线体验。Web3 基于区块链技术,该技术为安全、透明和可信的交易提供支持。我准备做一个 10 天的学习计划,可帮助大家入门 Web3: 一、这是第二…...

Vue和FastAPI实现前后端分离
前言 近期接触了一些开源大模型应用服务,发现很多用的都是FastAPI web框架,于是乎研究了一下它的优势,印象最深有两个:一个是它的异步处理性能比较好,二是它可以类似java swagger的API交互文档,这个对应前…...

34470A是德科技34470A数字万用表
181/2461/8938产品概述: Truevolt数字万用表(34460A、34461A、34465A、34470A)利用是德科技的新专利技术,使您能够快速获得见解、测量低功耗设备并保持校准的测量结果。Truevolt提供全方位的测量能力,具有更高的精度、…...

iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑
引言 在 iOS 开发中,将 IPA 文件上传到苹果开发者中心是一个重要的步骤。通常情况下,我们需要使用 Mac 电脑上的 Xcode 或 Application Loader 工具来完成这个任务。然而,如果你没有 Mac 电脑,也没有关系,本文将介绍一…...

c语言多媒体文件管理及检索系统220
定制魏:QTWZPW,获取更多源码等 目录 选题 程序设计题1:基于数据分析的小区电量扩容推荐程序 程序设计题2:神气的盒子 程序设计题3:多媒体文件管理及检索系统 程序设计题4: 计算24点游戏 程序设计题…...

链表之双向链表的实现
铁汁们大家好,我们上一篇博客学习了单链表,这节课让我们继续往深学习,学习一下双线链表,话不多说,我们开始吧! 目录 1.双向链表 2.顺序表和链表的优缺点 3.双向链表的实现 1.双向链表 1.我们要实现的双线…...

小白学大模型:什么是生成式人工智能?
什么是生成式人工智能? 在过去几年中,机器学习领域取得了迅猛进步,创造了人工智能的一个新的子领域:生成式人工智能。这些程序通过分析大量的数字化材料产生新颖的文本、图像、音乐和软件,我将这些程序简称为“GAIs”…...

并发编程01-深入理解Java并发/线程等待/通知机制
为什么我们要学习并发编程? 最直白的原因,因为面试需要,我们来看看美团和阿里对 Java 岗位的 JD: 从上面两大互联网公司的招聘需求可以看到, 大厂的 Java 岗的并发编程能力属于标配。 而在非大厂的公司, 并…...