鲸鱼优化算法(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=1n1[100(xi+1xi2)2+(1xi)2]

2. 更新公式

2.1 突袭行为

在突袭行为中,鲸鱼的位置更新公式为:

D = ∣ C ⋅ X ∗ − X i ∣ D=|C\cdot X^*-X_i| D=CXXi

X i = X ∗ − A ⋅ D X_i=X^*-A\cdot D Xi=XAD

其中:

∙ \bullet X ∗ X^* X是当前最佳位置。
· A A A是一个控制参数,定义为:

A = 2 a ⋅ r − a A=2a\cdot r-a A=2ara

∙ C \bullet C C是随机数,定义为:

C = 2 ⋅ r a n d ( ) C=2\cdot rand() C=2rand()

· D D D是当前鲸鱼与最佳位置之间的距离。

2.2 螺旋更新

在螺旋更新中,鲸鱼的位置更新公式为:

X i = D ⋅ e ( i ⋅ 2 π ) + X ∗ X_i=D\cdot e^{(i\cdot2\pi)}+X^* Xi=De(i2π)+X

其中:

· D D D是与最佳位置的距离,计算为:

D = ∣ X ∗ − X i ∣ D=\begin{vmatrix}X^*-X_i\end{vmatrix} D= XXi

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(maxiter2iter)

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_iter
    for i = 1:num_whales
        % 计算当前鲸鱼的位置的目标函数值
        fitness = target_function(whales(i, :));
        
        % 更新最佳解
        if fitness < best_score
            best_score = fitness;
            best_position = whales(i, :);
        end
    end
    
    % 更新鲸鱼位置
    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;
            end
        else
            % 螺旋更新
            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)]);

代码说明

  1. 参数设置

    • max_iter:最大迭代次数。
    • num_whales:鲸鱼的数量。
    • dim:问题的维度(此例中为2维)。
    • lbub:搜索空间的上下界。
  2. 初始化

    • 随机生成鲸鱼的位置。
  3. 目标函数

    • 使用Rosenbrock函数作为优化目标。
  4. 主循环

    • 计算每只鲸鱼的适应度,并更新最佳解。
    • 根据鲸鱼的行为(突袭行为和螺旋更新)更新鲸鱼的位置。
    • 确保鲸鱼的位置在设定的边界内。
  5. 结果输出

    • 每次迭代输出当前最佳适应度,并在最后输出全局最佳位置和适应度。

注意事项

  • 可以根据需要调整参数以实现不同的优化效果。
  • 目标函数可以替换为其他需要优化的函数。
  • 增加绘图功能可以更直观地展示优化过程。

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

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

相关文章

HarmonyOS 5.0应用开发——Navigation实现页面路由

【高心星出品】 文章目录 Navigation实现页面路由完整的Navigation入口页面子页面 页面跳转路由拦截其他的 Navigation实现页面路由 Navigation&#xff1a;路由导航的根视图容器&#xff0c;一般作为页面&#xff08;Entry&#xff09;的根容器去使用&#xff0c;包括单页面&…

前端构建工具vite的优势

1. 极速冷启动 Vite 使用原生 ES 模块 (ESM) 在开发环境下进行工作。相比于传统构建工具需要打包所有的文件&#xff0c;Vite 只在浏览器请求模块时动态加载所需的文件。无打包冷启动&#xff1a;无需预先打包&#xff0c;项目启动非常快&#xff0c;尤其对于大型项目效果更明…

Arduino Uno 同时控制多路舵机

Arduino Uno同时控制4个舵机 舵机可以在0~180度内指定角度的控制。常用于航模、机器人、遥控玩具等物品,然而,很多时候要一次性控制多个舵机,今天以控制4个舵机为例进行说明 接线方式如下图: 舵机的信号线分别接A0,A1,A2,A3。控制舵机从0旋转到180度,再由180度旋转到0度,…

基于NERF技术重建学习笔记

NeRF&#xff08;Neural Radiance Fields&#xff09;是一种用于3D场景重建的神经网络模型&#xff0c;能够从2D图像生成逼真的3D渲染效果。它将场景表征为一个连续的5D函数&#xff0c;利用了体积渲染和神经网络的结合&#xff0c;通过学习光线穿过空间时的颜色和密度来重建场…

机器视觉-相机、镜头、光源(总结)

目录 1、机器视觉光源概述 2、光源的作用 3、光谱 4、工业场景常见光源 4.1、白炽灯 4.2、卤素灯 4.3、 荧光灯 4.4、LED灯 4.5、激光灯 5、光源的基本性能 5.1、光通量 5.2、光效率 5.3、发光强度 5.4、光照度 5.5、均匀性 5.6、色温 5.7、显色性 6、基本光学…

openpnp - 解决“底部相机高级校正成功后, 开机归零时,吸嘴自动校验失败的问题“

文章目录 openpnp - 解决"底部相机高级校正成功后, 开机归零时&#xff0c;吸嘴自动校验失败的问题"概述笔记问题现象1问题现象2原因分析现在底部相机和吸嘴的位置偏差记录修正底部相机位置现在再看看NT1在底部相机中的位置开机归零&#xff0c;看看是否能通过所有校…

python csv库

