白鹭群优化算法,原理详解,MATLAB代码免费获取

2024-05-25 16:44

本文主要是介绍白鹭群优化算法,原理详解,MATLAB代码免费获取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

白鹭群优化算法(Egret Swarm Optimization Algorithm,ESOA)是一种受自然启发的群智能优化算法。该算法从白鹭和白鹭的捕食行为出发,由三个主要部分组成:坐等策略、主动策略和判别条件。将ESOA算法与粒子群算法(PSO)、遗传算法(GA)、差分进化算法(DE)、等算法在36个基准函数和3个工程问题上的性能进行了比较。结果证明了该方法的有效性和鲁棒性。

abe9ca934043c3686efc758ff71f3d57.png

该成果于2022年发表在计算机领域三区期刊Biomimetics上,目前在谷歌学术上被引率39次。

a452786683336efd83dd40aba63759a9.png

大多数白鹭栖息在沿海岛屿、海岸、河口和河流,以及靠近海岸的湖泊、池塘、溪流、稻田和沼泽。白鹭通常是成对的,或者是成群的。由于飞行时能量消耗很大,决定捕食通常需要彻底检查飞行轨迹,以确保通过食物的位置获得的能量比飞行中消耗的能量要多。总体而言,采用积极搜索策略的大白鹭会平衡高能量消耗以获得更大的潜在回报,而采用坐等策略的雪白鹭则会平衡低能量消耗以获得更小但更可靠的利润。

1、算法原理

(1)数学模型与算法

ESOA受白鹭的守株待兔策略和大白鹭的攻击策略的启发,结合了这两种策略的优点,构建了相应的数学模型来量化行为。如图所示,ESOA是一个并行算法,有三个基本组成部分:坐等策略,积极策略和判别条件。一个白鹭小队中有三只白鹭,白鹭A采用引导前进机制,白鹭B和白鹭C分别采用随机行走和包围机制。每一部分的细节如下。

c60d84e8ccf5c87fe6a9727a20c4cfb6.jpeg

Egret Squad的各个角色和搜索首选项如图所示。白鹭A将估计下降平面并基于平面参数的梯度进行搜索,白鹭B执行全局随机漫游,白鹭C基于更好的白鹭的位置选择性地进行探索。通过这种方式,ESOA在开发和勘探方面将更加平衡,并能够快速搜索可行的解决方案。与梯度下降不同,ESOA在梯度估计中引用了历史信息和随机性,这意味着它不太可能落入优化问题的鞍点。ESOA也不同于其他的元启发式算法,通过估计优化问题的切平面,使快速下降到当前的最优点。

73e01b1a088a3d5986675413cda4fb6f.png

(2)坐等策略

观测方程:假设第i个白鹭小队的位置为Xi ∈ Rn,n为问题的维数,A(n)为白鹭对当前位置可能存在的猎物的估计方法。是对当前位置猎物的估计,

则估计方法可以被参数化为,

其中wi ∈ Rn是估计方法的权重。误差ei可以描述为,

同时,ω i的实际梯度ω gi ∈ Rn可以通过对误差方程(3)的wi进行偏导数来恢复,其方向为d ω i。

下图展示了白鹭的跟随行为,其中白鹭在捕食过程中参考了更好的白鹭,借鉴了它们估计猎物行为的经验并融入了自己的想法。dh,i ∈ Rn是小队最佳位置的方向修正,而dg,i ∈ Rn是所有小队最佳位置的方向修正。

3ad63a2dceaa633ed27a7892aad1bcc4.png

积分梯度gi ∈ Rn可以表示如下,并且rh ∈ [0,0.5),rg ∈ [0,0.5):

这里应用自适应权重更新方法[76],β1为0.9,β2为0.99:

根据白鹭A对当前情况的判断,下一个采样位置xa,i可以描述为,

其中t和tmax是当前迭代时间和最大迭代时间,而hop是解空间的下界和上界之间的差距。stepa ∈(0,1]是白鹭A的步长因子。ya,i是xa,i的适合度。

(3)积极的战略

白鹭B倾向于随机搜索猎物,其行为可描述如下,

其中rb,i是(− π/2,π/2)中的随机数,xb,i是白鹭B的预期下一个位置,yb,i是适应度。

白鹭C喜欢攻击性地追逐猎物,因此使用包围机制作为其位置的更新方法:

(4)判别条件

在白鹭小队的每个成员都决定了自己的计划后,小队会选择最佳方案并一起采取行动。xs,i是第i个白鹭小队的解矩阵:

29695d6a1480f94be1b97e3a4e2776ce.png

如果最小值ys,i优于当前适应度yi,则白鹭队接受该选择。或者随机数r∈(0,1)小于0.3,这意味着有30%的可能性接受更差的方案。

ESOA对应的算法的伪代码如下所示。

bb977bd812c0a14b55380f1a24a73644.png

2、结果展示

20093d1982a7b239205277a12036e34a.png

