基于蒲公英优化算法的函数寻优算法

2023-12-14 09:40

本文主要是介绍基于蒲公英优化算法的函数寻优算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、理论基础
    • 1、蒲公英优化算法
      • (1)初始化
      • (2)上升阶段
      • (3)下降阶段
      • (4)着陆阶段
    • 2、DO算法的执行流程
  • 二、仿真实验与结果分析
  • 三、参考文献

一、理论基础

1、蒲公英优化算法

文献[1]模拟蒲公英种子依靠风的长距离飞行过程提出了一种新的群体智能仿生优化算法,称为蒲公英优化(Dandelion Optimizer, DO)算法,用于解决连续优化问题。

(1)初始化

与其他自然启发元启发式算法相似,DO在种群初始化的基础上进行种群进化和迭代优化。在提出的DO算法中,假设每个蒲公英种子代表一个候选解,其种群表示为: p o p u l a t i o n = [ x 1 1 ⋯ x 1 D i m ⋮ ⋱ ⋮ x p o p 1 ⋯ x p o p D i m ] (1) population=\begin{bmatrix} x_1^1 & \cdots & x_1^{Dim} \\[2ex]\vdots & \ddots & \vdots\\[2ex]x_{pop}^1 & \cdots & x_{pop}^{Dim}\end{bmatrix}\tag{1} population=x11xpop1x1DimxpopDim(1)其中, p o p pop pop表示种群数量, D i m Dim Dim表示问题变量的维数。每个候选解在给定问题的上界( U B UB UB)和下界( L B LB LB)之间随机生成,第 i i i个个体 X i X_i Xi的表达式为: X i = r a n d × ( U B − L B ) + L B (2) X_i=rand\times(UB-LB)+LB\tag{2} Xi=rand×(UBLB)+LB(2)其中, r a n d rand rand表示0和1之间的随机数, L B LB LB U B UB UB如下所示: L B = [ l b 1 , ⋯ , l b D i m ] U B = [ u b 1 , ⋯ , u b D i m ] (3) \begin{array}{c}LB=[lb_1,\cdots,lb_{Dim}]\\[2ex]UB=[ub_1,\cdots,ub_{Dim}]\end{array}\tag{3} LB=[lb1,,lbDim]UB=[ub1,,ubDim](3)在初始化过程中,DO将适应度值最优的个体作为初始精英,认为这是蒲公英种子最适合生长的位置。以最小值为例,初始精英个体 X e l i t e X_{elite} Xelite的数学表达式为: f b e s t = min ⁡ ( f ( X i ) ) X e l i t e = X ( f i n d ( f b e s t = f ( X i ) ) ) (4) \begin{array}{c}f_{best}=\min(f(X_i))\\[2ex]X_{elite}=X(find(f_{best}=f(X_i)))\end{array}\tag{4} fbest=min(f(Xi))Xelite=X(find(fbest=f(Xi)))(4)其中, f i n d ( ) find() find()表示具有相等值的两个索引。

(2)上升阶段

