FEATURED · 精选文章

正余弦优化算法(SCA)原理详解与Python实战:从多峰函数寻优到数学建模应用

发布时间 / 2026/8/28 18:12:12
来源 / 创域科博编辑部
栏目 / 资讯中心
正余弦优化算法(SCA)原理详解与Python实战:从多峰函数寻优到数学建模应用 1. 项目概述当数学建模遇上正余弦优化算法在数学建模竞赛和实际的工程优化问题里我们常常会碰到一个核心挑战如何在一个复杂的、多维度的“地形”里找到那个最低的“山谷”或最高的“山峰”这个“地形”就是多元函数而寻找极值点的过程就是函数寻优。传统的梯度下降法在复杂、非凸、多峰的函数面前很容易一头扎进局部最优的“小水坑”里出不来而一些启发式算法比如遗传算法、粒子群算法则给了我们跳出局部、探索全局的可能。今天要聊的正余弦优化算法就是这类启发式算法家族里的一位后起之秀它思路清奇实现起来也相当优雅。我第一次接触SCA是在处理一个供应链网络设计的建模问题时目标函数涉及运输成本、仓储成本和延迟惩罚变量有几十个约束条件一堆。试了常规方法效果不佳偶然看到SCA的论文被它用简单的正余弦波动来模拟搜索过程的机制吸引了。实测下来它在平衡“探索”和“开发”这两个核心矛盾上有自己独到的一套逻辑代码量不大但调参得当的话收敛速度和精度都令人满意。这篇文章我就结合自己多次在建模中应用SCA的经验把它从原理到代码从调参到避坑彻底拆解一遍。无论你是正在备战数模竞赛的学生还是需要解决实际优化问题的工程师这篇内容都能给你提供一个可直接上手、效果可靠的工具箱。2. SCA核心原理波动中的智慧要理解SCA我们不能把它当成一个黑箱。它的核心思想非常直观模仿自然界中周期性波动的现象比如正弦波和余弦波来引导搜索个体在解空间中的移动。算法将候选解可以理解为搜索代理的位置更新与正弦和余弦函数的值直接关联通过巧妙地调整几个关键参数来控制搜索的广度和深度。2.1 位置更新公式算法的发动机SCA最核心的公式就是下面这个位置更新方程。对于第i个搜索代理在t1次迭代时的位置X_i(t1)其更新方式取决于一个随机概率[ X_i^{t1} \begin{cases} X_i^t r_1 \times \sin(r_2) \times | r_3 P_i^t - X_i^t |, \text{if } r_4 0.5 \ X_i^t r_1 \times \cos(r_2) \times | r_3 P_i^t - X_i^t |, \text{if } r_4 \geq 0.5 \end{cases} ]这个公式看起来有点复杂我们把它拆开看每个部分都有明确的物理意义X_i^t当前解的位置。这是更新的起点。P_i^t当前迭代中第i个代理所知道的“目的地”或“引导者”的位置。在标准SCA中这通常就是当前种群中适应度最好的那个解的位置即全局最优解P_g^t。算法会朝着这个好解的方向努力。| r_3 P_i^t - X_i^t |这是一个距离项。它代表了当前位置X_i^t与目标位置P_i^t之间的绝对距离。r_3是一个随机权重因子它的取值会影响这个距离的尺度。当r_3 1时算法更强调P_i^t倾向于开发当r_3 1时算法更强调X_i^t倾向于探索。sin(r_2)或cos(r_2)这是算法的灵魂所在。r_2是一个随机角度决定了正弦或余弦函数的值。这个值在[-1, 1]之间变化它直接决定了搜索代理下一步移动的“方向”和“步长”。正弦和余弦的周期性保证了搜索方向能够覆盖360度的所有方向。r_1这是最重要的一个参数我习惯叫它“收敛因子”。它不是一个常数而是随着迭代次数t动态变化的 [ r_1 a - t \times \frac{a}{T} ] 其中a是一个常数通常设为2T是最大迭代次数。可以看到r_1从初始值a线性递减到0。这个设计是SCA平衡探索与开发的关键。在迭代初期r_1值较大sin或cos函数乘上一个大数导致位置更新幅度大代理可以在整个解空间进行大范围的“探索”随着迭代进行r_1逐渐变小更新步长也随之减小代理开始在当前最优解附近进行精细的“开发”寻找更精确的极值点。r_4一个在[0, 1]区间均匀分布的随机数。它像一个硬币以50%的概率决定本次更新是使用正弦函数还是余弦函数。这增加了搜索行为的随机性和多样性避免所有代理以完全相同的方式移动。注意公式中的绝对值符号|...|确保了距离始终为正这保证了更新项的方向是由sin(r2)或cos(r2)的符号决定的。有些实现中会省略绝对值但标准形式是保留的它更强调一种“朝向或背离”目标点的移动。2.2 探索与开发的平衡艺术所有元启发式算法的核心矛盾就是“探索”和“开发”。探索是指搜索代理广泛地巡视整个解空间避免过早陷入局部最优开发是指搜索代理在可能有希望的区域进行精细搜索以逼近最优解。SCA通过两个主要机制来平衡这对矛盾动态收敛因子r_1如前所述这是最主要的手段。线性递减的策略简单有效符合我们“先粗搜后精搜”的直观认知。正弦与余弦函数的周期性sin和cos函数在[-1, 1]之间波动。当函数值在0附近时更新步长很小利于开发当函数值接近1或-1时更新步长很大利于探索。随机角度r_2使得这种波动模式不可预测增加了跳出局部最优的能力。随机权重r_3这个参数虽然不如r_1关键但也能起到微调作用。你可以让它是一个固定范围的随机数也可以让它也随着迭代变化。实操心得在实际应用中我有时不会严格使用线性递减的r_1。对于一些特别复杂、多峰的函数我会尝试让r_1非线性递减比如用指数衰减(r_1 a * exp(-t/T))或者在迭代中期保持一段平台期这能给算法更多中期探索的时间有时能带来更好的效果。但这属于进阶调参新手建议先用标准线性版本。3. 算法流程与代码实现拆解理解了原理我们把它翻译成可执行的步骤和代码。这里我用Python来实现因为它是在数学建模中最常用、最灵活的工具之一。我们将对一个经典的多元测试函数——Rastrigin函数进行寻优。这个函数以拥有大量局部极小值点而闻名全局最小值在原点(0,0,...,0)值为0非常适合测试算法的全局搜索能力。3.1 标准SCA算法步骤初始化参数设定种群大小N、最大迭代次数T、收敛因子初始值a、问题维度dim、变量的上下界[lb, ub]。初始化种群在解空间内随机生成N个候选解代理每个解是一个dim维的向量。计算每个解的适应度值即目标函数值。确定当前最优解找出初始种群中适应度最好的解记录其位置和适应度值作为全局最优P_g。进入主迭代循环 a. 更新收敛因子r_1 a - t * (a / T)。 b. 对种群中的每一个代理i i. 生成四个随机数r_2(范围[0, 2π])r_3(范围[0, 2])r_4(范围[0, 1])。 ii. 根据公式计算代理的新位置X_new。 iii.边界处理检查新位置的每一维是否超出了定义域[lb, ub]。如果超出常用的处理方法是将其拉回边界X_new min(max(X_new, lb), ub)或者随机重置到边界内。 iv. 计算新位置的适应度f_new。 v.贪婪选择比较f_new和代理原有适应度f_old。如果f_new更好对于最小化问题就是更小则用X_new和f_new更新该代理的位置和适应度。否则保留原状态。 c. 更新全局最优解P_g遍历更新后的种群找到最好的解如果比当前的P_g更好则替换。循环结束达到最大迭代次数T后输出最终的全局最优解P_g及其适应度值。3.2 Python代码实现与逐行解析下面是一个针对二维Rastrigin函数的最小化寻优的完整SCA实现。import numpy as np import matplotlib.pyplot as plt # 1. 定义目标函数Rastrigin Function (2维) def rastrigin(x): 计算Rastrigin函数值。 该函数在原点(0,0)有全局最小值0但存在大量局部极小点。 A 10 return A * len(x) sum([(xi**2 - A * np.cos(2 * np.pi * xi)) for xi in x]) # 2. 正余弦优化算法 (SCA) 主函数 def sine_cosine_algorithm(obj_func, dim, lb, ub, max_iter100, pop_size30, a2): 参数: obj_func: 目标函数要求最小化。 dim: 问题维度。 lb: 变量下界 (list或标量)。 ub: 变量上界 (list或标量)。 max_iter: 最大迭代次数。 pop_size: 种群大小。 a: 收敛因子初始值。 返回: best_solution: 找到的最优解。 best_fitness: 最优解对应的适应度值。 convergence_curve: 每次迭代的最优适应度记录用于画图。 # 初始化 # 确保lb和ub是数组形式 if not isinstance(lb, list): lb [lb] * dim if not isinstance(ub, list): ub [ub] * dim lb, ub np.array(lb), np.array(ub) # 随机初始化种群位置 positions np.random.uniform(lb, ub, (pop_size, dim)) fitness np.array([obj_func(ind) for ind in positions]) # 找到初始全局最优 best_idx np.argmin(fitness) best_solution positions[best_idx].copy() best_fitness fitness[best_idx] # 记录收敛过程 convergence_curve np.zeros(max_iter) # 主迭代循环 for t in range(max_iter): # 动态更新收敛因子 r1 r1 a - t * (a / max_iter) for i in range(pop_size): for j in range(dim): # 生成随机参数 r2 2 * np.pi * np.random.rand() # 随机角度 r3 2 * np.random.rand() # 随机权重 r4 np.random.rand() # 正弦/余弦选择器 # 核心更新公式 if r4 0.5: # 使用正弦部分更新 positions[i, j] positions[i, j] r1 * np.sin(r2) * np.abs(r3 * best_solution[j] - positions[i, j]) else: # 使用余弦部分更新 positions[i, j] positions[i, j] r1 * np.cos(r2) * np.abs(r3 * best_solution[j] - positions[i, j]) # 边界约束处理越界则拉回边界 positions[i] np.clip(positions[i], lb, ub) # 计算新位置的适应度 new_fitness obj_func(positions[i]) # 贪婪选择只有更好的解才被保留 if new_fitness fitness[i]: fitness[i] new_fitness # 如果当前个体更新后优于全局最优则更新全局最优 if new_fitness best_fitness: best_solution positions[i].copy() best_fitness new_fitness # 注意如果新解不好positions[i]已经被更新了但fitness[i]和全局最优没变。 # 这意味着下一次迭代这个代理会从一个可能更差的位置开始搜索。这是标准SCA的做法。 # 另一种变体是如果新解不好则拒绝这次更新即positions[i]回滚。你可以尝试比较两种策略。 convergence_curve[t] best_fitness # 可选打印进度 if (t1) % 20 0: print(f迭代 {t1}/{max_iter}, 当前最优值: {best_fitness:.6f}) return best_solution, best_fitness, convergence_curve # 3. 算法执行与结果可视化 if __name__ __main__: # 设置问题参数 dim 2 lb -5.12 # Rastrigin函数的典型定义域 ub 5.12 max_iter 200 pop_size 50 print(开始运行正余弦优化算法(SCA)...) best_sol, best_fit, conv_curve sine_cosine_algorithm( obj_funcrastrigin, dimdim, lblb, ubub, max_itermax_iter, pop_sizepop_size, a2 ) print(\n优化完成) print(f找到的最优解: {best_sol}) print(f对应的最优函数值: {best_fit}) # 绘制收敛曲线 plt.figure(figsize(10, 6)) plt.plot(conv_curve, linewidth2) plt.xlabel(迭代次数, fontsize12) plt.ylabel(最优适应度值, fontsize12) plt.title(SCA优化Rastrigin函数收敛曲线, fontsize14) plt.grid(True, linestyle--, alpha0.7) plt.tight_layout() plt.show() # 绘制搜索空间和种群最终分布仅适用于2维问题 if dim 2: fig plt.figure(figsize(12, 5)) # 子图1函数等高线及最优解 ax1 fig.add_subplot(121) x np.linspace(lb, ub, 100) y np.linspace(lb, ub, 100) X, Y np.meshgrid(x, y) Z np.zeros_like(X) for i in range(X.shape[0]): for j in range(X.shape[1]): Z[i, j] rastrigin([X[i, j], Y[i, j]]) cp ax1.contourf(X, Y, Z, levels50, cmapviridis) plt.colorbar(cp, axax1) ax1.scatter(best_sol[0], best_sol[1], colorred, s100, marker*, labelSCA最优解, zorder5) ax1.scatter(0, 0, colorwhite, s80, markerx, label理论全局最优(0,0), zorder5) ax1.set_xlabel(x1) ax1.set_ylabel(x2) ax1.set_title(Rastrigin函数等高线及最优解位置) ax1.legend() ax1.grid(True, alpha0.3) # 子图2收敛曲线 ax2 fig.add_subplot(122) ax2.plot(conv_curve, colordarkorange, linewidth2) ax2.set_xlabel(迭代次数) ax2.set_ylabel(最优适应度值) ax2.set_title(SCA收敛曲线) ax2.grid(True, linestyle--, alpha0.7) ax2.set_yscale(log) # 使用对数坐标更清晰地观察后期收敛 plt.tight_layout() plt.show()代码关键点解析与实操心得边界处理np.clipnp.clip函数是处理越界最简单高效的方法。在数学建模中变量常有物理意义约束如长度非负、比例在0-1之间这一步必不可少。另一种策略是“随机重置”即如果越界就在边界内重新随机生成一个值。对于SCAclip方法通常足够。贪婪选择代码中采用了严格的贪婪选择——只有新解更好时才替换。注意位置positions[i]在计算新适应度前已经被更新了。如果新解不好这个代理下一次迭代就会从这个“差位置”开始。这是原论文的标准流程。你也可以实现“拒绝更新”的变体即如果新解不好则positions[i]保持不变。根据我的经验在优化非常崎岖的函数时标准方法探索性更强而拒绝更新法则更稳定收敛速度可能稍快但容易早熟。建议都试试。全局最优引导注意best_solution在每次个体更新后都可能被更新。这意味着引导所有代理的目标P_i^t在单次迭代内是动态更新的。这加快了收敛速度但也可能增加陷入局部最优的风险。一个更保守的策略是在一次完整的种群迭代结束后再统一更新全局最优解然后用这个“旧”的最优解指导下一次迭代中的所有个体。后者探索能力更强。可视化的重要性收敛曲线图是调试算法的眼睛。如果曲线早期下降很快但后期平缓可能陷入局部最优需要增加探索如增大a或调整r3范围。如果曲线一直缓慢下降可能需要增加迭代次数或种群规模。二维问题的等高线图能直观显示最终种群是否聚集在最优解附近。4. 参数调优与性能提升实战SCA的性能很大程度上取决于参数设置。没有一套参数能通吃所有问题但有一些经验法则和调优思路。4.1 关键参数影响分析种群大小pop_size影响种群越大多样性越高全局探索能力越强但每次迭代的计算成本也越高。建议对于维度dim较低的问题如dim10pop_size在20-50之间通常足够。对于高维问题dim50可能需要100甚至更多的个体。一个常用的启发式规则是pop_size 10 * dim但也要考虑函数计算复杂度。实操心得在数学建模比赛中时间有限。我通常先设一个中等规模如30-50跑一遍看收敛情况。如果怀疑陷入局部最优再适当增大种群规模。不要盲目设大否则等待结果的时间会让你焦虑。最大迭代次数max_iter影响决定了算法搜索的“时长”。迭代次数不足可能无法收敛到满意解迭代次数过多则浪费时间。建议结合收敛曲线判断。当曲线在连续几十次迭代中下降幅度小于一个阈值如1e-6时可以认为已收敛。通常可以从100-500开始尝试。对于复杂问题可能需要1000。技巧在代码中实现一个早停机制。例如记录最近K次迭代最优值的变化如果变化小于阈值tol则提前终止循环。这能节省大量计算时间。收敛因子初始值a影响控制着迭代初期探索的步长上限。a越大初期探索范围越广。建议标准值是2。对于搜索空间特别大、或者已知最优解可能离初始随机种群较远的问题可以尝试增大到3或4。反之如果搜索空间较小或函数很平滑可以减小到1。进阶如前所述可以尝试非线性递减策略如r1 a * (1 - t/max_iter)**b其中b是一个指数b1时衰减更快初期探索时间短b1时衰减慢探索时间更长。随机权重r3的范围影响公式中r3控制着目标点P的影响力。原论文范围是[0, 2]。当r3 1时算法倾向于向P移动开发当r3 1时算法倾向于背离P或强调自身位置探索。调优你可以固定r3的范围也可以让它动态变化。例如让r3也随着迭代从2线性递减到0这样在迭代后期更强调开发。我个人的经验是对于多峰函数保持r3在[0,2]内随机波动效果就不错。4.2 针对复杂问题的SCA改进策略标准SCA有时在处理超高维、或者有复杂约束的问题时会显得力不从心。这里分享几种我实践过且有效的改进思路你可以将它们视为“插件”融入到基础代码中。精英保留策略做法在每次迭代中不直接用新种群完全替换旧种群而是将新旧种群合并从中选出适应度最好的pop_size个个体作为下一代。这保证了历史最优解不会丢失。代码修改在主循环末尾将positions和上一代的positions_old合并计算合并后的适应度然后排序并选取前pop_size个。效果能显著提高收敛的稳定性和精度尤其适合单峰或不太复杂的多峰函数。代价是计算量翻倍。对立学习初始化做法在种群初始化时不仅随机生成一组解还生成这组解的“对立解”每一维用lbub - xi计算。然后从这两组解中挑选更好的pop_size个作为初始种群。原理增加初始种群的多样性使其更均匀地分布在解空间提高找到全局最优区域的概率。效果对于初始位置敏感的问题这是一个简单有效的“开胃菜”几乎不增加后续迭代的计算负担。自适应参数调整做法让r1或r3不是简单地线性变化而是根据搜索进程自适应调整。例如如果连续多代最优解没有改善可以临时增大r1以增强探索如果改善很快则可以加快r1的衰减以专注于开发。实现需要定义一个“停滞计数器”和改善率指标。逻辑稍复杂但自动化程度高。心得这是进阶玩法需要较多的实验来设计合理的自适应规则。在时间紧张的数学建模竞赛中手动调参结合多次运行可能更直接。混合算法做法将SCA与其他算法的优势步骤结合。例如用SCA进行全局探索在迭代后期引入单纯形法或模式搜索进行局部开发。或者在SCA的位置更新公式中融入粒子群算法中“个体历史最优”的信息。案例我曾在解决一个带复杂约束的工程优化问题时采用“SCA 可行性规则处理约束 局部搜索”的混合策略。SCA负责在可行域内粗搜局部搜索负责对找到的较优解进行精细打磨。5. 在数学建模中的典型应用场景与实战案例SCA作为一种无梯度优化器在数学建模中适用于目标函数复杂、不可微、甚至没有显式表达式的“黑箱”优化问题。5.1 适用场景分析连续变量优化问题这是SCA的主场。只要你的决策变量是连续的并且有明确的上下界SCA就可以尝试。例如资源分配问题资金、人力、物料在多个项目间的分配目标是总效益最大或成本最小。参数拟合问题根据实验数据调整模型参数如指数衰减模型的系数使得模型预测值与实测值误差最小。目标函数通常是误差平方和。工程设计优化如桁架结构设计优化各杆件的截面尺寸在满足应力、位移约束下使总重量最轻。组合优化问题的连续松弛对于一些本质是离散如0-1规划、整数规划的问题有时可以先在连续域用SCA寻优再将结果通过四舍五入、贪婪算法等方法映射回离散解。这可以作为求优质可行解的一个启发式步骤。机器学习超参数调优虽然网格搜索和随机搜索更常用但SCA也可以用于寻找SVM的C和gamma参数、神经网络的学习率等连续超参数的最佳组合尤其当评估模型一次的成本很高时SCA这种基于种群的算法可能比顺序方法更高效。5.2 一个建模竞赛案例无人机基站部署优化假设我们遇到这样一个赛题简化版在一条长100km的高速公路上需要部署若干个无人机移动基站为行驶中的车辆提供连续通信覆盖。每个基站的覆盖半径是Rkm。已知车流量分布不均匀某些路段需求高。目标是确定基站的数量和位置使得在满足全覆盖的前提下所有车辆到最近基站的平均距离加权和最小权重为路段车流量。建模与SCA求解思路变量定义设需要部署N个基站N本身也可作为优化变量但会使问题变复杂通常先固定N再优化。那么决策变量就是N个基站的坐标(x1, x2, ..., xN)其中0 xi 100。目标函数对于给定的基站位置我们可以将高速公路离散化为许多小段。对每一小段j中心位置为pos_j车流量为w_j计算它到所有基站的最小距离d_j min(|pos_j - xi|)。则目标函数为F sum(w_j * d_j)。这个函数关于xi是不可微、多峰的移动一个基站可能会剧烈改变许多段的最近距离。约束处理全覆盖约束意味着max(d_j) R。这是一个硬约束。在SCA中处理约束常用罚函数法。我们将目标函数改造为F_penalty sum(w_j * d_j) M * max(0, max(d_j) - R)^2其中M是一个很大的正数罚因子。这样违反覆盖约束的解会有很大的惩罚值从而在优化过程中被淘汰。SCA求解维度dim N。边界lb [0]*N,ub [100]*N。适应度函数即上面的F_penalty。运行设置合适的pop_size和max_iter运行SCA。由于N不同最优解不同可以遍历N从最小值ceil(100/(2R))开始递增分别用SCA求解选择总成本F最小的那个N和对应的位置作为最终方案。在这个案例中SCA的优势凸显出来目标函数计算简单但形态复杂梯度信息难以获取。SCA的随机波动特性使其能够跳出“将基站均匀布置”这种直观但可能非最优的局部解去探索一些根据车流量权重进行非均匀部署的更优方案。6. 常见陷阱、调试技巧与性能对比即使理解了原理和代码第一次使用时也难免踩坑。下面是我总结的一些常见问题和解决方法。6.1 常见问题排查表问题现象可能原因排查与解决思路收敛过早结果明显是局部最优1. 种群多样性过早丧失。2. 收敛因子r1衰减过快。3. 种群规模pop_size太小。1. 增加pop_size如从30增至50或100。2. 减缓r1的衰减速度增大max_iter或减小初始值a。3. 引入精英保留或对立学习策略。4. 检查r3的范围确保其有足够概率小于1以促进探索。收敛速度非常慢曲线下降平缓1. 迭代次数不足。2.r1初始值太小探索步长不足。3. 目标函数计算过于耗时导致总迭代次数受限。1. 增加max_iter。2. 适当增大a如从2增至3。3. 优化目标函数代码减少计算量。如果可能尝试向量化计算。4. 考虑使用更小的种群规模以增加迭代轮数在探索和开发间权衡。结果不稳定每次运行差异大1. 算法随机性大特别是对于非常平坦或多峰的函数。2. 种群规模或迭代次数设置处于临界值。1.这是元启发式算法的正常现象。对于重要问题应独立运行算法多次如30次取最好解、最差解、平均解和标准差来综合评价算法性能。2. 适当增大pop_size和max_iter可以提高稳定性。3. 考虑使用精英保留策略锁定历史最优解。算法似乎“卡住”迭代中期后毫无改进1. 所有个体都聚集到了同一个局部最优点。2. 贪婪选择策略过于激进差解被直接丢弃缺乏跳出机制。1. 在位置更新公式中可以以一定的小概率让代理不向当前全局最优解P_g学习而是向一个随机选择的个体学习甚至进行完全随机的位置扰动。2. 尝试“拒绝更新”变体保留一部分较差解以维持多样性。3. 采用混合策略在检测到停滞时重置部分最差个体的位置。变量越界频繁影响搜索边界处理策略不当。1. 确保clip函数正确应用。2. 可以尝试“反射”边界处理如果x_new lb, 则令x_new lb (lb - x_new)若反射后仍越界则设为lb。余弦处理类似。这能让个体在边界处“反弹”有时比简单截断更好。6.2 性能对比与算法选择SCA不是万能的。在数学建模中选择哪种优化算法取决于问题的具体特征。vs. 粒子群算法PSO也有“个体历史最优”和“全局最优”的记忆社会性更强通常收敛速度比SCA快特别是在早期。但SCA的周期性波动机制使其在探索能力上有时更胜一筹对于多峰函数找到全局最优的概率可能更高。选择建议如果问题疑似多峰、需要强探索优先尝试SCA如果问题相对简单、追求快速得到一个不错解PSO可能更快。vs. 遗传算法GA通过交叉、变异、选择操作探索能力极强但收敛速度通常慢于SCA和PSO。GA更擅长处理离散变量。选择建议对于连续变量优化SCA/PSO通常比GA效率更高对于混合整数规划或组合优化GA或模拟退火更有优势。vs. 差分进化算法DE和SCA在概念上有些相似都是基于向量差分的扰动。DE的变异策略非常丰富鲁棒性很强是许多复杂优化问题的首选。SCA的公式更简洁参数更少更容易理解和实现。选择建议如果你是优化新手可以从SCA入手如果你需要解决一个非常棘手的工程问题并且有时间精细调参DE可能提供更高的上限。终极建议在数学建模竞赛中时间就是生命。我的习惯是对于一个新的优化问题首先用SCA快速跑一遍。因为它代码简单参数少主要调pop_size和max_iter能很快给出一个基准结果。如果结果不满意再根据问题的特点如是否高维、是否多峰、是否有约束考虑切换到PSO、DE或尝试SCA的改进版本。把SCA作为你优化工具箱中的一把可靠“瑞士军刀”在大多数情况下它都能交出一份合格的答卷。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