草庐IT

鲸鱼优化算法及其实现

酿豆腐超级好吃 2023-04-21 原文

鲸鱼优化算法(whaleoptimization algorithm, WOA)是群智能算法类型中的一种,通过模拟鲸鱼的行为方式,从而解决优化问题。本章将深入讨论鲸鱼优化算法的实现原理以及如何将算法应用于实际的优化问题中。

本章主要涉及到的知识点有:

  • 算法介绍:包括算法的起源和工作原理。

  • 算法的主要过程:介绍其中的核心搜索行为和过程。

  • 算法的常用参数:帮助控制算法的优化效果。

  • 求解非线性函数的寻优问题:通过本章最后的实例,演示如何将鲸鱼优化算法应用于实际的优化问题。

注意:本章内容包含实例代码,根据代码的步骤演算,即可求得问题的最终结果。

14.1 鲸鱼优化算法介绍

本节首先介绍鲸鱼优化算法的基本概念,理解这些概念是学习鲸鱼优化算法的基础。了解算法概念后,才能将算法应用于实际问题当中。

14.1.1 鲸鱼优化算法的起源和发展概述

鲸鱼优化算法是群智能算法领域,除了蚁群算法、粒子群算法之外的一种新型的群智能优化算法。该算法是 2016 年由澳大利亚格里菲斯大学的Mirjalili等人提出的一种新的群体智能优化算法

在鲸鱼优化算法中,每一条鲸鱼都代表一个解决方案,鲸鱼们在算法的迭代过程中不断探索和围捕猎物,并不断尝试改进自己的解决方案。鲸鱼优化算法能够有效地解决各种复杂的优化问题,并且具有较快的收敛速度。

鲸鱡优化算法自发明以来,已经广泛应用于工业和学术领域,并在近几年受到了越来越多的关注。目前,鲸鱼优化算法已经成为了一种流行的优化算法,并在众多的研究领域中得到了广泛的应用。

14.1.2 鲸鱼优化算法的工作原理

鲸鱼优化算法是一种基于鲸鱼行为的模拟算法,用于解决优化问题。他通过对自然界中座头鲸群体狩猎行为的模拟,通过鲸鱼群体搜索、包围、追捕和攻击猎物等过程实现优时化搜索的目的。鲸鱼优化算法的工作原理如下:

1、初始化:首先,在算法开始时,需要为每个鲸鱼设定一个初始位置,并生成初始种群。

2、搜索:每个鲸鱼都会按照一定的规则探索空间。这个过程可以模拟鲸鱼包围、追捕和攻击猎物等过程。

3、评估:每当鲸鱼移动的时候,都会对当前的鲸鱼种群计算适应度值。如果当前的适应度值优于之前的适应度值,则将当前适应度值设为最优解。

4、更新:当所有的鲸鱼都完成了移动和评估后,算法会更新所有鲸鱼的位置,并重复以上步骤。

5、迭代:鲸鱼优化算法可以进行多次迭代,直到找到最优解为止。

鲸鱼优化算法的优势在于操作简单,调整的参数少以及跳出局部最优的能力强,它能够快速找到最优解,并且对于各种类型的优化问题都能有效地工作。对于基础的问题,它还具有很好的收敛性和稳定性。

简而言之,鲸鱼优化算法是一种通过模拟鲸鱼生物行为的过程来寻找最优解的算法。它具有较高的效率和稳定性,并能应用于各种类型的优化问题。

14.2 鲸鱼优化算法的核心过程

WOA算法首先在可行解空间中初始化一群鲸鱼个体,每个鲸鱼都代表极值优化问题的一个潜在的最优解,用位置表示鲸鱼的特征,适应度值由适应度函数计算得到,适应度的好坏表示鲸鱼的优劣。鲸鱼在解空间中探索,通过模拟包围猎物、狩猎行为、搜索猎物的行为更新个体位置。鲸鱼种群每更新一次位置,就计算一次适应度,并通过比较更新当前的最优适应度值。

假设在一个D维的空间中,由n个鲸鱼组成的种群X=(X1X2,…,Xn),其中第n个鲸鱼表示为一个D维的向量Xn=(xn1xn2,…,XnD)T,代表第n个鲸鱼在D维空间中的位置,也即是表示一个问题的解。根据目标函数计算每个鲸鱼位置对应的适应度。

在迭代过程中,鲸鱼的主要行为包括包围猎物、捕获猎物、搜索猎物,下面将进行详细讲解。

注意:D表示问题中解的变量个数。

14.2.1 包围猎物

鲸鱼在狩猎时要包围猎物,通过包围猎物的方式更新自身的位置,即

(14-1)

(14-2)

其中,t 表示目前的迭代次数,A C 表示系数,X*(t)表示目前适应度最好的鲸鱼位置,X(t)表示目前迭代次数中鲸鱼的位置,A C 由式(14-3)、式(14-4)得出。

(14-3)

(14-4)

(14-5)

其中,r1r2是随机数,范围在(0,1)中,a 的值从 2到 0下降,t表示目前的迭代次数,Tmax为初始设置的最大迭代次数。

14.2.2 捕获猎物

鲸鱼狩猎的时候,采用螺旋运动的方式向猎物游去,即

(14-6)

其中,Dp=|X*(t)- X(t)|表示鲸鱼差距猎物的距离大小,b 是一个常数,表示螺线的形状,l 是随机数,范围属于(-1,1)。鲸鱼在螺旋包围猎物的同时,也要不断收缩包围圈,所以要对选择收缩包围机制和螺旋模型设置概率Pi和1 -Pi来更新鲸鱼的位置,即

(14-7)

通过概率p、参数a和波动范围A的变化,鲸鱼会用不同的方式更新自己的位置,向着更优的位置移动。

14.2.3 搜索猎物

搜索猎物是为了寻找到更优的解,即

(14-8)

(14-9)

其中,Xrand是随机的鲸鱼位置,当A≥1 的时候,随机选择一个鲸鱼个体,更新其他鲸鱼的位置,增加探索的随机性,希望能找到一个更优秀的猎物,通过加强算法的搜索能力从而使 WOA 算法探索全局最优解。

14.3 鲸鱼优化算法的常用参数

14.3.1 设置种群数量

种群数量越多,找到最优解的可能性越大。但同时,过多的种群数量会降低程序的运行速度,因此需要设置合理的种群数量。

14.3.2 设置探索边界

探索边界指的是变量的上下界,探索边界可以帮助鲸鱼在可行空间中寻找最优解。

14.3.3 设置迭代次数

迭代次数越大,求解的目标值越接近实际的函数值。迭代次数同样需要合理地设置,过少的迭代次数,可能会造成算法不能很好地收敛;过大的迭代次数,可能会增加算法程序的运行时间,造成时间维度上的资源浪费。

14.3.4 设置变量维度

变量维度即鲸鱼的位置维度,根据题目的要求设置即可,解的变量的数量多少即设置多少。

14.4 鲸鱼优化算法求解非线性函数的寻优问题

14.4.1问题背景

本次寻优例题的非线性函数为

(14-10)

函数图像如图14.1所示:

图14.1 函数图像

从图形可以看出,该函数有多个局部极小值,在(0,0)附近取极小值,极小值为0。

14.4.2寻优求解思路和步骤

利用鲸鱼优化算法求解极值的算法流程如图14.2所示。

图14.2 鲸鱼优化算法求解极值的算法流程图

其中,初始化种群需要初始化位置和适应度;根据14.2.1节的公式包围猎物;根据14.2.2节的公式捕获猎物;根据14.2.3节的公式搜索猎物。

本实例中,适应度根据函数表达式进行计算,函数值即适应度值。鲸鱼种群数量为20,每个鲸鱼的维数为2,算法的迭代次数为500。

注意:适应度函数代码需要单独存放在f.m的m文件中,其余代码可以存放在main.m的文件中。两个文件同时放置在同一路径之中。

14.4.3使用MATLAB实现问题的求解

根据鲸鱼优化算法的原理,在MATLAB中实现程序的编写。

1.WOA算法的参数设置

设置WOA算法的参数,MATLAB代码如下:

%清空运行环境

clear;

clc;

close all

%设置参数

pop_num=20; % 种群数量

Max_iter=500; % 迭代次数

t=0; % 迭代计数器

iter=1; % 初始迭代次数

dim=2; % 个体的维度

ub=5; % 变量的上界

lb=-5; % 变量的下界

2.种群初始化

随机初始化鲸鱼的位置,并计算鲸鱼的适应度,程序代码如下:

%初始化种群

Leader_pos=zeros(1,dim); % 初始化最优个体的位置

Leader_score=inf; % 使用-inf 求解最小值问题

Boundary_no= size(ub,2); % 设置边界数量

% 如果变量的上下界相同,为其编号,生成位置

if Boundary_no==1

Positions=rand(pop_num,dim).*(ub-lb)+lb;

