一种多尺度协同变异的粒子群优化算法(Python代码实现)

   💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

💥1 文献来源

📚2 概述

   为了改善粒子群算法易早熟收敛、精度低等缺点,提出一种多尺度协同变异的粒子群优化算法,并证明了该算法以概率1收敛到全局最优解.算法采用多尺度高斯变异机制实现局部解逃逸.在算法初期阶段,利用大尺度变异及均匀变异算子实现全局最优解空间的快速定位;随着适应值的提升,变异尺度随之降低;最终在算法后期阶段,利用小尺度变异算子完成局部精确解空间的搜索.将算法应用6个典型复杂函数优化问题,并同其他带变异操作的PSO算法比较,结果表明,该算法在收敛速度及稳定性上有显著提高。

多尺度协同变异粒子群算法:

粒子群算法迭代过程中,如果某个粒子发现了一个当前最优位置,其他粒子会迅速向其靠拢.如果该最优位置是局部最优点,粒子群就无法在解空间内重新搜索,算法就会陷入局部最优,从而出现早熟收敛的现象.为了避免这种情况的发生,此时,如果我们对粒子的速度进行变异,就可以改变粒子的前进方向,使粒子进入解空间的其他区域搜索,从而有可能发现新的个体最优位置和种群最优位置,增加算法找到全局最优解的几率.然而,在上述提到的通过增加变异操作来帮助算法逃出局部最优的改进算法中,粒子的逃逸能力都取决于均匀变异尺度,均匀变异虽然具有很强的逃离原点的能力,但是由于我们事先无法预知函数局部极间的距离,因此无法给出合适的变异尺度.如果初始尺度较大,则无法保证所逃离到的新位置的适应值一定优于现有的最优解,尤其是在算法进化后期最优解可能就存在于现有最优解周边的区域,这样,通过单纯的均匀变异无法确定更优的位置,最终因迭代次数的限制使其无法收敛到全局最优解.为此,本文提出一种多尺度协同变异粒子群优化算法,算法的逃逸能力取决于不同尺度方差的高斯变异算子,不同尺度的变异有助于算法在搜索空间中进行分散式搜索.同时,变异尺度随着适应度的提升逐渐减少.这样,在保证算法逃逸能力的同时,提高了最优解的精度.

一、研究背景与意义

粒子群优化算法(Particle Swarm Optimization, PSO)是一种基于群体智能的优化算法,通过模拟鸟群或鱼群的群体行为来寻找最优解。PSO算法具有原理简单、收敛速度快、易于实现等优点,在函数优化、工程设计、机器学习等领域得到了广泛应用。然而,传统PSO算法在处理高维度、多模态、非线性的复杂问题时,容易陷入局部最优解,导致早熟收敛,且后期收敛速度缓慢。

为了解决这些问题,研究者们提出了多种改进策略,如惯性权重改进、学习因子调整、拓扑结构优化等。但这些方法大多聚焦于单一尺度的搜索行为调整,未能充分协调粒子在“全局探索”与“局部开发”之间的平衡。因此,研究一种能够动态协调探索与开发能力的PSO算法具有重要的理论意义和实际应用价值。

二、多尺度协同变异粒子群优化算法概述

多尺度协同变异的粒子群优化算法(Multi-Scale Cooperative Mutation Particle Swarm Optimization, MAEPSO)是一种通过引入多尺度变异机制来改进传统PSO算法的新型优化算法。该算法的核心思想在于打破传统PSO算法“单一搜索尺度”的局限,通过构建宏观-中观-微观三级变异尺度,并设计协同机制,使粒子在不同优化阶段自适应选择最优变异策略,实现“全局广域探索-局部区域开发-精确精细收敛”的渐进式优化过程。

三、多尺度变异机制设计

MAEPSO算法将变异行为分为三个尺度,各尺度的功能与实现方式如下:

  1. 宏观尺度变异

    • 功能:聚焦“全局探索”,针对算法初期或粒子陷入局部最优时,通过大步长随机变异调整粒子位置,扩大搜索范围,帮助算法跳出局部最优区域,探索未覆盖的解空间。
    • 实现方式:采用基于正态分布生成较大变异步长的方法,对粒子位置进行随机扰动。
  2. 中观尺度变异

    • 功能:侧重“区域开发”,在算法中期(粒子逐渐向全局最优区域聚集时),采用基于粒子历史最优的自适应步长变异,既保留粒子对优质区域的记忆,又避免因步长过大导致的搜索震荡,平衡探索与开发效率。
    • 实现方式:根据粒子历史最优位置和当前位置的距离,动态调整变异步长。
  3. 微观尺度变异

    • 功能:面向“精确收敛”,在算法后期(粒子接近全局最优解时),引入小步长高斯变异,对粒子位置进行微调,避免因粒子多样性不足导致的早熟收敛,提升算法对最优解的逼近精度。
    • 实现方式:采用小方差的高斯分布生成变异步长,对粒子位置进行精细调整。
四、协同触发机制