python csv库 水一水又是一篇&#xff0c;乐 读取 import csv # 打开 CSV 文件 with open(example.csv, moder, newline) as file: csv_reader csv.reader(file) # 读取文件头&#xff08;可选&#xff09; headers next(csv_reader) print(f"Headers: {heade…

golang将指针传给cgo后还能被回收吗?

问题&#xff1a; 如果把golang分配的变量&#xff0c;其指针通过cgo传给c&#xff0c;并被c存储&#xff0c;那这个变量还能被gc回收吗&#xff1f; 实验代码&#xff1a; test_memory_leak.go package main/* #include <stdlib.h> #include <string.h> #incl…

基于docker-compose编排部署微服务快速开发框架

1. 规划节点 节点规划&#xff0c;见表1。 表1 节点规划 IP主机名节点10.24.2.10masterdocker-compose节点 2. 基础准备 Docker和Docker Compose已安装完成&#xff0c;将提供的软件包Pig.tar.gz上传至master节点/root目录下并解压。 案例实施 1. 基础环境准备 &#x…

渗透测试-百日筑基—SQL注入篇时间注入绕过HTTP数据编码绕过—下

day8-渗透测试sql注入篇&时间注入&绕过&HTTP数据编码绕过 一、时间注入 SQL注入时间注入&#xff08;也称为延时注入&#xff09;是SQL注入攻击的一种特殊形式&#xff0c;它属于盲注&#xff08;Blind SQL Injection&#xff09;的一种。在盲注中&#xff0c;攻击…

模型评估:Accuracy、Precision、Recall、F1、ROC曲线、AUC、PR曲线

Accuracy & Precision & Recall & F1 准确率 Accuracy A c c u r a c y T T T F A L L Accuracy \frac{TT TF}{ALL} AccuracyALLTTTF​ 1.分类器到底分对了多少&#xff1f; 精确率 Precision 2.返回的图片中正确的有多少&#xff1f; 召回率 / 查全率 …

了解光耦合器输入输出关系---腾恩科技

光耦合器&#xff0c;也称为光隔离器&#xff0c;是电子电路中必不可少的元件&#xff0c;主要用于在隔离部分之间传输信号&#xff0c;同时防止电噪声或高压影响敏感元件。其独特的设计使它们能够在没有直接电接触的情况下&#xff0c;弥合不同电压域之间的差距。在本文中&…

解决docker拉取readeck镜像报Error response from daemon: toomanyrequests问题

readeck 是一个内容中心&#xff0c;目前已支持中文翻译 这是本地化部署后的效果&#xff1a; 原命令为&#xff1a; docker run --rm -ti -p 8000:8000 -v readeck-data:/readeck codeberg.org/readeck/readeck:latest Unable to find image codeberg.org/readeck/readeck:la…

LeetCode 热题 100之普通数组

1.最大子数组和 思路分析&#xff1a;这个问题可以通过动态规划来解决&#xff0c;我们可以使用Kadane’s Algorithm&#xff08;卡登算法&#xff09;来找到具有最大和的连续子数组。 Kadane’s Algorithm 的核心思想是利用一个变量存储当前的累加和 currentSum&#xff0c;并…

【高中生讲机器学习】22. 信息论基础:信息熵、交叉熵、相对熵

创建时间&#xff1a;2024-10-16 首发时间&#xff1a;2024-10-24 最后编辑时间&#xff1a;2024-10-24 作者&#xff1a;Geeker_LStar FIRST OF ALL!!! 2024.10.24&#xff01;&#xff01; 1024 快乐&#xff01;&#xff01;&#xff01; 你好呀~这里是 Geeker_LStar 的人工…

IDEA初探:深入理解 Structure 功能

一、Structure - 类视图 Structure 是 IDEA 中的一个视图工具&#xff0c;它提供了对当前文件中结构元素的快速访问。通过 Structure&#xff0c;我们可以方便地查看和导航到代码中的各个部分&#xff0c;从而提高代码编辑和浏览的效率。 1.1 基本概念 Structure 视图以树形结…

Spring Boot:植物健康监测的智能先锋

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了植物健康系统的开发全过程。通过分析植物健康系统管理的不足&#xff0c;创建了一个计算机管理植物健康系统的方案。文章介绍了植物健康系统的系统分析部分&…

一文带你搞懂RabbitMQ 如何保证消息不丢失

RabbitMQ使用场景&#xff1a; 异步发送&#xff08;验证码、短信、邮件&#xff09;MySQL和Redis&#xff0c;ES之间的数据同步分布式事务削峰填谷 什么情况下消息容易丢失&#xff1a; 消息未到达交换机消息未到达队列队列中消息丢失消费者未接收到消息 解决消息丢失的方法…

python查询并安装项目所依赖的所有包

引言 如果需要进行代码的移植&#xff0c;肯定少不了在另一台pc或者服务器上进行环境的搭建&#xff0c;那么首先是要知道在已有的工程的代码中用到了哪些包&#xff0c;此时&#xff0c;如果是用人工去一个一个的代码文件中去查看调用了哪些包&#xff0c;这个工作甚是繁琐。…

js面试问题笔记(一)

一.热门js面试 1.简述同步和异步的区别? 同步: 浏览器访问服务器请求,用户看到页面刷新 ,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作 异步: 浏览器访问服务器请求,用户正常操作,浏览器后端进行请求,等请求完,页面不刷新,新内容也会出现,用户看到…