正余弦优化算法(SCA)之 SCASL 复现之旅

📅 发布时间:2026/7/14 19:47:12 👁️ 浏览次数:
正余弦优化算法(SCA)之 SCASL 复现之旅
正余弦优化算法(SCA)文章复现(非线权重改进位置更新Levy飞行扰动策略ABC算法思想)——SCASL 复现内容包括:文章改进SCA算法实现、23个基准测试函数、文中相关因子分析、与SCA对比等。 代码基本上每一步都有注释非常易懂代码质量极高便于新手学习和理解。最近在研究优化算法接触到了正余弦优化算法(SCA)并对其改进版本 SCASL 进行了复现今天就来和大家分享一下这个有趣的过程。一、SCASL 改进思路简介SCASL 主要包含了三个关键改进点非线权重改进位置更新、Levy 飞行扰动策略以及引入 ABC 算法思想。1. 非线权重改进位置更新传统 SCA 的位置更新方式相对较为单一而在 SCASL 中通过非线性权重的引入使得算法在搜索过程中能更好地平衡全局搜索和局部搜索能力。想象一下就好比给算法装上了一个智能导航在初期能快速大范围地探索后期则能精准地定位到最优解附近。2. Levy 飞行扰动策略Levy 飞行是一种随机游走方式它的特点是偶尔会出现大幅度的跳跃。这对于优化算法来说非常有用当算法陷入局部最优时Levy 飞行扰动可以帮助它跳出局部陷阱继续寻找更优解就像在迷宫中走得太顺突然发现可能走入死胡同这时来个大跳跃说不定就发现新的通路了。3. ABC 算法思想引入ABC人工蜂群算法的思想主要体现在对搜索过程的引导上。借鉴 ABC 算法SCASL 可以更有效地利用已有的搜索信息让搜索方向更加智能避免了一些无效的搜索路径。二、代码实现及分析1. 改进 SCA 算法实现import numpy as np def scasl_optimize(func, dim, pop_size, max_iter, lb, ub): # 初始化种群位置 positions np.random.uniform(lb, ub, (pop_size, dim)) fitness np.array([func(position) for position in positions]) best_index np.argmin(fitness) best_position positions[best_index] best_fitness fitness[best_index] # 非线性权重相关参数 alpha 2 beta 10 for t in range(max_iter): # 计算非线性权重 w alpha - (alpha - 1) * (t / max_iter) ** beta for i in range(pop_size): r1 np.random.rand() if r1 0.5: r2 np.random.rand() r3 np.random.rand() # 利用非线性权重进行位置更新 positions[i] positions[i] w * np.sin(r2) * np.abs(r3 * best_position - positions[i]) else: r4 np.random.rand() r5 np.random.rand() positions[i] positions[i] w * np.cos(r4) * np.abs(r5 * best_position - positions[i]) # 边界处理 positions[i] np.clip(positions[i], lb, ub) fit func(positions[i]) if fit fitness[i]: fitness[i] fit if fit best_fitness: best_fitness fit best_position positions[i] # Levy 飞行扰动策略 levy np.random.standard_cauchy((1, dim)) for i in range(pop_size): if np.random.rand() 0.2: # 以一定概率进行扰动 positions[i] positions[i] 0.01 * levy * (positions[i] - best_position) positions[i] np.clip(positions[i], lb, ub) fit func(positions[i]) if fit fitness[i]: fitness[i] fit if fit best_fitness: best_fitness fit best_position positions[i] return best_position, best_fitness在这段代码中我们首先初始化了种群位置并计算了每个位置对应的适应度。在每次迭代中根据非线性权重公式计算权重w然后依据r1的值选择不同的正余弦更新方式。这里的非线性权重w随着迭代次数t的增加而逐渐减小使得前期算法更倾向于全局搜索后期则偏向局部搜索。正余弦优化算法(SCA)文章复现(非线权重改进位置更新Levy飞行扰动策略ABC算法思想)——SCASL 复现内容包括:文章改进SCA算法实现、23个基准测试函数、文中相关因子分析、与SCA对比等。 代码基本上每一步都有注释非常易懂代码质量极高便于新手学习和理解。Levy 飞行扰动部分通过np.random.standard_cauchy生成 Levy 分布的随机数以 0.2 的概率对部分个体进行扰动尝试跳出局部最优。2. 23 个基准测试函数这里简单以一个经典的基准测试函数——Sphere 函数为例。def sphere(x): return np.sum(x ** 2)这个函数非常简单直观用于测试优化算法在简单单峰函数上的性能。实际复现中会有 23 个不同类型的基准测试函数包括单峰、多峰等不同特性的函数全面考察算法的性能。3. 文中相关因子分析在代码实现过程中我们可以通过记录每次迭代的最优解、平均适应度等数据来分析各个改进因子的作用。比如我们可以绘制不同改进策略下算法收敛曲线的对比图。通过观察这些曲线就能直观地看出非线权重、Levy 飞行扰动以及 ABC 算法思想分别对算法收敛速度和精度的影响。4. 与 SCA 对比为了验证 SCASL 的改进效果我们需要将其与原始的 SCA 进行对比。同样以 Sphere 函数为例实现原始 SCA 算法。def sca_optimize(func, dim, pop_size, max_iter, lb, ub): positions np.random.uniform(lb, ub, (pop_size, dim)) fitness np.array([func(position) for position in positions]) best_index np.argmin(fitness) best_position positions[best_index] best_fitness fitness[best_index] for t in range(max_iter): a 2 - t * (2 / max_iter) for i in range(pop_size): r1 np.random.rand() if r1 0.5: r2 np.random.rand() r3 np.random.rand() positions[i] positions[i] a * np.sin(r2) * np.abs(r3 * best_position - positions[i]) else: r4 np.random.rand() r5 np.random.rand() positions[i] positions[i] a * np.cos(r4) * np.abs(r5 * best_position - positions[i]) positions[i] np.clip(positions[i], lb, ub) fit func(positions[i]) if fit fitness[i]: fitness[i] fit if fit best_fitness: best_fitness fit best_position positions[i] return best_position, best_fitness通过在相同的基准测试函数上运行 SCASL 和 SCA对比它们的收敛速度、最终找到的最优解等指标可以明显看出 SCASL 的改进优势。比如在一些复杂的多峰函数上SCASL 可能更快地收敛到全局最优解而 SCA 则容易陷入局部最优。三、总结这次对 SCASL 的复现让我对正余弦优化算法有了更深入的理解。通过引入非线权重改进位置更新、Levy 飞行扰动策略以及 ABC 算法思想确实有效地提升了算法的性能。代码中的详细注释也使得新手能够更容易理解和学习优化算法的实现过程。希望这篇博文能对同样对优化算法感兴趣的朋友们有所帮助大家一起探索更多有趣的算法改进思路。