精华内容
下载资源
问答
  • 改进的粒子群算法(PSO)算法Python代码——随机惯性权重
    2022-05-10 14:36:21

    前两篇链接:

    1. 使用基础粒子群(PSO)算法求解一元及二元方程的Python代码
    2. 改进的粒子群算法(PSO)算法Python代码——线性/非线性递减惯性权重

    基本的速度更新公式为:

    v i d = w v i d − 1 + c 1 r 1 ( p b e s t i d − x i d ) + c 2 r 2 ( g b e s t d − x i d ) v_i^d=wv_i^{d-1}+c_1r_1(pbest_i^d-x_i^d)+c_2r_2(gbest^d-x_i^d) vid=wvid1+c1r1(pbestidxid)+c2r2(gbestdxid)
    其中,下标 i i i表示第i个粒子,上标 d d d表示第d次循环, v i d v_i^d vid表示第i个粒子第d次循环的速度, w w w为惯性权重, c 1 , c 2 c_1,c_2 c1,c2分别表示个体学习因子和社会学习因子,一般取2, p b e s t i d pbest_i^d pbestid表示第i个粒子在前d-1次循环中出现的最佳位置, g b e s t d gbest^d gbestd表示所有粒子在前d-1次循环中出现的最佳位置, r 1 , r 2 r_1,r_2 r1,r2分别是两个位于 [ 0 , 1 ] [0,1] [0,1]的随机数。

    随机惯性权重公式1

    1. 题目
      求函数 y = x 1 2 + x 2 2 − x 1 x 2 − 10 x 1 − 4 x 2 + 60 y =x_1^2+x_2^2-x_1x_2-10x_1-4x_2+60 y=x12+x22x1x210x14x2+60 x 1 , x 2 ∈ [ − 15 , 15 ] x_1,x_2∈[-15,15] x1,x2[15,15]内的最小值。
    2. 流程图
      在这里插入图片描述
    3. 数学公式:
      v i d = r 0 v i d − 1 + c 1 r 1 ( p b e s t i d − x i d ) + c 2 r 2 ( g b e s t d − x i d ) v_i^d=r_0v_i^{d-1}+c_1r_1(pbest_i^d-x_i^d)+c_2r_2(gbest^d-x_i^d) vid=r0vid1+c1r1(pbestidxid)+c2r2(gbestdxid)
      其中 r 0 r_0 r0是一个均匀分布在 [ 0 , 1 ] [0,1] [0,1]上的随机数,其他参数含义与上面相同。
    4. Python代码:
    # 第一步,绘制函数图像
    import numpy as np
    import matplotlib.pyplot as plt
    import mpl_toolkits.mplot3d
    
    def func(x,y):
        return x**2+y**2-x*y-10*x-4*y+60
    
    x0 = np.linspace(-15,15,100)
    y0 = np.linspace(-15,15,100)
    x0,y0 = np.meshgrid(x0,y0)
    z0 = func(x0,y0)
    fig = plt.figure(constrained_layout=True)
    ax = fig.add_subplot(projection='3d')
    ax.plot_surface(x0,y0,z0,cmap=plt.cm.viridis,alpha=0.7)
    #ax.plot_wireframe(x0,y0,z0) # 另一种绘图方式
    ax.set_title('$y = x_1^2+x_2^2-x_1x_2-10x_1-4x_2+60$')
    
    # 第二步,设置粒子群算法的参数
    n = 30 # 粒子数量
    narvs = 2 # 变量个数
    c1 = 2 # 个体学习因子
    c2 = 2 # 社会学习因子
    w_max = 0.9 # 惯性权重
    w_min = 0.4
    K = 40 # 迭代次数
    vxmax = np.array([(15-(-15))*0.2,(15-(-15))*0.2]) # 粒子在x方向的最大速度
    x_lb = np.array([-15,-15]) # x和y的下界
    x_ub = np.array([15,15]) # x和y的上界
    
    # 第三步,初始化粒子   
    x = x_lb + (x_ub-x_lb)*np.random.rand(n,narvs)
    v = -vxmax + 2*vxmax*np.random.rand(n,narvs)
    
    # 第四步,计算适应度
    fit = func(x[:,0],x[:,1]) # 计算每个粒子的适应度
    pbest = x # 初始化这n个例子迄今为止找到的最佳位置
    ind = np.argmax(fit) # 找到适应度最大的那个粒子的下标
    gbest = x[ind,:]
    gbest_total = np.zeros(K)
    
    # 第五步,更新粒子速度和位置
    for j in range(K): # 外层循环,共K次
        w = np.random.rand() # 随机数作为惯性权重
        for p in range(n):
            v[p,:] = w*v[p,:] + c1*np.random.rand(narvs)*(pbest[p,:]-x[p,:]) + c2*np.random.rand(narvs)*(gbest-x[p,:])
        loc_v = np.where(v<-vxmax)
        v[loc_v] = -vxmax[loc_v[1]] # 速度小于-vmax的元素赋值为-vmax
        loc_v = np.where(v>vxmax)
        v[loc_v] = vxmax[loc_v[1]] # 速度大于vmax的元素赋值为vmax
        x = x + v # 更新第i个粒子的位置
        loc_x = np.where(x<x_lb)
        x[loc_x] = x_lb[loc_x[1]]
        loc_x = np.where(x>x_ub)
        x[loc_x] = x_ub[loc_x[1]]
        
        # 第六步,重新计算适应度并找到最优粒子
        fit = func(x[:,0],x[:,1]) # 重新计算n个粒子的适应度
        for k in range(n): # 更新第k个粒子迄今为止找到的最佳位置
            if fit[k]<func(pbest[k,0],pbest[k,1]):
                pbest[k,:] = x[k,:]
        if np.min(fit)<func(gbest[0],gbest[1]): # 更新所有粒子迄今找到的最佳位置
            gbest = x[np.argmin(fit),:]
        gbest_total[j] = func(gbest[0],gbest[1])
    
    ax.scatter(x[:,0],x[:,1],fit,c='r',marker='x')
    fig,ax = plt.subplots()
    ax.plot(np.arange(K),gbest_total)
    plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False #用来显示负号
    ax.set_title('算法找到的最小值随优化次数的变化曲线')
    ax.set_xlabel('循环次数')
    ax.autoscale(axis='x',tight=True)
    print('找到的最优解为:',func(gbest[0],gbest[1]))
    
    1. 绘制结果
    • 打印输出最优解:找到的最优解为: 8.000000066898039
      可以看出,比原始算法的精度提高了很多,与非线性递减权重效果可比拟。
    • 显示最终粒子所在的位置:
      在这里插入图片描述
      其中红色叉号表示最后一次循环结束后粒子所在的位置。可以看出,相比原始算法,粒子更多分布在最优点周围。
    • 循环过程中最优解随循环次数的变化曲线:
      在这里插入图片描述
      可以看出,收敛速度明显高于原始算法的速度。

    随机惯性权重公式2

    1. 数学公式:
      w = μ m i n + ( μ m a x − μ m i n ) × r a n d ( ) + σ × r a n d n ( ) w=\mu_{min}+(\mu_{max}-\mu_{min})×rand()+\sigma×randn() w=μmin+(μmaxμmin)×rand()+σ×randn()
      其中 μ m i n \mu_{min} μmin是随机惯性权重的最小值, μ m a x \mu_{max} μmax是随机惯性权重的最大值, r a n d ( ) rand() rand()是在 [ 0 , 1 ] [0,1] [0,1]上均匀分布的随机数, σ \sigma σ是标准差,一般取0.2~0.5之间的一个数, r a n d n ( ) randn() randn()为正态分布的随机数。
    2. Python代码
    # 第一步,绘制函数图像
    import numpy as np
    import matplotlib.pyplot as plt
    import mpl_toolkits.mplot3d
    
    def func(x,y):
        return x**2+y**2-x*y-10*x-4*y+60
    
    x0 = np.linspace(-15,15,100)
    y0 = np.linspace(-15,15,100)
    x0,y0 = np.meshgrid(x0,y0)
    z0 = func(x0,y0)
    fig = plt.figure(constrained_layout=True)
    ax = fig.add_subplot(projection='3d')
    ax.plot_surface(x0,y0,z0,cmap=plt.cm.viridis,alpha=0.7)
    #ax.plot_wireframe(x0,y0,z0) # 另一种绘图方式
    ax.set_title('$y = x_1^2+x_2^2-x_1x_2-10x_1-4x_2+60$')
    
    # 第二步,设置粒子群算法的参数
    n = 30 # 粒子数量
    narvs = 2 # 变量个数
    c1 = 2 # 个体学习因子
    c2 = 2 # 社会学习因子
    w_max = 0.9 # 惯性权重
    w_min = 0.4
    sigma = 0.3 # 标准差
    K = 40 # 迭代次数
    vxmax = np.array([(15-(-15))*0.2,(15-(-15))*0.2]) # 粒子在x方向的最大速度
    x_lb = np.array([-15,-15]) # x和y的下界
    x_ub = np.array([15,15]) # x和y的上界
    
    # 第三步,初始化粒子   
    x = x_lb + (x_ub-x_lb)*np.random.rand(n,narvs)
    v = -vxmax + 2*vxmax*np.random.rand(n,narvs)
    
    # 第四步,计算适应度
    fit = func(x[:,0],x[:,1]) # 计算每个粒子的适应度
    pbest = x # 初始化这n个例子迄今为止找到的最佳位置
    ind = np.argmax(fit) # 找到适应度最大的那个粒子的下标
    gbest = x[ind,:]
    gbest_total = np.zeros(K)
    
    # 第五步,更新粒子速度和位置
    for j in range(K): # 外层循环,共K次
        w = w_min + (w_max-w_min)*np.random.rand() + sigma*np.random.randn()
        for p in range(n):
            v[p,:] = w*v[p,:] + c1*np.random.rand(narvs)*(pbest[p,:]-x[p,:]) + c2*np.random.rand(narvs)*(gbest-x[p,:])
        loc_v = np.where(v<-vxmax)
        v[loc_v] = -vxmax[loc_v[1]] # 速度小于-vmax的元素赋值为-vmax
        loc_v = np.where(v>vxmax)
        v[loc_v] = vxmax[loc_v[1]] # 速度大于vmax的元素赋值为vmax
        x = x + v # 更新第i个粒子的位置
        loc_x = np.where(x<x_lb)
        x[loc_x] = x_lb[loc_x[1]]
        loc_x = np.where(x>x_ub)
        x[loc_x] = x_ub[loc_x[1]]
        
        # 第六步,重新计算适应度并找到最优粒子
        fit = func(x[:,0],x[:,1]) # 重新计算n个粒子的适应度
        for k in range(n): # 更新第k个粒子迄今为止找到的最佳位置
            if fit[k]<func(pbest[k,0],pbest[k,1]):
                pbest[k,:] = x[k,:]
        if np.min(fit)<func(gbest[0],gbest[1]): # 更新所有粒子迄今找到的最佳位置
            gbest = x[np.argmin(fit),:]
        gbest_total[j] = func(gbest[0],gbest[1])
    
    ax.scatter(x[:,0],x[:,1],fit,c='r',marker='x')
    fig,ax = plt.subplots()
    ax.plot(np.arange(K),gbest_total)
    plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False #用来显示负号
    ax.set_title('算法找到的最小值随优化次数的变化曲线')
    ax.set_xlabel('循环次数')
    ax.autoscale(axis='x',tight=True)
    print('找到的最优解为:',func(gbest[0],gbest[1]))
    
    1. 绘制结果
    • 打印输出最优解:找到的最优解为: 8.000000074157867
      可以看出,比原始算法的精度提高了很多,与非线性递减权重效果可比拟。
    • 显示最终粒子所在的位置:
      在这里插入图片描述
      其中红色叉号表示最后一次循环结束后粒子所在的位置。可以看出,相比原始算法,粒子更多分布在最优点周围。
    • 循环过程中最优解随循环次数的变化曲线:
      在这里插入图片描述
      可以看出,收敛速度明显高于原始算法的速度。
    更多相关内容
  • 针对惯性权重改进策略大多采用同代粒子使用相同权重,忽略了粒子本身特点以及不同维上的有效信息,提出一种基于不同粒子不同维的动态自适应惯性权重粒子群算法(AWPSO)。在该算法中利用矢量运算分析粒子进化公式,用一种...
  • 针对标准PSO算法求解高维非线性问题时存在的大量无效迭代(经过一轮迭代后全局最优位置保持不变),提出了一种自适应惯性权重的改进粒子群算法。基于单次迭代中单粒子运动状态的分析,提出并证明了论点:上一轮迭代...
  • 提出一种自适应惯性权重的磷虾群算法(AKH)。通过理论论证,得出在采用线性递减的磷虾群算法求解全局优化问题的迭代过程中,出现大量无效迭代是受到惯性权重的影响;进而提出相关改进策略:在以目标函数作为适应度值的...
  • 一种新型粒子群算法惯性权重因子修改方法,侯云龙,李宁,惯性因子是粒子群算法(Particle Swarm Optimization, PSO )当中一个很重要的参数,它很大程度上影响了粒子对以往搜索过程的认知程度。本文
  • 粒子群算法中惯性权重非线性调节策略,李丽,薛冰,惯性权重是粒子群优化算法(Particle Swarm Optimization,PSO)中的重要参数,可以有效的平衡算法的全局搜索能力和局部搜索能力,提高算法
  • 针对惯性权重改进策略大多采用同代粒子使用相同权重,忽略了粒子本身特点以及不同 维上的有效信息,提出一种基于不同粒子不同维的动态自适应惯性权重粒子群算法( AWPSO)。 在该算法中利用矢量运算分析粒子进化公式,用...
  • 为了克服传统粒子群算法(PS田的早熟和局部最优问题,提出了一种新的自适应惯性权重的混沌粒子群算法(ACP-SO算法)。该算法采用分段Logistic混沌映射的方法产生初始种群,并根据种群的进化状态来动态调整惯性权重。在...
  • 基于混沌理论和自适应惯性权重的粒子群优化算法
  • 为了有效地平衡粒子群优化算法的全局搜索和局部搜索能力, 提出了一种基于高斯函数递减惯性权重的粒子群优化GDIWPSO算法。此算法利用高斯函数的分布性、局部性等特点, 实现了对惯性权重的非线性调整。仿真过程中, ...
  • 针对标准粒子群算法在进化过程中种群多样性降低而早熟的问题,提出一种动态改变惯性权重的自适应粒子群算法.采用种群中平均粒子相似程度作为种群多样性的测度,并用于平衡算法的全局探索和局部开发.基于对惯性权重...
  • 基于惯性权重的萤火虫优化算法,高伟明,田亚菲,萤火虫算法(Firefly Algorithm,FA)是从模拟自然界中萤火虫成虫发光的生物学特性及群体行为发展而来,是一种基于群体智能的启发式随��
  • 针对工程上齿轮箱实时监测和故障诊断的需要,对JZQ250型齿轮箱展开研究,提出了基于动态惯性权重PSO算法训练BP神经网络的齿轮箱故障诊断方法。通过时域参数分析提取监测特征值作为齿轮箱的状态监测值,将故障特征向量...
  • 针对基本粒子群优化(Particle Swarm Opti mi zation,PSO)算法的不足,提出动态惯性权重粒子群优化算法,其惯性系数随算法进化而动态减少。仿真结果验证了该改进算法的有效性:算法的收敛速度比基本PSO算法的收敛速度快;...
  • 惯性权重的鲸鱼优化算法
  • 针对粒子群算法收敛速度慢和易陷入局部最优的问题,提出了基于惯性权重对数递减的粒子群算法,并引入对数调整因子,对数调整因子的不同取值保证了算法搜索成功率。选取八种典型函数分别进行给定迭代次数和给定精度的...
  • 通过对标准粒子群算法中惯性权重的分析,提出了一种惯性权重正弦调整的粒子群算法。运用差分方程对粒子速度变化过程和位置变化过程进行分析,得到了粒子群算法的收敛条件。通过对4个典型的函数的测试,实验结果表明...
  • 基于高斯函数递减惯性权重的粒子群优化算法.pdf
  • 任务调度算法中新的自适应惯性权重计算方法
  • 针对微粒群优化算法存在陷入局部极小点和搜索效率低的问题,给出一个新的速度更新策略局部收缩策略,并提出一种改进的微粒群优化算法,该算法保持微粒群优化算法结构简单的特点,改善了微粒群优化算法的全局寻优能力,...
  • 针对粒子群算法(Particle Swarm Optimization,PSO)易陷入局部极值的缺陷,提出了一种新的自适应惯性权重混沌PSO算法(a New Chaos Particle Swarm Optimization based on Adaptive Inertia Weight,CPSO-NAIW)。...
  • 针对标准粒子群算法在进化过程中种群多样性降低而早熟的问题 ,提出一种动态改变惯性权重的自适应粒子群算法.
  • 在医学图像配准中需要解决互信息图像配准过程中局部极值问题,引入了一种动态调整惯性权的自适应粒子群算法;验证了其中两个重要参数的取值,并均匀赋值粒子初始位置,避免随机产生的初始位置集中在某一区域而使寻优...
  • 【优化求解】基于非线性动态自适应惯性权重粒子群算法(IPSO)Matlab源码.md
  • 算法的主要思路如下:在粒子群进化过程中,赋予每代群体中每个粒子的每一维度以不同的线性衰减混沌化惯性权重,即从纵向看,随着迭代次数的增加,惯性权重呈现线性衰减变化;从横向看,当代的每个粒子的每一维度都在当前...
  • 提出了一种基于Logistic模型的惯性权重非线性调整策略,采用OpenMP多线程编程,在微机上实现了微粒群算法的多核并行计算。通过对BenchMark测试函数集中的5个函数进行测试,试验结果表明,采用基于Logistic模型的惯性...
  • 针对粒子群优化算法因种群多样性丧失而陷入局部最优、早熟收敛的问题,提出一种基于指数衰减惯性权重的分裂粒子群优化算法(EDW-DPSO)。首先,采用半均匀初始化种群,使种群以整体均匀、局部随机的方式分布;其次,...
  • 粒子群算法介绍。惯性权重w的确定

    千次阅读 2021-05-18 16:51:56
    惯性权重w体现的是粒子继承先前速度的能力,Shi Y最先将惯性权重w引入PSO算法中,并分析指出一个较大的惯性权重值有利于全局搜索,而一个较小的惯性权重值则更有利于局部搜索。为了平衡两者,提出了线性递减惯性权重...

    粒子群算法介绍03:附Matlab、python代码(PSO)

    八:

    惯性权重w体现的是粒子继承先前速度的能力,Shi Y最先将惯性权重w引入PSO算法中,并分析指出一个较大的惯性权重值有利于全局搜索,而一个较小的惯性权重值则更有利于局部搜索。为了平衡两者,后又提出了线性递减惯性权重(LDIW)。
    式(13-4)错误,分母只是k,去掉Tmax-
    在这里插入图片描述

    在这里插入图片描述
    无惯性权重的情况下,让程序运行100次平均值作为最优结果。在前面代码的基础上改进:函数代码与上一节相同。

    %% 双清空+关闭图形
    clc,clear,close all;
    
    %% 对程序执行100次运算
    for k = 1:100   
        %% PSO参数标定。 ***注意:这里少了惯性权重w和维度D***
        c1 = 1.49445;     %个体学习因子
        c2 = 1.49445;     %社会学习因子
        maxgen = 300;     %迭代次数
        sizepop = 20;     %种群大小
        Vmax = 0.5;       %速度上下限
        Vmin = -0.5;
        popmax = 2;       %位置上下限
        popmin = -2;
    
        %% 初始化粒子群中每个粒子的位置和速度,并计算适应度值
        for j = 1:sizepop               %自行参考for循环
            pop(j,:) = 2*rands(1,2);    %自行参考rands
            V(j,:) = 0.5*rands(1,2);
        
            fitness(j) = fun(pop(j,:)); %自行参考函数   
        end
    
        %% 寻找初始个体极值和群体极值  
        %{
        ***注意:pop是一个20行2列矩阵其中第一列为X1,第二列为X2;V也是
        fitness有看懂的大神请评论区解释一下,我理解的是一个20行1列的矩阵这样才能找到群体极值的位置,
        但是程序给出的确是1行20列矩阵***
        --------------------------------------------------------------------------------------------
        这里需要注意许多matlab中的max参考博客没讲这一点
        通过实验发现当矩阵A是一个行向量时,[maxnumber maxindex] = max(A)中maxindex返回的是最大值所在列
        这样就解释了刚才的疑问!
        A=[1,2,3,4,8,6,75,9,243,25]
        A =
             1     2     3     4     8     6    75     9   243    25
        [maxnumber maxindex] = max(A)
        maxnumber =
             243
        maxindex =
             9
        --------------------------------------------------------------------------------------------
        %}
        [bestfitness bestindex] = max(fitness);  %自行参考max函数用法
        zbest = pop(bestindex,:);                %群体极值位置       
        gbest = pop;                             %个体极值位置  因为初始化所以每个粒子个体极值位置就是它本身随机的位置
        fitnessgbest = fitness;                  %个体极值适应度值
        fitnesszbest = bestfitness;              %群体极值适应度值
    
    
    
        %% 寻优迭代
        for i = 1:maxgen
            %速度更新
            for j = 1:sizepop
                V(j,:)=V(j,:)+c1*rand*(gbest(j,:)-pop(j,:))+c2*rand*(zbest-pop(j,:)); %没有添加惯性权重
                V(j,find(V(j,:)>Vmax)) = Vmax; %find函数这里返回的是索引可以是三种情况1;2;1 2;
                V(j,find(V(j,:)<Vmin)) = Vmin;
             %位置更新   
                pop(j,:)=pop(j,:)+V(j,:);
                pop(j,find(pop(j,:)>popmax)) = popmax;
                pop(j,find(pop(j,:)<popmin)) = popmin;
              %更新适应度值  
                fitness(j)=fun(pop(j,:));
            end
              %个体极值更新
            for j = 1:sizepop
                if fitness(j)>fitnessgbest(j)
                    gbest(j,:)=pop(j,:);
                    fitnessgbest(j)=fitness(j);
                end
              %群体极值更新 
                if fitness(j)>fitnesszbest
                    zbest=pop(j,:);
                    fitnesszbest=fitness(j);
                end
            end
            %每代最优极值记录到result中
            result(i)=fitnesszbest;
        end
        G(k) = max(result);
    end
    
    GB = max(G);   %一百次运行后所有最优解中最大的最优解
    Average = sum(G)/100; %所有最优解平均值
    Fnumber =length(find(G>1.0054-0.01&G<1.0054+0.01));%在误差范围内最优解的个数
    FSnumber =length(find(G>1.0054+0.01|G<1.0054-0.01));%在误差范围外最优解的个数
    precision = Fnumber/100  %求解精度
    

    可以发现对最优解的求值很不稳定:
    在这里插入图片描述只有79次找到最优解剩下21次都没有。由此可见惯性权重十分重要。这里直接放结论:
    在这里插入图片描述
    可以看见第二种惯性权重效果最佳,即式(13-5),这里我后期试验了一下发现不管那种惯性权重都得不出上述结论。
    参考文献:matlab智能算法30个案例分析(第二版)


    本人实验结论如下:
    在这里插入图片描述
    在这里插入图片描述
    总体来看采用4式最好,但是多次实验你会发现每个w其精确度(出现最优解的实验次数/实验次数)变化范围很大,
    因此这里惯性权重并没有最好的选择,针对具体问题,对于具体实验可以增加代码运行次数,最后取运行最好的值。
    代码分为两部分,一部分参考文献的原始代码,其惯性权重那里有错误,缺少w
    另一部分为本人修改代码
    源代码连接
    https://download.csdn.net/download/weixin_42212924/18839919
    PSO往期文章
    https://blog.csdn.net/weixin_42212924/article/details/116808786
    https://blog.csdn.net/weixin_42212924/article/details/116947153

    展开全文
  • 文章目录一、理论基础1、基本布谷鸟算法2、多阶段动态扰动和动态惯性权重的布谷鸟优化算法(MACS)(1)多阶段动态扰动策略(2)动态惯性权重(3)自适应切换概率二、MACS算法流程三、仿真实验与分析1、测试函数2、...

    一、理论基础

    1、基本布谷鸟算法

    请参考这里

    2、多阶段动态扰动和动态惯性权重的布谷鸟优化算法(MACS)

    (1)多阶段动态扰动策略

    在布谷鸟算法的全局搜索阶段,所有鸟窝位置都朝着同一全局最优位置靠近,致使布谷鸟算法很容易陷入局部最优,导致算法在处理复杂多峰函数时,收敛精度低,收敛过早等缺点表现得尤为明显。针对这个问题,本文提出了一种多阶段动态扰动策略,对布谷鸟算法的最优鸟窝位置迚行分阶段的动态扰动,更新最优鸟窝位置。即对全局最优鸟窝位置根据方差可调的正态随机分布迚行扰动,从而得到新的全局最优鸟窝位置 X N e w b e s t X_{Newbest} XNewbest,更新公式如(1)所示: X N e w b e s t = N ( X b e s t , σ ) (1) X_{Newbest}=N(X_{best},\sigma)\tag{1} XNewbest=N(Xbest,σ)(1)其中, σ \sigma σ表示相对于 X b e s t X_{best} Xbest的不确定度,是关于迭代次数 t t t的非增函数,其更新公式如下: σ = { σ 1     , t < α 1 T σ 1 − ( σ 1 − σ 2 ) ( t − α 1 T ) ( α 2 T − α 1 T ) , α 1 T < t < α 2 T σ 2     , t > α 2 T (2) \sigma=\begin{dcases}\sigma_1\quad \quad \quad \quad \quad\quad \quad \quad\quad \,\,\,,t<\alpha_1T\\\sigma_1-\frac{(\sigma_1-\sigma_2)(t-\alpha_1T)}{(\alpha_2T-\alpha_1T)},\alpha_1T<t<\alpha_2T\\\sigma_2\quad \quad \quad \quad \quad\quad \quad \quad\quad \,\,\,,t>\alpha_2T\end{dcases}\tag{2} σ=σ1,t<α1Tσ1(α2Tα1T)(σ1σ2)(tα1T),α1T<t<α2Tσ2,t>α2T(2)其中, σ \sigma σ表示对原最优鸟窝位置正态扰动的半径参数,且 σ 1 < σ 2 \sigma_1<\sigma_2 σ1<σ2,本文取 σ 1 = 0.9 , σ 2 = 0.000001 \sigma_1=0.9,\sigma_2=0.000001 σ1=0.9,σ2=0.000001 α 1 , α 2 \alpha_1,\alpha_2 α1,α2是半径变化的控制参数,且 α 1 < α 2 \alpha_1<\alpha_2 α1<α2,本文取 α 1 = 0.4 , α 2 = 0.4 \alpha_1=0.4,\alpha_2=0.4 α1=0.4,α2=0.4 t t t是当前迭代次数, T T T是最大迭代次数。其扰动半径 σ \sigma σ变化图如下:
    在这里插入图片描述

    图1 扰动半径 σ \sigma σ变化图

    由图1可以看出,扰动半径 σ \sigma σ是一个分为三阶段的动态变化数值。在算法迭代前期以固定较大的半径对布谷鸟算法的全局最优鸟窝位置迚行扰动,得到新的变化较大的最优鸟窝位置,使全体鸟窝在朝着新的最优鸟窝位置靠近时,更具有广泛性和多样性,帮助算法在迭代前期更大范围内的去寻找全局最优,避免算法朝着固定最优鸟窝位置靠近,而在迭代前期就陷入局部最优的情况。当在迭代中期,算法在逐步缩小范围寻找全局最优时,本文也以线性递减的方式逐步降低对最优鸟窝位置的扰动半径,使全体鸟窝位置逐步稳定的向全局最优靠近。而在最后迭代后期,算法已经非常靠近寻求出全局最优解时,本文以固定非常微小的扰动半径对当前最优鸟窝位置迚行扰动,不再大范围波动当前最优位置,使算法小范围内精细搜索出全局最优解。

    (2)动态惯性权重

    动态惯性权重改迚策略是一种能够动态平衡全局搜索和局部搜索的改进机制,能够提高算法的搜索速度和收敛精度。本文在上一代鸟窝位置处引入自适应动态惯性权重对布谷鸟算法的偏好随机游动环节进行改进。改进后的布谷鸟偏好随机游动环节公式如(3)所示: x i t + 1 = x i t + γ ⋅ ( x j t − x k t ) (3) x_i^{t+1}=x_i^t+\gamma\cdot(x_j^t-x_k^t)\tag{3} xit+1=xit+γ(xjtxkt)(3)其中,动态惯性权重 w w w公式如(4)所示: w = sin ⁡ ( π t 2 T + π ) + 1 (4) w=\sin\left(\frac{\pi t}{2T}+\pi\right)+1\tag{4} w=sin(2Tπt+π)+1(4)其中, t t t为当前迭代次数, T T T是最大迭代次数, w w w变化见图2。
    在这里插入图片描述

    图2 动态惯性权重 w w w变化图

    通过图2可以看出, w w w ( 0 , 1 ) (0,1) (0,1)之间随迭代次数非线性递减的动态惯性权重,随着迭代过程的进行,惯性权重 w w w逐步减小。在迭代前期,给上一代鸟窝位置赋予相对大的系数,使上一代鸟窝具有更大的作用能力与范围,帮助布谷鸟算法在前期扩大搜索空间, 广泛寻找全局最优解。随着算法迭代过程的进行,惯性权重系数逐渐减小,直至到迭代后期,算法接近最优解时,对上一代鸟窝位置采用相对较小的惯性权重系数,有效的削弱了上一代鸟窝的保留信息,帮助布谷鸟算法有效跳出局部最优,使布谷鸟个体具有更好的局部寻优能力。本文通过动态惯性权重系数的引入,灵活处理上一代鸟窝的位置信息,提高了算法的局部寻优能力。

    (3)自适应切换概率

    自适应概率 p p p是布谷鸟算法的重要参数,当 p p p较小时,增加了全局的多样性,提高全局搜索能力,当 p p p较大时,增加局部搜索能力,提高了算法精度和效率。所以动态概率 p p p是一种综合提高算法性能的优化改进策略。本文提出的动态概率公式如下式(5)所示: p = 0.25 − 0.1 ∗ ( T − t ) / T (5) p=0.25-0.1*(T-t)/T\tag{5} p=0.250.1(Tt)/T(5) p p p的变化见图3。
    在这里插入图片描述

    图3 自适应切换概率变化图

    由图3可以看出,本文提出的概率 p p p是一个随迭代过程进行而自适应增大的动态切换概率。在算法迭代前期,以较小的概率 p p p来控制全局搜索和局部搜索的切换,在这个阶段由于概率 p p p较小,所以帮助算法在迭代前期多迚行全局搜索,大范围寻找全局最优解,增加了算法的全局多样性,提高了算法的全局搜索能力。随着迭代过程的进行,概率 p p p不断增大,直至在迭代后期,概率 p p p相对较大,帮助算法在迭代后期已经靠近全局最优解时,多进行局部精细搜索,提高算法的运算精度和搜索效率。通过将布谷鸟算法的固定概率替换成自适应切换概率,将概率 p p p与迭代过程动态联系在一起,帮助算法灵活平衡了全局搜索能力和局部搜索能力,提高算法性能。

    二、MACS算法流程

    MACS具体执行步骤如下:
    Step 1:设置布谷鸟算法初始参数,鸟的个数 N N N,解的维数 n n n,最大迭代次数 T T T,依照(5)式设置发现概率 p p p,搜索上下界。随机初始化鸟窝位置 X 0 = ( x 1 0 , x 2 0 , ⋯   , x N 0 ) X_0=(x_1^0,x_2^0,\cdots,x_N^0) X0=(x10,x20,,xN0),计算每个鸟窝的适应度 f i = f ( x i ) , i = 1 , 2 , ⋯   , N f_i=f(x_i),i=1,2,\cdots,N fi=f(xi),i=1,2,,N
    Step 2:按照基本布谷鸟算法更新鸟窝位置 X t = ( x 1 t , x 2 t , ⋯   , x N t ) X_t=(x_1^t,x_2^t,\cdots,x_N^t) Xt=(x1t,x2t,,xNt),进行全局搜索,计算更新解的适应度,如果更新解的适应度值更小就替换旧的解得到一组较优的鸟窝位置 G t = ( x 1 t , x 2 t , ⋯   , x N t ) G_t=(x_1^t,x_2^t,\cdots,x_N^t) Gt=(x1t,x2t,,xNt)
    Step 3:对Step 2产生的全局最优解 X b e s t ( 0 ) X_{best}^{(0)} Xbest(0)按照公式(1)(2)进行多阶段动态扰动,更新鸟窝位置 B t = ( x 1 t , x 2 t , ⋯   , x N t ) B_t=(x_1^t,x_2^t,\cdots,x_N^t) Bt=(x1t,x2t,,xNt)和全局最优解 X b e s t ( t ) X_{best}^{(t)} Xbest(t)
    Step 4:按照式(5)的动态发现概率p淘汰部分解,并用改进后的偏好随机游动公式(3)产生于淘汰数量相同的新解,计算新解的适应度值,与 B t = ( x 1 t , x 2 t , ⋯   , x N t ) B_t=(x_1^t,x_2^t,\cdots,x_N^t) Bt=(x1t,x2t,,xNt)的适应度值进行比较,用好的适应度值的位置替代适应度值差的位置,得到一组较优的鸟窝位置 A t = ( x 1 t , x 2 t , ⋯   , x N t ) A_t=(x_1^t,x_2^t,\cdots,x_N^t) At=(x1t,x2t,,xNt)
    Step 5:计算各个鸟窝的适应度值,找出 A t = ( x 1 t , x 2 t , ⋯   , x N t ) A_t=(x_1^t,x_2^t,\cdots,x_N^t) At=(x1t,x2t,,xNt)中最好的鸟窝位置 X b e s t ( t ) X_{best}^{(t)} Xbest(t)和最优的适应度值 f m i n f_{min} fmin
    Step 6:判断算法的终止条件,若满足,就输出当前最优值 f m i n f_{min} fmin;若不满足,就重复Step 2~Step 6。

    三、仿真实验与分析

    为了证明MACS算法的寻优性能,本文选取了 11个不同难度的函数,其中涵盖简单低峰函数和复杂多峰函数、高维函数和低维函数,函数设置见表1。分别对MACS算法的收敛速度、收敛精度进行测试。同时与ASCSA算法、CS算法、FPA算法、BA算法,四种算法进行对比分析。

    1、测试函数

    表1 测试函数

    在这里插入图片描述

    2、测试环境及算法参数

    实验环境如下:CPU为i7-7700U@3.6GHz,运行内存8G,操作系统Windows10,编程环境MatlabR2018a。四种算法设置参数见文献[1]表2所示。

    3、算法求解精度比较分析

    分别对测试函数在10维变量下(表1最后两个测试函数为2维)进行比较分析。独立运算30次,每次运算法迭代1000次。
    图4~14分别为11个测试函数的收敛曲线对比图。
    在这里插入图片描述

    图4 Rastrigin函数收敛曲线图

    在这里插入图片描述

    图5 Schaffer函数收敛曲线图

    在这里插入图片描述
    图6 Zakharov函数收敛曲线图

    在这里插入图片描述
    图7 Griewank函数收敛曲线图

    在这里插入图片描述
    图8 Alpine函数收敛曲线图

    在这里插入图片描述
    图9 Sphere函数收敛曲线图

    在这里插入图片描述
    图10 Sum square函数收敛曲线图

    在这里插入图片描述
    图11 Schwefel’s2.2函数收敛曲线图

    在这里插入图片描述
    图12 Ackley函数收敛曲线图

    在这里插入图片描述
    图13 Bohachevsky函数收敛曲线图

    在这里插入图片描述
    图14 Mytyas函数收敛曲线图

    各个测试函数的最大值、最小值、平均值及标准差显示如下:

    函数:Rastrigin
    MACS:最大值: 0,最小值:0,平均值:0,标准差:0
    CS:最大值: 9.9567,最小值:2.5658,平均值:6.2934,标准差:1.8954
    BA:最大值: 101.0944,最小值:36.5992,平均值:60.8459,标准差:12.157
    FPA:最大值: 74.3119,最小值:13.1144,平均值:25.0745,标准差:11.4836
    ASCSA:最大值: 6.9647,最小值:0,平均值:1.7909,标准差:1.5764
    函数:Schaffer
    MACS:最大值: 0,最小值:0,平均值:0,标准差:0
    CS:最大值: 0.018981,最小值:0.0048842,平均值:0.0077071,标准差:0.0057332
    BA:最大值: 0.13104,最小值:0.040773,平均值:0.092242,标准差:0.026346
    FPA:最大值: 0.068163,最小值:0.0048843,平均值:0.023835,标准差:0.015379
    ASCSA:最大值: 0.018981,最小值:0.0048842,平均值:0.0053541,标准差:0.0025737
    函数:Zakharov 
    MACS:最大值: 0,最小值:0,平均值:0,标准差:0
    CS:最大值: 4.4718e-08,最小值:4.3195e-10,平均值:8.7354e-09,标准差:9.6517e-09
    BA:最大值: 1.7886,最小值:0.54846,平均值:1.1596,标准差:0.32446
    FPA:最大值: 76.8971,最小值:0.43134,平均值:9.7848,标准差:20.0284
    ASCSA:最大值: 9.2441e-06,最小值:7.1027e-09,平均值:1.5259e-06,标准差:2.3697e-06
    函数:Griewank
    MACS:最大值: 0,最小值:0,平均值:0,标准差:0
    CS:最大值: 0.10043,最小值:0.0029428,平均值:0.044553,标准差:0.019258
    BA:最大值: 48.4967,最小值:2.5579,平均值:16.9508,标准差:11.8228
    FPA:最大值: 7.7118,最小值:0.07165,平均值:0.5498,标准差:1.3797
    ASCSA:最大值: 0.14522,最小值:0,平均值:0.057408,标准差:0.029417
    函数:Alpine
    MACS:最大值: 8.8044e-107,最小值:0,平均值:2.9417e-108,标准差:1.6073e-107
    CS:最大值: 0.48185,最小值:0.019828,平均值:0.20014,标准差:0.10758
    BA:最大值: 11.2913,最小值:2.6162,平均值:5.6295,标准差:2.1361
    FPA:最大值: 2.7789,最小值:0.16801,平均值:1.0289,标准差:0.62061
    ASCSA:最大值: 3.7583e-09,最小值:5.1027e-100,平均值:1.2528e-10,标准差:6.8618e-10
    函数:Sphere
    MACS:最大值: 0,最小值:0,平均值:0,标准差:0
    CS:最大值: 2.2253e-14,最小值:3.4939e-16,平均值:5.5236e-15,标准差:5.1063e-15
    BA:最大值: 1.0794,最小值:0.35263,平均值:0.6879,标准差:0.17256
    FPA:最大值: 1309.1841,最小值:0.00023021,平均值:46.264,标准差:238.8361
    ASCSA:最大值: 3.2978e-47,最小值:2.6094e-53,平均值:1.9537e-48,标准差:6.1329e-48
    函数:Sum square 
    MACS:最大值: 0,最小值:0,平均值:0,标准差:0
    CS:最大值: 1.3035e-15,最小值:3.6084e-17,平均值:2.6529e-16,标准差:3.1064e-16
    BA:最大值: 4.9461,最小值:0.76171,平均值:3.1578,标准差:1.0511
    FPA:最大值: 74.0895,最小值:9.9428e-06,平均值:3.6905,标准差:14.5081
    ASCSA:最大值: 3.086e-46,最小值:2.124e-55,平均值:1.0436e-47,标准差:5.6317e-47
    函数:Schwefel's2.2
    MACS:最大值: 1.6086e-239,最小值:0,平均值:5.5207e-241,标准差:0
    CS:最大值: 7.7784e-07,最小值:1.5394e-07,平均值:3.496e-07,标准差:1.6196e-07
    BA:最大值: 3.2953,最小值:1.288,平均值:2.1021,标准差:0.38809
    FPA:最大值: 18.8002,最小值:0.011049,平均值:1.0958,标准差:3.4672
    ASCSA:最大值: 1.0623e-33,最小值:1.2555e-37,平均值:1.2372e-34,标准差:2.7531e-34
    函数:Ackley 
    MACS:最大值: 4.5387e-228,最小值:0,平均值:1.5129e-229,标准差:0
    CS:最大值: 8.7495e-07,最小值:6.9893e-08,平均值:3.8391e-07,标准差:1.9397e-07
    BA:最大值: 52.2304,最小值:1.3028,平均值:7.784,标准差:14.8012
    FPA:最大值: 5.1372,最小值:0.032912,平均值:0.73158,标准差:1.0635
    ASCSA:最大值: 6.0533e-34,最小值:9.3829e-38,平均值:3.9459e-35,标准差:1.1496e-34
    函数:Bohachevsky
    MACS:最大值: 0,最小值:0,平均值:0,标准差:0
    CS:最大值: 0,最小值:0,平均值:0,标准差:0
    BA:最大值: 0.03962,最小值:0.00054011,平均值:0.011138,标准差:0.011178
    FPA:最大值: 0.14183,最小值:0,平均值:0.0047722,标准差:0.025886
    ASCSA:最大值: 0,最小值:0,平均值:0,标准差:0
    函数:Mytyas
    MACS:最大值: 0,最小值:0,平均值:0,标准差:0
    CS:最大值: 1.8917e-41,最小值:6.4787e-48,平均值:1.6967e-42,标准差:4.1291e-42
    BA:最大值: 0.00013716,最小值:2.9585e-06,平均值:3.9984e-05,标准差:3.529e-05
    FPA:最大值: 3.2245e-07,最小值:1.7098e-24,平均值:1.7781e-08,标准差:6.8479e-08
    ASCSA:最大值: 2.6252e-17,最小值:3.6965e-105,平均值:8.7614e-19,标准差:4.7927e-18
    

    通过对这5种算法的收敛曲线进行比较分析,可以看出,无论是单峰函数还是复杂多峰函数,无论是高维函数还是低维函数,无论是寻优能力还是寻优精度上,MACS算法的寻优表现都优于其他四个算法,表现出良好的性能。

    四、参考文献

    [1] 张珍珍, 贺兴时, 于青林, 等. 多阶段动态扰动和动态惯性权重的布谷鸟算法[J]. 计算机工程与应用, 2022, 58(1): 79-88.
    [2] 李荣雨, 戴睿闻. 自适应步长布谷鸟搜索算法[J]. 计算机科学, 2017, 44(5): 235-240.

    展开全文
  • 针对反向粒子群优化算法存在的易陷入局部最优、计算开销大等问题,提出了一种带自适应精英粒子变异及非线性惯性权重的反向粒子群优化算法(OPSO-AEM&NIW),来克服该算法的不足。OPSO-AEM&NIW算法在一般性反向学习...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,205
精华内容 1,682
关键字:

惯性权重