在上升阶段,蒲公英的种子需要达到一定的高度才能离开父母。在风速、空气湿度等影响下,蒲公英种子会上升到不同高度。在这里,天气分为以下两种情况:
第一种情况:在晴天,风速可被视为具有对数正态分布 ln ⁡ Y ∼ N ( μ , σ 2 ) \ln Y\sim N(\mu,\sigma^2) lnYN(μ,σ2)。在这种分布下,随机数沿 Y Y Y轴分布更为均匀,这增加了蒲公英种子传播到遥远地区的机会。因此,DO在该情况下中强调探索。在搜索空间中,蒲公英种子被风随机吹到各个位置。蒲公英种子的上升高度由风速决定。风越大,蒲公英飞得越高,种子撒得越远。受风速的影响,蒲公英种子上方的漩涡不断被调整,使其呈螺旋状上升。在这种情况下对应的数学表达式为: X t + 1 = X t + α ∗ v x ∗ v y ∗ ln ⁡ Y ∗ ( X s − X t ) (5) X_{t+1}=X_t+\alpha*v_x*v_y*\ln Y*(X_s-X_t)\tag{5} Xt+1=Xt+αvxvylnY(XsXt)(5)其中, X t X_t Xt表示第 t t t次迭代时蒲公英种子的位置, X s X_s Xs表示第 t t t次迭代时搜索空间中随机选择的位置,式(6)给出了随机生成位置的表达式。 X s = r a n d ( 1 , D i m ) ∗ ( U B − L B ) + L B (6) X_s=rand(1,Dim)*(UB-LB)+LB\tag{6} Xs=rand(1,Dim)(UBLB)+LB(6) ln ⁡ Y \ln Y lnY表示服从 μ = 0 \mu=0 μ=0 σ 2 = 1 \sigma^2=1 σ2=1的对数正态分布,其数学表达式为: ln ⁡ Y = { 1 y 2 π exp ⁡ [ − 1 2 σ 2 ( ln ⁡ y ) 2 ] y ≥ 0 0 y < 0 (7) \ln Y=\begin{dcases}\frac{1}{y\sqrt{2\pi}}\exp\left[-\frac{1}{2\sigma^2}(\ln y)^2\right]\quad y\geq0\\[2ex]0\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\,\,\, y<0\end{dcases}\tag{7} lnY=y2π 1exp[2σ21(lny)2]y00y<0(7)在式(7)中, y y y表示标准正态分布 N ( 0 , 1 ) N(0,1) N(0,1) α \alpha α是用于调整搜索步长的自适应参数,数学表达式为: α = r a n d ( ) ∗ ( 1 T 2 t 2 − 2 T t + 1 ) (8) \alpha=rand()*\left(\frac{1}{T^2}t^2-\frac{2}{T}t+1\right)\tag{8} α=rand()(T21t2T2t+1)(8)在这里插入图片描述

图1 α \alpha α的动态变化

图1将 α \alpha α随迭代次数的动态变化可视化。根据图1所示, α \alpha α是在接近0的非线性减小过程中 [ 0 , 1 ] [0,1] [0,1]之间的随机扰动。这种波动使得算法在早期阶段更加关注全局搜索,在后期阶段转向局部搜索,这有利于确保在全局搜索之后的精确收敛。 v x v_x vx v y v_y vy表示蒲公英由于分离涡流作用而产生的升力系数,式(9)用于计算可变维度上的力。 r = 1 e θ v x = r ∗ cos ⁡ θ v y = r ∗ sin ⁡ θ (9) \begin{array}{c}\displaystyle{r=\frac{1}{e^\theta}}\\[2ex]v_x=r*\cos\theta\\[2ex]v_y=r*\sin\theta\end{array}\tag{9} r=eθ1vx=rcosθvy=rsinθ(9)其中, θ \theta θ [ − π , π ] [-\pi,\pi] [π,π]的随机数。
第二种情况:在下雨天时,由于空气阻力、湿度等因素,蒲公英种子不能随风上升。在这种情况下,蒲公英种子是在局部邻域开发的,对应的数学表达式为: X t + 1 = X t ∗ k (10) X_{t+1}=X_t*k\tag{10} Xt+1=Xtk(10)其中, k k k用于调节蒲公英的局部搜索域,利用式(11)计算。 q = 1 T 2 − 2 T + 1 t 2 − 2 T 2 − 2 T + 1 t + 1 + 1 T 2 − 2 T + 1 k = 1 − r a n d ( ) ∗ q (11) \begin{array}{c}\displaystyle{q=\frac{1}{T^2-2T+1}t^2-\frac{2}{T^2-2T+1}t+1+\frac{1}{T^2-2T+1}}\\[2ex]k=1-rand()*q\end{array}\tag{11} q=T22T+11t2T22T+12t+1+T22T+11k=1rand()q(11)在这里插入图片描述

图2 k k k的动态趋势

图2显示了 k k k的动态波形。显然, k k k表现出“向下凸”振荡,这有利于算法在早期阶段长步长的全局探索和后期阶段短步长的算法的局部开发。在迭代结束时,参数 k k k逐渐接近1,以确保种群最终收敛到最优搜索个体。
综上所述,蒲公英种子上升阶段的数学表达式为: X t + 1 = { X t + α ∗ v x ∗ v y ∗ ln ⁡ Y ∗ ( X s − X t ) r a n d n < 1.5 X t ∗ k e l s e (12) X_{t+1}=\begin{dcases}X_t+\alpha*v_x*v_y*\ln Y*(X_s-X_t)\quad randn<1.5\\[2ex]X_t*k\quad\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad else\end{dcases}\tag{12} Xt+1=Xt+αvxvylnY(XsXt)randn<1.5Xtkelse(12)其中, r a n d n ( ) randn() randn()是服从标准正态分布的随机数。

(3)下降阶段

在该阶段,提出的DO算法也强调探索。蒲公英种子在上升到一定距离后逐渐下降。DO中采用布朗运动来模拟蒲公英的运动轨迹。由于布朗运动在每次变化时服从正态分布,使得个体在迭代更新过程中容易遍历更多的搜索区域。为了反映蒲公英下降的稳定性,采用上升阶段后的平均位置信息,这有利于整个种群向有希望的区域发展。对应的数学表达式为: X t + 1 = X t − α ∗ β t ∗ ( X m e a n _ t − α ∗ β t ∗ X t ) (13) X_{t+1}=X_t-\alpha*\beta_t*(X_{mean\_t}-\alpha*\beta_t*X_t)\tag{13} Xt+1=Xtαβt(Xmean_tαβtXt)(13)其中, β t \beta_t βt表示服从正态分布的布朗运动随机数, X m e a n _ t X_{mean\_t} Xmean_t表示第 t t t次迭代时种群的平均位置,表达式如下: X m e a n _ t = 1 p o p ∑ i = 1 p o p X i (14) X_{mean\_t}=\frac{1}{pop}\sum_{i=1}^{pop}X_i\tag{14} Xmean_t=pop1i=1popXi(14)

(4)着陆阶段

在这一部分中,DO算法的重点是开发。在前两个阶段的基础上,蒲公英种子随机选择降落地点。随着迭代的逐步进行,该算法有望收敛到全局最优解。因此,得到的最优解是蒲公英种子最容易存活的近似位置。为了精确地收敛到全局最优,搜索代理利用当前精英的信息,在他们的局部邻域中加以利用。随着种群的进化,最终可以找到全局最优解。对应的数学表达式如下: X t + 1 = X e l i t e + L e v y ( λ ) ∗ α ∗ ( X e l i t e − X t ∗ δ ) (15) X_{t+1}=X_{elite}+Levy(\lambda)*\alpha*(X_{elite}-X_t*\delta)\tag{15} Xt+1=Xelite+Levy(λ)α(XeliteXtδ)(15)其中, X e l i t e X_{elite} Xelite表示第 t t t次迭代蒲公英种子的最优位置, L e v y ( λ ) Levy(\lambda) Levy(λ)为使用式(16)计算的莱维飞行函数。 L e v y ( λ ) = s × w × σ ∣ t ∣ 1 β (16) Levy(\lambda)=s\times\frac{w\times\sigma}{|t|^{\frac{1}{\beta}}}\tag{16} Levy(λ)=s×tβ1w×σ(16)其中, β \beta β [ 0 , 2 ] [0,2] [0,2]的随机数(本文取值为1.5), s s s是值为0.01的常数, w w w t t t均为 [ 0 , 1 ] [0,1] [0,1]间的随机数。 σ \sigma σ的数学表达式如下: σ = ( Γ ( 1 + β ) × sin ⁡ ( π β 2 ) Γ ( 1 + β 2 ) × β × 2 β − 1 2 ) 1 / β (17) \sigma=\left(\frac{\Gamma(1+\beta)\times\sin\left(\frac{\pi\beta}{2}\right)}{\Gamma\left(\frac{1+\beta}{2}\right)\times\beta\times2^{\frac{\beta-1}{2}}}\right)^{1/\beta}\tag{17} σ=Γ(21+β)×β×22β1Γ(1+β)×sin(2πβ)1/β(17) δ \delta δ [ 0 , 2 ] [0,2] [0,2]之间的线性递增函数,由式(18)计算。 δ = 2 t T (18) \delta=\frac{2t}{T}\tag{18} δ=T2t(18)

2、DO算法的执行流程

图3详细介绍了所提出的DO算法的伪代码。
在这里插入图片描述

图3 DO算法伪代码

二、仿真实验与结果分析

将DO与SCA、WOA、MSA、HHO、ChOA、LFD和AO进行对比,以文献[1]中表1的CEC2017测试函数中的F1、F7、F10、F12、F15、F20、F22、F27、F29(均为100维)为例,实验设置种群规模为60,最大迭代次数为1000,每种算法独立运算1次,结果显示如下:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

函数:F1
DO:最优值: 19262026.7925
SCA:最优值: 180264829590.4785
WOA:最优值: 33434687957.6166
MSA:最优值: 44139380.5715
HHO:最优值: 239831305568.1186
ChOA:最优值: 163190736645.5512
LFD:最优值: 11451124698.8789
AO:最优值: 219529495597.1949
函数:F7
DO:最优值: 2692.7047
SCA:最优值: 4077.4433
WOA:最优值: 3320.2794
MSA:最优值: 3144.6896
HHO:最优值: 3609.0676
ChOA:最优值: 3566.1324
LFD:最优值: 3165.6704
AO:最优值: 3894.5837
函数:F10
DO:最优值: 17945.7965
SCA:最优值: 32078.0625
WOA:最优值: 27380.6281
MSA:最优值: 20540.8192
HHO:最优值: 29445.7762
ChOA:最优值: 32875.5792
LFD:最优值: 28053.6615
AO:最优值: 28306.884
函数:F12
DO:最优值: 234840575.4431
SCA:最优值: 77170391704.8942
WOA:最优值: 4675795339.4043
MSA:最优值: 327709094.9033
HHO:最优值: 137558155924.6333
ChOA:最优值: 95693777394.4027
LFD:最优值: 1635684388.095
AO:最优值: 146090422790.8117
函数:F15
DO:最优值: 21096.9149
SCA:最优值: 4096041438.6636
WOA:最优值: 12604715.5035
MSA:最优值: 164323.2623
HHO:最优值: 15908267021.9471
ChOA:最优值: 12179594962.1346
LFD:最优值: 55014.3099
AO:最优值: 21065137079.1419
函数:F20
DO:最优值: 5365.4403
SCA:最优值: 7950.7499
WOA:最优值: 7426.1413
MSA:最优值: 5819.5207
HHO:最优值: 6703.9059
ChOA:最优值: 8417.0223
LFD:最优值: 7125.6988
AO:最优值: 7820.4613
函数:F22
DO:最优值: 21927.5193
SCA:最优值: 34368.0613
WOA:最优值: 27212.8616
MSA:最优值: 23073.6819
HHO:最优值: 30794.0726
ChOA:最优值: 34825.0492
LFD:最优值: 25985.6373
AO:最优值: 32088.292
函数:F27
DO:最优值: 3810.8168
SCA:最优值: 7438.483
WOA:最优值: 4499.5888
MSA:最优值: 4852.7852
HHO:最优值: 12291.1722
ChOA:最优值: 6984.1297
LFD:最优值: 9350.2706
AO:最优值: 8927.1797
函数:F29
DO:最优值: 7089.3285
SCA:最优值: 17231.9778
WOA:最优值: 19473.5493
MSA:最优值: 9369.5667
HHO:最优值: 226686.5125
ChOA:最优值: 47326.7475
LFD:最优值: 11301.7902
AO:最优值: 110937.2222

实验结果表明:与已有的优化算法相比,DO算法具有出色的迭代优化性能和较强的鲁棒性。

三、参考文献

[1] Shijie Zhao, Tianran Zhang, Shilin Ma, et al. Dandelion Optimizer: A nature-inspired metaheuristic algorithm for engineering applications[J]. Engineering Applications of Artificial Intelligence, 2022, 114: 105075.

这篇关于基于蒲公英优化算法的函数寻优算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO