蒲公英优化算法(DO),原理详解,MATLAB代码免费获取

蒲公英优化算法(Dandelion Optimizer,DO)是一种新的元启发式算法,DO受启发于播种行为的启发,模拟了蒲公英种子依靠风进行远距离飞行的过程,分为三个阶段。在上升阶段,根据不同的天气条件,种子由于上方的漩涡或在群落中局部漂移,以螺旋方式上升。在下降阶段,飞来的种子通过在全球空间中不断调整方向,稳步下降。在着陆阶段,种子在随机选择的位置上着陆,以便它们生长。

37bbf47d43683d3b27dfa201a9ab8811.png

该成果于2022年发表在计算机领域二区SCI期刊“Engineering Applications of Artificial Intelligence”上。DO方法具有出色的迭代优化性能和较强的鲁棒性。

934d17a40157954d9b715cc73586139b.png

1490fe09ace755fec9360988aa91da1b.jpeg

1、算法原理

(1)初始化

与其他受自然启发的元启发式算法类似,DO算法在种群初始化的基础上完成种群进化和迭代优化。在所提出的DO算法中,假设每个蒲公英种子代表一个候选解,其种群表示为

其中,pop表示人口大小,Dim表示变量的维度。每个候选解是在给定问题的上界(LB)和下界(UB)之间随机生成的,并且个体Xi的表达式为

式中,应为1 ~pop之间的整数,rand为0 ~ 1之间的随机数。LB和UB表示为

初始化过程中,DO将适应度值最优的个体作为初始精英,近似认为这是蒲公英种子生长最适宜的位置。以最小值为例,初始精英Xelite的数学表达式为

其中find()表示两个值相等的索引。

(2)上升阶段

在上升阶段,蒲公英的种子需要达到一定的高度才能飘离它们的父母。蒲公英种子在风速、空气湿度等因素的影响下,会上升到不同的高度。在这里,天气分为以下两种情况。

在晴朗的日子里,风速可以被认为具有对数正态分布。在这种分布下,随机数更多地沿着Y轴分布,这增加了蒲公英种子传播到遥远地区的机会。因此,在这种情况下,DO强调探索。在搜索空间中,蒲公英种子被风随机地吹到不同的位置。蒲公英种子的上升高度由风速决定。风越强,蒲公英飞得越高,种子撒得越远。受风速的影响,蒲公英种子上方的漩涡不断调整,使它们以螺旋形式上升。在这种情况下对应的数学表达式是

其中Xt表示蒲公英种子在迭代过程中的位置t。Xs表示迭代过程中在搜索空间中随机选择的位置s。下式给出了随机生成位置的表达式。

LnY表示服从对数正态分布,其数学公式为

其中,y表示标准正态分布N(0,1)。a是用于调整搜索步长的自适应参数,数学表达式为

下图显示了随迭代次数的动态变化。由图可知,在趋于0的非线性减小过程中,在[0,1]之间的随机扰动。这种波动使得算法在前期注重全局搜索,后期转向局部搜索,有利于保证在全全局搜索后的精确收敛。Vx和Vy分别表示蒲公英在分离涡流作用下的升力分量系数。利用下式计算变尺度上的力。

其中θ是一个随机数在[−Π Π]之间.

在雨天,蒲公英种子受空气阻力、湿度等因素影响,不能随风适当上升。在这种情况下,蒲公英种子在其局部邻域被开发,相应的数学表达式为

其中,k用于调节蒲公英的局部搜索域,使用下式计算该域。

k的动态波形如图所示。显然,k呈现“向下凸”的振荡,有利于算法的局部开发,前期步幅大,后期布长小。迭代结束时,参数k逐渐趋近于1,保证种群最终收敛到最优搜索代理。

综上所述,蒲公英种子上升期的数学表达式为

其中rand()为服从标准正态分布的随机数。

