鲸鱼优化算法(Whale Optimization Algorithm)

news2025/1/11 23:51:16

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

算法背景

鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种模拟鲸鱼捕食行为的优化算法。想象一下,你在大海上划船,突然一只庞大的鲸鱼跃出水面。鲸鱼猎食主要依靠两种策略:一是环绕并逐渐靠近猎物,二是制造强大的水柱把猎物推向水面。WOA正是基于这两种策略设计的。具体来说:

  1. 搜索猎物:在这个阶段,鲸鱼优化算法模拟鲸鱼在海洋中自由游动的行为,探索广阔的搜索空间以找到潜在的最优解。这一阶段的关键是随机性,算法中的解(鲸鱼)以随机的方式在搜索空间内移动,以确保没有遗漏任何可能的区域。这种方法类似于鲸鱼在海洋中随机游动以搜索食物源。每个解的位置更新都是不可预测的,但目的是探索尽可能多的区域,以提高找到高质量解的机会。
  2. 环绕猎物:当算法检测到一个有希望的解时,它进入了环绕猎物阶段。在这个阶段,其他解(鲸鱼)开始聚焦于这个潜在的最佳解,执行更有目的性的搜索。这类似于鲸鱼发现了一群鱼并开始围绕着它们游动,准备捕食。解的位置更新在这一阶段变得更加精确和集中,他们会根据当前最佳解的位置来调整自己的方向和位置。这一阶段的目的是缩小搜索范围,并集中精力在最有希望的区域内寻找最优解。
  3. 气泡网攻击法:当解足够接近潜在的最优解时,鲸鱼优化算法模拟鲸鱼使用气泡网捕食的策略。这是一个高度精确的阶段,解在这里采取一种结合随机性和确定性的移动策略。模拟座头鲸制造气泡网的行为,解会创建一个虚拟的“气泡网”,逐渐缩小搜索范围并集中在最有希望的区域内。这个过程旨在细化和完善解,通过减少随机性和增加确定性的移动来接近最终的最优解。气泡网攻击法是一个高效的捕捉机制,确保算法能够精确地捕获最优解。

算法应用

  1. 工程优化
    • 结构设计:在建筑工程中,WOA可以用于寻找最优的结构设计,以提高建筑物的稳定性和耐用性。
    • 电力系统:在电力系统中,WOA被用来优化电网的负荷分配,减少能源损耗,提高能源使用效率。
  2. 机器学习
    • 特征选择:WOA可以用于选择最有影响力的特征,提高机器学习模型的准确性和效率。
    • 神经网络训练:WOA被用于优化神经网络的权重和结构,以提高训练效率和模型性能。
  3. 优化问题
    • 旅行商问题(TSP):WOA可以用于解决TSP,即寻找最短的路径访问一系列位置并返回起点。
    • 多目标优化:WOA在处理具有多个优化目标的问题时表现出色,能够找到满足所有目标的最优解。
  4. 图像处理
    • 图像分割:WOA可用于图像分割,以识别和分离图像中的不同区域或对象。
    • 图像增强:通过调整图像的特定参数,WOA可以用于改善图像的质量,如对比度和亮度调整。
  5. 调度问题
    • 任务调度:在生产和服务行业,WOA可以用于优化资源分配和任务调度,提高效率和减少成本。
  6. 其他领域
    • 包括生物信息学、化学、水资源管理等领域也在探索使用WOA来解决特定的优化问题。

鲸鱼优化算法之所以受欢迎,是因为它简单、灵活且易于实现,同时能够有效处理各种复杂的优化问题。然而,它也有局限性,比如在某些情况下可能会陷入局部最优解,或者在处理高维问题时效率较低。因此,研究者和工程师通常会根据具体问题调整和改进算法,以获得更好的性能。

算法计算流程

鲸鱼算法(Whale Optimization Algorithm,简称WOA)是一种模拟座头鲸捕食行为的启发式优化算法。下面我将详细介绍这个算法:

这个算法的关键在于两个公式:

第一个公式D^{\prime}=|C\cdot X^*(t)-X(t)| :
想象一下: X∗(t) 是目前为止找到的最好的食物源(最优解),而 X(t) 是一只鲸鱼当前的位置。这个公式其实就是在计算鲸鱼和它的目标(最好的食物源)之间的距离。
为什么要乘以 C:C 是一个随机因子,它的作用是让鲸鱼在接近目标时不是直线移动,而是有点随机地绕着目标转,这模仿了鲸鱼在海中寻找食物时的不确定和灵活的行为。

第二个公式X(t+1)=X^*(t)-A\cdot D^\prime:
– 这个公式描述了什么:它告诉我们鲸鱼下一个时刻的位置。鲸鱼根据当前最好的食物源的位置和它自己与食物源的距离来更新自己的位置。
– 系数 A 的作用: 如果 A 的值大于 1,这意味着鲸鱼可能不直接向当前最好的食物源移动,而是可能选择另一个方向,去探索海洋中的其他区域。这种行为增加了探索新区域的机会,有助于发现更好的食物源。

总的来说,这两个公式一起工作,模拟了鲸鱼在海中寻找并捕捉食物的行为。它们帮助算法在“探索” (寻找新的可能解决方案区域) 和“开发” (在已知的最优解附近寻找更优解) 之间取得平衡。通过这种方式,WOA 试图高效地找到问题的最佳解决方案,就像鲸鱼在大海中高效地寻找食物一样。

1. 系数 A :

                                                            A=2a\cdot r-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 :

                                                                C=2\cdot r

其中 r 是 [0,1] 范围内的随机数。
– 目的: 系数 C 用于确定解 (鲸鱼) 环绕猎物的路径和方向。它决定了解如何更新其位置来接近或探索潜在的最优解。
– 设计逻辑: 通过将 C 设置为随机值的两倍,算法在解的位置更新中引入了随机性,从而模拟鲸鱼在捕食时的不确定和随机的动作。这有助于维持探索和利用之间的平衡,并且使算法能够适应不同的搜索环境和条件。
– 为什么通过将 C 设置为随机值的两倍?
– 随机性引入: 在优化算法中,随机性是一种重要的机制,用于避免陷入局部最优并探索解空间的不同区域。通过将 C 设置为随机值的两倍,算法在解的位置更新中引入了足够的随机性,同时保留了对当前最佳解的一定程度的吸引。
– 探索能力:使用 2⋅r 的设置能够让解有更大的机会探索离当前最佳解较远的区域,从而增强算法的全局搜索能力。


为什么不是其他的设置?
– 经验与实验:算法的这些特定设置通常基于经验和广泛的实验。研究者通过测试不同的参数设置和他们对算法性能的影响来确定最有效的设置。
– 平衡与适应性: 这些设置被认为在多种问题类型和复杂性上提供了较好的平衡和适应性。虽然其他设置也可能有效,但当前的设置已被证明在多个应用中表现良好。

算法详细示例

假设我们要最小化一个二维函数f(x,y)=x^2+y^2,初始群体大小为 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),鲸鱼靠近猎物。
– 首先计算 D^\prime=|1\times(1,2)-(3,4)|=|(-2,-2)|
– 然后更新位置 X(t+1)=(1,2)-0\times(-2,-2)=(1,2)
3. 评估新位置:
– 计算新位置的函数值 f(1,2)=1^2+2^2=5
– 这个值小于之前的解,即f(3,4)=3^2+4^2=25,,因此更新为新的最优解。

这个过程会在每个迭代中重复进行,直到达到设定的迭代次数

代码实现

为了实现鲸鱼优化算法 (WOA) 并对其进行可视化,我们可以用Python编写一个简单的程序。在这个程序中,我们将针对目标函数f(x,y)=x^2+y^2进行优化。这个函数的全局最小值在点 (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 = objective
        self.bounds = bounds
        self.n_whales = n_whales
        self.n_iterations = n_iterations
        self.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 - a
                C = 2 * r2
                b = 1
                l = (a2 - 1) * np.random.rand() + 1
                p = 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_rand
                        else:
                            D_Leader = abs(C * self.X_star[j] - self.X[i, j])
                            self.X[i, j] = self.X_star[j] - A * D_Leader
                    else:
                        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 = fitness
                    self.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()

颜色渐变表示函数值,从中心的低值(接近最优解)到外围的高值。鲸鱼优化算法训练解决上述问题的可视化如下所示:

图片[1]-鲸鱼优化算法(Whale Optimization Algorithm)-VenusAI

图中红色的点代表鲸鱼在优化过程中的位置,而绿色的星号标记了算法找到的最佳解决方案,位于中心附近,这表明函数的最小值点在 (0, 0)。通过这个可视化,我们可以直观地看到鲸鱼优化算法在搜索空间中是如何移动并逐渐接近最优解的。

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

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

相关文章

java中使用雪花算法(Snowflake)为分布式系统生成全局唯一ID

&#xff08;全局唯一ID的解决方案有很多种&#xff0c;这里主要是介绍和学习Snowflake算法&#xff09; 什么是雪花算法&#xff08;Snowflake&#xff09; 雪花算法&#xff08;Snowflake Algorithm&#xff09;是由Twitter公司在2010年左右提出的一种分布式ID生成算法&…

参加2023 甲骨文圆桌会议

2023年10月13日&#xff0c;我参加了2023 甲骨文圆桌会议&#xff0c;并做了《Oracle高可用架构的最佳实践》主题演讲。 照片为当时活动现场&#xff1a;

中霖教育:2024年注册计量师考试报名即将开始!

2024年注册计量师考试报名即将开始&#xff0c;时间定于4月中旬左右。对于考生来说&#xff0c;以下需要注意&#xff1a; 1、报名 考生需要在人事考试网站进行用户信息注册&#xff0c;在成功注册后&#xff0c;才能进一步进行报名操作。注册信息包括用户基本信息&#xff1…

【案例分享】如何通过甘特图管理项目进度?

我将通过一个实际案例来具体说明我是如何通过甘特图来管理项目进度的。 案例背景&#xff1a; 我负责过一个软件开发项目&#xff1a;一款在线学习APP。项目团队包括项目经理、开发人员、测试人员、UI设计师等多个角色&#xff0c;预计项目周期为6个月。 案例实施过程&…

Three.js--》实现2D转3D的元素周期表

今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 目录 项目搭建 平铺元素周期表 螺旋元素周期表 网格元素周期表 球状元素周期表 加底部交互按钮 项目…

C语言操作符详解(二)

一、位操作符 & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 注意&#xff1a;它们的操作数必须是整数。 下面的码我都只取了后八位 1.1、按位与 使用补码进行按位与 规则:对应二进制位有0就是0,两个同时为1才为1. 1.2、按位或 使用补码进行按位或 规则:对应二进…

Windows内核是什么,如何保障内核安全

Windows操作系统发展到如今已有三十余年&#xff0c;是目前在全球范围内广泛使用的操作系统。Windows内核是操作系统的核心部分&#xff0c;内核包括了HAL(硬件抽象层)&#xff0c;设备驱动&#xff0c;微内核&#xff0c;各种管理设备&#xff0c;管理层以及系统服务界面&…

【优选算法专栏】专题十六:BFS解决最短路问题(二)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

OpenHarmony实战:瑞芯微RK3566移植案例(下)

OpenHarmony实战&#xff1a;瑞芯微RK3566移植案例&#xff08;下&#xff09; OpenHarmony实战&#xff1a;瑞芯微RK3566移植案例&#xff08;中&#xff09; WIFI 整改思路及实现流程 整改思路 接下来熟悉HCS文件的格式以及"HDF WIFI”核心驱动框架的代码启动初始化…

Java入门基础知识第七课(超基础,超详细)——数组

前面二白讲了选择结构和循环结构&#xff0c;动手的同学会发现已经有了一定的难度&#xff0c;后面二白会专门收集一些经典的题目&#xff0c;训练多了才能让记忆更加深刻&#xff0c;这次咱们讲一下数组。 一、数组的定义 什么是数组呢&#xff0c;我们都知道变量是存储数据的…

第八讲 Sort Aggregate 算法

我们现在将讨论如何使用迄今为止讨论过的 DBMS 组件来执行查询。 1 查询计划【Query Plan】 我们首先来看当一个查询【Query】被解析【Parsed】后会发生什么&#xff1f; 当 SQL 查询被提供给数据库执行引擎&#xff0c;它将通过语法解析器进行检查&#xff0c;然后它会被转换…

新增长100人研讨会:20+上海医疗企业共探数字驱动下的目标管理与业绩增长策略

近日&#xff0c;纷享销客新增长100人系列活动之上海医疗专场&#xff0c;我们有幸邀请百趣生物一起&#xff0c;共同探讨医疗器械行业数字化增长的新理念、新方法和新实践。 活动聚集了百趣生物、汉维生物、松佰牙科器械、多宁生物、松佰医疗、瑞丰达医疗等20余位标杆医疗健康…

蓝桥杯简单模板

目录 最大公约数 两个数的最大公约数 多个数的最大公约数 最小公倍数 两个数的最小公倍数 多个数的最小公倍数 素数 ​编辑 位数分离 正写 ​编辑 反写 闰年 最大公约数 两个数的最大公约数 之前看见的是辗转相除法&#xff0c;例如现在让算一个49&#xff0c;21…

数码相框-LCD显示多行文字

显示几行文字: 从左显示&#xff1a;先描边再算出边框。居中显示&#xff1a;先算出边框&#xff0c;再确定坐标描画。 从左显示 第一行数据的起始位置是从(0,24)开始的。 要知道第二行数据从哪里开始&#xff0c;我们得知道画出来的矢量字体的边框是多少&#xff1a; 这个…

【C++】 详解 lower_bound 和 upper_bound 函数(看不懂来捶我!!!)

目录 一、前言 二、函数详解 &#x1f95d; lower_bound &#x1f34d;upper_bound 三、常考面试题 四、共勉 一、前言 这两个函数是我在 LeetCode 上做题见到&#xff0c;看到不熟悉的函数 lower_bound 和 upper_bound让我感觉很难受&#xff0c;于是在 C 官网去学习&…

2024HW --->反序列化漏洞!

对于反序列化&#xff0c;这个漏洞也是常用的&#xff0c;不过涉及到的方面非常非常广&#xff0c;比其他漏洞也难很多 于是本篇文章就分成PHP和JAVA的反序列化来讲讲 1.反序列化 想要理解反序列化&#xff0c;首先就要理解序列化 序列化&#xff1a;把对象转换为字节序列的过…

默克尔(Merkle)树 - 原理及用途

默克尔&#xff08;Merkle&#xff09;树的原理以及用途 引言 在当今数字化时代&#xff0c;确保数据的完整性是至关重要的。默克尔树作为一种高效的数据结构&#xff0c;被广泛应用于网络安全、分布式系统以及加密货币等领域&#xff0c;用于验证大量数据的完整性和一致性 数…

代码随想录算法训练营Day48|LC198 打家劫舍LC213 打家劫舍IILC337 打家劫舍III

一句话总结&#xff1a;前两题白给&#xff0c;第三题树形DP有点难。 原题链接&#xff1a;198 打家劫舍 滚动数组直接秒了。 class Solution {public int rob(int[] nums) {int n nums.length;int first 0, second nums[0];for (int i 2; i < n; i) {int tmp Math.m…

mega2560读取sick位移传感器

本次的项目中&#xff0c;需要使用到mega2560来读取sick位移传感器的模拟量&#xff0c;再把模拟量进行转换&#xff0c;从而使得到的数据为位移传感器的示数。 下面是位移传感器的接线图&#xff1a;棕色线接&#xff0b;24v&#xff0c;蓝色线接0v&#xff0c;白色线为模拟量…

JS 表单验证

点击注册的时候&#xff0c;渲染出来&#xff0c;验证码是自动获取出来的 html&#xff1a; <div class"div1">用户名<input type"text" id"yhm"><span id"span1"></span><br>密码<input type"…