da91a4a8f51b37c484167fd57b5b5ecf.png

87b35e8d8606dfcae8cbba7ab6bddfc9.png

3、MATLAB核心代码

%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [y_global_best, x_global_best, Convergence_curve]=ESOA(SearchAgents_no, Max_iter, lb, ub, dim, fobj)
func = fobj;
beta1 = 0.9;
beta2 = 0.99;
x=initialization(SearchAgents_no, dim, ub, lb);
Convergence_curve=zeros(1,Max_iter);
w = random('Uniform', -1, 1, SearchAgents_no, dim);
%g = random('Uniform', -1, 1, SearchAgents_no, dim);
m = zeros(SearchAgents_no, dim);
v = zeros(SearchAgents_no, dim);
y = zeros(SearchAgents_no,1);
for i=1:SearchAgents_noy(i) = func(x(i,:));
end
p_y = y;
x_hist_best = x;
g_hist_best = x;
y_hist_best = ones(SearchAgents_no)*inf;
x_global_best = x(1, :);
g_global_best = zeros(1, dim);
y_global_best = func(x_global_best);
hop = ub - lb;
l=0;% Loop counter
% Main loop
while l<Max_iterfor i=1:SearchAgents_nop_y(i) = sum(w(i, :) .* x(i, :));p = p_y(i) - y(i);g_temp = p.*x(i, :);% Indivual Directionp_d = x_hist_best(i, :) - x(i, :);f_p_bias = y_hist_best(i) - y(i);p_d = p_d .* f_p_bias;p_d = p_d ./ ((sum(p_d)+eps).*(sum(p_d)+eps));d_p = p_d + g_hist_best(i, :);% Group Directionc_d = x_global_best - x(i, :);f_c_bias = y_global_best - y(i);c_d = c_d .* f_c_bias;c_d = c_d ./ ((sum(c_d)+eps).*(sum(c_d)+eps));d_g = c_d + g_global_best;% Gradient Estimationr1 = rand(1, dim);r2 = rand(1, dim);g = (1 - r1 - r2).*g_temp + r1 .* d_p + r2 .* d_g;g = g ./ (sum(g) + eps);m(i,:) = beta1.*m(i,:)+(1-beta1).*g;v(i,:) = beta2*v(i,:)+(1-beta2)*g.^2;w(i,:) = w(i,:) - m(i,:)/(sqrt(v(i,:))+eps);% Advice Forwardx_o = x(i, :) + exp(-l/(0.1*Max_iter)) * 0.1 .* hop .* g;Flag4ub=x_o>ub;Flag4lb=x_o<lb;x_o = (x_o.*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;y_o = func(x_o);% Random Searchr = random('Uniform', -pi/2, pi/2, 1, dim);x_n = x(i, :) + tan(r) .* hop/(1 + l) * 0.5;Flag4ub=x_n>ub;Flag4lb=x_n<lb;x_n = (x_n.*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;y_n = func(x_n);% Encircling Mechanismd = x_hist_best(i, :) - x(i, :);d_g = x_global_best - x(i, :);r1 = rand(1, dim);r2 = rand(1, dim);x_m = (1-r1-r2).*x(i, :) + r1.*d + r2.*d_g;Flag4ub=x_m>ub;Flag4lb=x_m<lb;x_m = (x_m.*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;y_m = func(x_m);% Discriminant Conditionx_summary = [x_m; x_n; x_o];y_summary = [y_m, y_n, y_o];y_summary(isnan(y_summary)) = inf;ind = y_summary==min(y_summary);y_i = min(y_summary);x_i = x_summary(ind, :);x_i = x_i(1, :);if y_i < y(i)y(i) = y_i;x(i, :) = x_i;if y_i < y_hist_best(i)y_hist_best(i) = y_i;x_hist_best(i, :) = x_i;g_hist_best(i, :) = g_temp;if y_i < y_global_besty_global_best = y_i;x_global_best = x_i;g_global_best = g_temp;endendelseif rand()<0.3y(i) = y_i;x(i, :) = x_i;endendend    
l=l+1;    
fprintf("%d, %f\n", l, y_global_best)
Convergence_curve(l) = y_global_best;
end
end

参考文献

[1]Chen Z, Francis A, Li S, et al. Egret swarm optimization algorithm: an evolutionary computation approach for model free optimization[J]. Biomimetics, 2022, 7(4): 144.

完整代码获取

后台回复关键词:

TGDM833

这篇关于白鹭群优化算法,原理详解,MATLAB代码免费获取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002063

相关文章

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

Linux权限管理与ACL访问控制详解

《Linux权限管理与ACL访问控制详解》Linux权限管理涵盖基本rwx权限(通过chmod设置)、特殊权限(SUID/SGID/StickyBit)及ACL精细授权,由umask决定默认权限,需合... 目录一、基本权限概述1. 基本权限与数字对应关系二、权限管理命令(chmod)1. 字符模式语法2.

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我