下图显示了蒲公英种子在不同天气条件下的飞行行为。蒲公英种子再生的大致位置如图所示。首先,当天气晴朗时,根据随机选择的位置信息更新蒲公英种子,以强调探索过程。种子上方的涡流作用于运动矢量,通过相乘的分式来修正蒲公英螺旋运动的方向。在第二种情况下,蒲公英种子在当地社区的各个方向被利用。利用随机数的正态分布来动态控制开采和勘探。为了使算法更加面向全局搜索,截断点设置为1.5。这种设置使得蒲公英种子在第一阶段尽可能遍历整个搜索空间,为下一阶段的迭代优化提供正确的方向。

fe597dbb3d532a2a2cf0cafbddd9fc4d.png

(3)下降阶段

在这一阶段,提出的DO算法也强调探索。蒲公英的种子上升到一定距离后,会稳步下降。在DO中,布朗运动用于模拟蒲公英的运动轨迹。在迭代更新过程中,由于布朗运动服从正态分布,个体很容易遍历更多的搜索社区。为了反映蒲公英下降的稳定性,采用上升阶段后的平均位置信息。这有助于整个人口向有前途的社区发展。对应的数学表达式为

其中,βt为布朗运动,并且为标准正态分布中的随机数,Xmean_t表示th迭代中总体的平均位置,其数学表达式为

下图为蒲公英种子在下降过程中的再生过程。由图可知,种群的平均位置信息对于个体的迭代更新至关重要,它直接决定了个体的进化方向。图中还给出了基于全局搜索的布朗运动轨迹。这种不规则的运动使得搜索对象在迭代更新过程中以高概率逃离局部极值,进而推动种群向全局最优附近的区域寻找。

451842b82b45ff0e402bf2410320e41e.png

(4)着陆级

在这一部分中,重点研究了DO算法的开发。在前两个阶段的基础上,蒲公英种子随机选择降落的地方。随着迭代的逐步进行,算法有望收敛到全局最优解。因此,得到的最优解是蒲公英种子最容易存活的近似位置。为了精确地收敛到全局最优,搜索代理借用当前精英的杰出信息在其本地社区中进行开发。随着种群的进化,最终会找到全局最优解。这种行为如式所示。

其中Xelite表示蒲公英种子在ith迭代中的最优位置。 表示Levy飞行的函数,使用式

在式中,β为[0,2]之间的随机数(时延为1.5)。s是一个固定的常数0.01。w和t是介于[0,1]之间的随机数。其数学表达式为

其中,β为1.5。δ是[0,2]之间的线性递增函数,由下式计算。

图显示了搜索代理在最终阶段逐步更新到全局最优解的过程。为了精确收敛到全局最优,对个体应用线性递增函数以避免过度开发。在这一阶段,采用Levy飞行系数来模拟个体的运动步长。原因是在高斯分布下,智能体可以利用Levy飞行系数以大概率跨步到其他位置,从而在有限的迭代次数下开发出更多的局部搜索域。

e6e980172587acf875b8d0330246aef2.png

DO对应的伪代码过程如下图所示

d4a4b7410efd8951ef77b9b6d01c52eb.png

2、结果展示

e9fbfcf9c087680794d23f4b5b4b65f5.png

707a7342ace691da3337bf9e43a4449b.png

11dc86b0496e0aac0b4ec6b1e3205f39.png

e0b69c601a5cdd42dfe2ee30d7c05959.png

3、MATLAB核心代码

%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 蒲公英优化算法(Dandelion Optimizer,DO)
function [Best_fitness,Best_position,Convergence_curve]=DO(Popsize,Maxiteration,LB,UB,Dim,Fobj)
tic;

dandelions=initialization(Popsize,Dim,UB,LB);
dandelionsFitness = zeros(1,Popsize);
Convergence_curve=zeros(1,Maxiteration);
for i=1:Popsize
    dandelionsFitness(1,i)=Fobj(dandelions(i,:));
end
% Calculate the fitness values of initial dandelions.
[~,sorted_indexes]=sort(dandelionsFitness);
Best_position=dandelions(sorted_indexes(1),:);
Best_fitness = dandelionsFitness(sorted_indexes(1));
Convergence_curve(1)=Best_fitness;
t=2;
while t<Maxiteration+1
    %% Rising stage
    beta=randn(Popsize,Dim);
    alpha=rand()*((1/Maxiteration^2)*t^2-2/Maxiteration*t+1); % eq.(8) in this paper
    a=1/(Maxiteration^2-2*Maxiteration+1);% Note: U can use positive or negative on 1 for solving ur problem.  
    b=-2*a;
    c=1-a-b;
    k=1-rand()*(c+a*t^2+b*t); % eq.(11) in this paper
    if randn()<1.5
        for i=1:Popsize
            lamb=abs(randn(1,Dim));
            theta=(2*rand()-1)*pi;
            row=1/exp(theta);
            vx=row*cos(theta);
            vy=row*sin(theta);
dandelions_1(i,:)=dandelions(i,:)+alpha.*vx.*vy.*lognpdf(lamb,0,1).*(NEW(1,:)-dandelions(i,:)); % eq.(5) in this paper
        end
    else
        for i=1:Popsize
            dandelions_1(i,:)=dandelions(i,:).*k; % eq.(10) in this paper
        end
    end
    dandelions=dandelions_1;
    % Check boundries
    dandelions = max(dandelions,LB);
    dandelions = min(dandelions,UB);
    %% Decline stage
    dandelions_mean=sum(dandelions,1)/Popsize; % eq.(14) in this paper
    for i=1:Popsize
        for j=1:Dim
dandelions_2(i,j)=dandelions(i,j)-beta(i,j)*alpha*(dandelions_mean(1,j)-beta(i,j)*alpha*dandelions(i,j)); % eq.(13) in this paper
        end
    end
    dandelions=dandelions_2;
    % Check boundries
    dandelions = max(dandelions,LB);
    dandelions = min(dandelions,UB);
    
    %% Landing stage
    Step_length=levy(Popsize,Dim,1.5);
    Elite=repmat(Best_position,Popsize,1);
    for i=1:Popsize
        for j=1:Dim
dandelions_3(i,j)=Elite(i,j)+Step_length(i,j)*alpha*(Elite(i,j)-dandelions(i,j)*(2*t/Maxiteration)); % eq.(15) in this paper
        end
    end
    dandelions=dandelions_3;
    % Check boundries
    dandelions = max(dandelions,LB);
    dandelions = min(dandelions,UB);
    %%
    % Calculated all dandelion seeds' fitness values
    for i=1:Popsize
        dandelionsFitness(1,i)=Fobj(dandelions(i,:));
    end
    % Arrange dandelion seeds from good to bad according to fitness values
    [~,sorted_indexes]=sort(dandelionsFitness);
    dandelions=dandelions(sorted_indexes(1:Popsize),:);
    SortfitbestN = dandelionsFitness(sorted_indexes(1:Popsize));
    
    %Update the optimal dandelion seed
    if SortfitbestN(1)<Best_fitness
        Best_position=dandelions(1,:);
        Best_fitness=SortfitbestN(1);
    end
    Convergence_curve(t)=Best_fitness;
    t = t + 1;
end
time = toc;
end
% ___________________________________
function [z] = levy(n,m,beta)
% beta is set to 1.5 in this paper
num = gamma(1+beta)*sin(pi*beta/2);
den = gamma((1+beta)/2)*beta*2^((beta-1)/2);
sigma_u = (num/den)^(1/beta);
u = random('Normal',0,sigma_u,n,m);
v = random('Normal',0,1,n,m);
z =u./(abs(v).^(1/beta));
end
%微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work
%代码清单:https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu

参考文献

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

完整代码获取

后台回复关键词:

TGDM835

获取更多代码:

860b847a5af693338bc1115c0abdac42.png

或者复制链接跳转:
https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu
  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天吃饺子

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值