鲸鱼优化算法(Whale Optimization Algorithm)

注意:本文引用自专业人工智能社区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)。通过这个可视化,我们可以直观地看到鲸鱼优化算法在搜索空间中是如何移动并逐渐接近最优解的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文学会Semaphore(信号量)

// 空出来椅子 semaphore.release(count); } } catch (Exception e){ } } }; t.setName("Thread --> " i); t.start(); } } 程序将一直执行下去&#xff0c;不会漏单&#xff0c;也不会出现椅子占用数量大于20的情况。 AQS基础 Semaphore是一种共享锁&#xf…

若依框架mysql 搜索中文等于不生效

背景&#xff0c;字段存储的是中文 不生效代码如下 <if test"constellation ! null and constellation ! ">AND u.constellation #{constellation}</if> 正确生效的代码如下 <if test"constellation ! null and constellation ! ">A…

kubernetes集群添加到jumpserver堡垒机里管理

第一步、在kubernetes集群中获取一个永久的token。 jumpserver堡垒机用api的来管理kubernetes&#xff0c;所以需要kubernetes的token&#xff0c;这个token还需要是一个永久的token&#xff0c;版本变更&#xff1a;Kubernetes 1.24基于安全方面的考虑&#xff08;特性门控Le…

C语言自定义类型变量——结构体(二)

前言&#xff1a;上一篇内容中我们概述了结构体的基本内容&#xff0c;包括结构体的定义&#xff0c;声明&#xff0c;创建和初始化&#xff0c;内存对齐等问题&#xff0c;本篇将进一步深入结构体相关内容&#xff0c;包括为什么会存在内存对齐&#xff0c;结构体如何传参&…

【JavaWeb】Day35.MySQL概述——数据库设计-DDL(二)

表操作 关于表结构的操作也是包含四个部分&#xff1a;创建表、查询表、修改表、删除表。 1.创建 语法 create table 表名( 字段1 字段1类型 [约束] [comment 字段1注释 ], 字段2 字段2类型 [约束] [comment 字段2注释 ], ...... 字段n 字段n类型 [约束] [comment …

Matlab应用层生成简述

基础软件层 目前接触到的几款控制器&#xff0c;其厂商并没有提供simulink的基础软件库一般为底层文件被封装为lib&#xff0c;留有供调用API接口虽然能根据API接口开发基础软件库&#xff0c;但耗费时间过长得不偿失 应用层 所以可以将应用层封装为一个子系统&#xff0c;其…

二. CUDA编程入门-双线性插值计算

目录 前言0. 简述1. 执行一下我们的第十个CUDA程序2. Bilinear interpolation3. 代码分析总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 Note&#xff1a;关于 CUDA 加速双线程插值的内容博主…

王权与自由国际服加速器推荐 一键下载王权与自由加速器分享

《王权与自由》&#xff0c;还记得第一天进游戏各个服务器爆满锁服的盛况&#xff0c;好不容易挤进去&#xff0c;地图上人山人海&#xff0c;NPC埋没在玩家的人海里&#xff0c;差点找不到。迎来了12月20日的大型更新后&#xff0c;再进入游戏&#xff0c;服务器每一个都空闲无…

【C语言】函数递归编程题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 总结 题目一&#xff1a; 题目&#xff1a;接受一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位。&#xff08;递归完成&#xff09; 列如&#xff1a; …

0104练习与思考题-算法基础-算法导论第三版

2.3-1 归并示意图 问题&#xff1a;使用图2-4作为模型&#xff0c;说明归并排序再数组 A ( 3 , 41 , 52 , 26 , 38 , 57 , 9 , 49 ) A(3,41,52,26,38,57,9,49) A(3,41,52,26,38,57,9,49)上的操作。图示&#xff1a; tips:&#xff1a;有不少在线算法可视化工具&#xff08;软…

C#基础:类,对象,类成员简介(第四节课)

本节内容&#xff1a; 类与对象的关系 什么时候叫“对象”&#xff0c;什么时候叫实例引用变量与实例的关系 类的三大成员 属性方法事件 类的静态成员与实例成员 关于“绑定” 1.什么是类&#xff1a;&#xff08;再详细一点&#xff09; 类是对现实世界事物进行抽象所…

网络基础三——初识IP协议

网络基础三 ​ 数据通过应用层、传输层将数据传输到了网络层&#xff1b; ​ 传输层协议&#xff0c;如&#xff1a;TCP协议提供可靠性策略或者高效性策略&#xff0c;UDP提供实时性策略&#xff0c;保证向下层交付的数据是符合要求的的&#xff1b;而网络层&#xff0c;如&a…

59 使用 uqrcodejs 生成二维码

前言 这是一个最近的一个来自于朋友的需求, 然后做了一个 基于 uqrcodejs 来生成 二维码的一个 demo package.json 中增加以依赖 "uqrcodejs": "^4.0.7", 测试用例 <template><div class"hello"><canvas id"qrcode&qu…

2023天梯赛

2023天梯赛 L1-089 最好的文档 分数 5 作者 陈越 单位 浙江大学 有一位软件工程师说过一句很有道理的话&#xff1a;“Good code is its own best documentation.”&#xff08;好代码本身就是最好的文档&#xff09;。本题就请你直接在屏幕上输出这句话。 输入格式&…

豆瓣9.7,这部Java神作第3版重磅上市!

Java 程序员们开年就有重磅好消息&#xff0c;《Effective Java 中文版&#xff08;原书第 3 版&#xff09;》要上市啦&#xff01; 该书的第1版出版于 2001 年&#xff0c;当时就在业界流传开来&#xff0c;受到广泛赞誉。时至今日&#xff0c;已热销近20年&#xff0c;本书…

使用GDAL进行简单的坐标系转换

使用GDAL进行简单的坐标系转换 使用python GDAL进行简单的坐标系转换&#xff0c;暂时不考虑不同基准坐标系转换的精度问题。 安装环境 使用UbuntuAnaconda python 环境 conda install gdal 定义坐标系 from osgeo import gdal from osgeo import osrsrs_wgs84 osr.Spati…

【边缘智能】00_边缘计算发展背景

本系列是个人学习《边缘就算基础知识入门》的笔记&#xff0c;仅为个人学习记录&#xff0c;欢迎交流&#xff0c;感谢批评指正 移动物联设备产生海量数据&#xff0c;数据密集型移动智能应用&#xff0c;计算密集、动态性高&#xff0c;实时性强 传统云计算架构 基于广域互联…

文件上传【1】

1.文件上传更改上传类型 上传文件时存在上传类型固定&#xff08;jpg、png、gif&#xff09;如果是前端确定&#xff08;弹窗&#xff0c;后端未出现请求确定是前端&#xff09;只需要在设置中禁用js代码或抓包更改文件后缀名就可以上传其他类型的文件&#xff08;亦可用于复制…

我关注的测试仪表厂商之Sifos,PoE测试

#最近看看行业各个厂商的网站&#xff0c;看看他们都在做什么# 先从Sifos开始&#xff0c;一直觉得这是家很特别的公司&#xff0c;在PoE测试这块是个无敌的存在。之前在上一家台资测试仪表公司的时候&#xff0c;也有推出过类似的基于产线验证的解决方案&#xff0c;最后因为…

【Java网络编程】计算机网络基础概念

就目前而言&#xff0c;多数网络编程的系列的文章都在围绕着计算机网络体系进行阐述&#xff0c;但其中太多理论概念&#xff0c;对于大部分开发者而言&#xff0c;用途甚微。因此&#xff0c;在本系列中则会以实际开发者的工作为核心&#xff0c;从Java程序员的角度出发&#…