end

% 如果变量的上下界不相同,生成位置

ifBoundary_no>1

for i=1:dim

ub_i=ub(i);

lb_i=lb(i);

Positions(:,i)=rand(pop_num,1).*(ub_i-lb_i)+lb_i;

end

end

Convergence_curve=zeros(1,Max_iter); % 初始收敛曲线

适应度函数代码如下:

function y = f(x)

%计算适应度

dim=size(x,2); % 获取个体的维度

y=sum(x.^2-10*cos(2*pi.*x))+10*dim; % 获取适应度值

end

3.迭代寻找最优值

根据鲸鱼的行为习惯,更新鲸鱼个体的位置,根据适应度值更新最优的个体和群体适应度值,程序代码如下:

%开始迭代

while t<Max_iter

fori=1:size(Positions,1)

% 返回超出搜索空间边界的鲸鱼个体

Flag4ub=Positions(i,:)>ub;

Flag4lb=Positions(i,:)<lb;

Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;

% 计算每个鲸鱼个体的适应度值

fitness=f(Positions(i,:));

%更新最优的鲸鱼个体

if fitness<Leader_score

Leader_score=fitness;

Leader_pos=Positions(i,:);

end

end

a=2-t*((2)/Max_iter); %在公式(14-5)中,a从2线性下降到0

%a2从-1减至-2

a2=-1+t*((-1)/Max_iter);

% 更新鲸鱼的位置

fori=1:size(Positions,1)

r1=rand(); % r1是[0,1]中的随机数

r2=rand(); % r2是[0,1]中的随机数

A=2*a*r1-a; %对应公式(14-3)

C=2*r2; %对应公式(14-4)

b=1; %公式(14-6)中的参数

l=(a2-1)*rand+1; % 公式(14-6)中的参数

p= rand(); % 公式(14-6)中的参数

for j=1:size(Positions,2)

if p<0.5

if abs(A)>=1

rand_leader_index =floor(pop_num*rand()+1);

X_rand =Positions(rand_leader_index, :);

D_X_rand=abs(C*X_rand(j)-Positions(i,j)); % 对应公式 (14-8)

Positions(i,j)=X_rand(j)-A*D_X_rand; % 对应公式 (14-9)

elseif abs(A)<1

D_Leader=abs(C*Leader_pos(j)-Positions(i,j)); % 对应公式 (14-1)

Positions(i,j)=Leader_pos(j)-A*D_Leader; % 对应公式(14-2)

end

elseif p>=0.5

distance2Leader=abs(Leader_pos(j)-Positions(i,j));

% 对应公式 (14-6)

Positions(i,j)=distance2Leader*exp(b.*l).*cos(l.*2*pi)+Leader_pos(j);

end

end

end

t=t+1;

Convergence_curve(t)=Leader_score;%更新收敛曲线

end

4.分析结果

WOA算法迭代500次,画出最优适应度的变化曲线,程序代码如下:

%画出每一代的最优适应度,即目标值

plot(Convergence_curve);

title('最优目标值','fontsize',12)

xlabel('迭代次数','fontsize',12);

ylabel('目标值','fontsize',12);

最优目标值的变化如图14.3所示。

图14.3 最优目标值迭代图

最终得到的最优目标值为0,对应的鲸鱼个体的位置为(2.7894e-09 -1.5969e-09),WOA算法寻找得到接近函数实际最优值的目标值,表明WOA算法具有较强的寻优搜索能力。

有关鲸鱼优化算法及其实现的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  3. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  6. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  7. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  8. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

  9. ruby - 实现k最近邻需要哪些数据? - 2

    我目前有一个reddit克隆类型的网站。我正在尝试根据我的用户之前喜欢的帖子推荐帖子。看起来K最近邻或k均值是执行此操作的最佳方法。我似乎无法理解如何实际实现它。我看过一些数学公式(例如k表示维基百科页面),但它们对我来说并没有真正意义。有人可以推荐一些伪代码,或者可以查看的地方,以便我更好地了解如何执行此操作吗? 最佳答案 K最近邻(又名KNN)是一种分类算法。基本上,您采用包含N个项目的训练组并对它们进行分类。如何对它们进行分类完全取决于您的数据,以及您认为该数据的重要分类特征是什么。在您的示例中,这可能是帖子类别、谁发布了该项

  10. ruby-on-rails - 使用 Ruby 正确处理 Stripe 错误和异常以实现一次性收费 - 2

    我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)

随机推荐