为实现多尺度变异的动态适配,MAEPSO算法设计了基于粒子多样性与迭代进度的协同触发机制:

  1. 粒子多样性控制

    • 若多样性过高(算法初期),优先触发宏观尺度变异,以扩大搜索范围,避免算法陷入局部最优。
    • 若多样性中等(算法中期),触发中观尺度变异,以平衡探索与开发效率,逐步向全局最优区域聚集。
    • 若多样性过低(算法后期),触发微观尺度变异,以提升算法对最优解的逼近精度,避免早熟收敛。
  2. 迭代进度控制

    • 结合当前迭代次数与最大迭代次数的比例(如迭代进度<30%为初期,30%-70%为中期,>70%为后期),对变异尺度的选择进行辅助约束,确保算法在不同阶段的搜索策略与优化目标匹配。
五、算法流程

MAEPSO算法的流程如下:

  1. 种群初始化:随机初始化粒子的位置、速度和全局最优位置,计算粒子的适应度值。
  2. 适应度评估:根据目标函数计算每个粒子的适应度值,并记录个体最优位置和全局最优位置。
  3. 速度更新:根据PSO算法的速度更新公式,结合当前位置、个体最优位置和全局最优位置,更新粒子的速度。
  4. 变异触发判断:根据粒子多样性和迭代进度,判断是否需要触发变异操作。
  5. 变异操作:若触发变异,根据当前阶段选择的变异尺度(宏观、中观或微观),对粒子位置进行变异调整。
  6. 位置更新:根据变异后的速度,更新粒子的位置,并进行边界检查,确保粒子位置在合理范围内。
  7. 适应度更新:重新计算变异后粒子的适应度值,并更新个体最优位置和全局最优位置。
  8. 终止条件判断:若达到最大迭代次数或满足其他终止条件,则输出全局最优解;否则返回步骤3继续迭代。
六、实验结果与分析

为验证MAEPSO算法的优越性,选取6个典型的高维复杂测试函数(如Sphere函数、Rastrigin函数、Griewank函数等,涵盖单模态、多模态、非线性等特性),将其与传统PSO、惯性权重递减PSO(PSO-W)、自适应变异PSO(PSO-M)进行对比测试。评价指标包括最优解精度、收敛速度与鲁棒性(多次运行的结果标准差)。

实验结果表明,MAEPSO算法在最优解精度、收敛速度与鲁棒性上均优于传统改进算法。具体分析如下:

  1. 最优解精度:MAEPSO算法在多个测试函数上找到了更接近理论最优值的解,表明其多尺度变异机制有助于算法跳出局部最优,发现全局最优解。
  2. 收敛速度:MAEPSO算法在算法初期通过宏观尺度变异快速定位全局最优解空间,中期通过中观尺度变异平衡探索与开发效率,后期通过微观尺度变异精细收敛,从而实现了更快的收敛速度。
  3. 鲁棒性:MAEPSO算法在多次运行中表现出更小的结果标准差,表明其多尺度变异机制有助于保持种群多样性,避免早熟收敛,提高了算法的稳定性。
七、结论与展望

多尺度协同变异的粒子群优化算法通过构建宏观-中观-微观三级变异机制,并设计基于粒子多样性与迭代进度的协同触发策略,有效解决了传统PSO算法早熟收敛与后期收敛缓慢的问题。性能测试表明,该算法在最优解精度、收敛速度与鲁棒性上均优于传统改进算法,为复杂优化问题的求解提供了高效、稳定的技术方案。

未来研究可进一步优化变异参数自适应机制,根据算法运行过程中的实时信息动态调整变异尺度、变异概率等参数,以进一步提高算法的搜索效率和求解质量。同时,可将多尺度协同变异机制扩展至多目标优化领域,研究多尺度协同变异的多目标粒子群优化算法,以解决更复杂的优化问题。

🎉3 运行结果

部分代码:

def find_min(self, func, region):
    W = np.abs(region[0]-region[1]).astype(np.double)
    Vmax = W/4.0
    sigma = self.initSigma(W)
    x = self.initX(region)
    v = self.initV(Vmax)
    Td = self.initTd(Vmax)
    G = self.initG()
    pbfx = func(x)
    # print(x.shape)
    # print(pbfx.shape)
    # print(np.unravel_index(pbfx.argmin(), pbfx.shape))
    pb = x*1.0
    gbfx = np.min(pbfx)*1.0
    gb = pb[pbfx.argmin()]*1.0
    plt_sigma = np.expand_dims(sigma, -1)
    plt_x = np.array([0])
    plt_gbfx = gbfx*1.0
    for i in range(self.maxK):
        print(func(gb))
        # print(gb)
        fx = func(x)
        mask = fx<pbfx
        pbfx[mask] = fx[mask]*1.0
        pb[mask] = x[mask]*1.0
        if gbfx >= np.min(pbfx):
            gbfx = np.min(pbfx)*1.0
            gb = pb[pbfx.argmin()]*1.0
        
        v = self.update_V(v, x, pb, gb, i)
        v, Td, G = self.escape(v, x, func, Td, G, sigma, Vmax)
        # v[v>Vmax] = Vmax
        # v[v<-Vmax] = -Vmax
        x += v
        x[x>np.max(region)] = np.max(region)
        x[x<np.min(region)] = np.min(region)
        sigma, _ = self.update_Sigma(sigma, func, x, W)

        plt_sigma = np.hstack([plt_sigma,np.expand_dims(sigma,-1)])
        plt_x = np.hstack([plt_x, i])
        plt_gbfx = np.hstack([plt_gbfx, gbfx])
    return gbfx, gb, plt_sigma, plt_x, plt_gbfx

🌈4 Python代码实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值