正在加载中...

展开本页目录
算法教程SCA-正弦余弦算法

SCA-正弦余弦算法

No.204 · 在线教程

本项目实现的是 SCA(Sine Cosine Algorithm,正弦余弦算法)单目标连续优化版本,基础迭代器位于 SCA-正弦余弦算法/core/sca.py,统一计算与导出位于 core/scacalculator.py,界面实际通过 ui/uploadwidget.py…

SCA-正弦余弦算法

1. 方法概述

本项目实现的是 SCA(Sine Cosine Algorithm,正弦余弦算法)单目标连续优化版本,基础迭代器位于 SCA-正弦余弦算法/core/sca.py,统一计算与导出位于 core/sca_calculator.py,界面实际通过 ui/upload_widget.py 直接启动分析线程。项目支持:

  • 内置基准函数 sphere/rosenbrock/rastrigin/ackley
  • 上传数据代理优化;
  • 单次运行的收敛曲线与最优解导出;
  • 复现实验脚本 repro_sca.py

算法求解的基本问题为

$$ \min_{\boldsymbol{x}\in\Omega} f(\boldsymbol{x}) \tag{1} $$

本项目没有多次运行统计,也没有均值或标准差曲线。

2. 问题定义与上传代理优化

上传模式下,项目先训练 RandomForestRegressor(n_estimators=300)

$$ \hat f(\boldsymbol{x})=\frac{1}{300}\sum_{b=1}^{300}T_b(\boldsymbol{x}) \tag{2} $$

内部目标写为

$$ \tilde f(\boldsymbol{x})=\sigma \hat f(\boldsymbol{x}), \qquad \sigma= \begin{cases} 1, & \text{min}\\ -1, & \text{max} \end{cases} \tag{3} $$

上传模式下的逐维边界仍采用样本最小值和最大值:

$$ l_j=\min_n x_j^{(n)},\qquad u_j=\max_n x_j^{(n)} \tag{4} $$

收敛曲线与最终最优值在导出时通过 display_curvepredict_actual 恢复为真实方向。

3. 核心数学模型

3.1 初始化

种群初始化为

$$ \boldsymbol{x}_i^{(0)}=\boldsymbol{l}+\boldsymbol{r}_i\odot(\boldsymbol{u}-\boldsymbol{l}), \qquad \boldsymbol{r}_i\sim U(0,1)^d \tag{5} $$

并记录初始最优个体 \(\boldsymbol{x}_{best}^{(0)}\)。

3.2 线性衰减控制因子

代码中控制因子 r1 按线性方式衰减:

$$ r_1(t)=a-t\frac{a}{T} \tag{6} $$

其中 \(a\) 对应界面参数 a

3.3 正弦余弦位置更新

对第 \(i\) 个个体的第 \(j\) 维,项目每轮随机生成

$$ r_2\sim U(0,2\pi),\qquad r_3\sim U(0,2),\qquad r_4\sim U(0,1) \tag{7} $$

当 \(r_4<0.5\) 时,按正弦形式更新:

$$ x_{ij}^{(t+1)} = x_{ij}^{(t)} +r_1(t)\sin(r_2)\left|r_3x_{best,j}^{(t)}-x_{ij}^{(t)}\right| \tag{8} $$

当 \(r_4\ge 0.5\) 时,按余弦形式更新:

$$ x_{ij}^{(t+1)} = x_{ij}^{(t)} +r_1(t)\cos(r_2)\left|r_3x_{best,j}^{(t)}-x_{ij}^{(t)}\right| \tag{9} $$

新位置随后被截断到边界内:

$$ \boldsymbol{x}_i^{(t+1)}\leftarrow \operatorname{clip}\big(\boldsymbol{x}_i^{(t+1)},\boldsymbol{l},\boldsymbol{u}\big) \tag{10} $$

3.4 最优值更新与收敛曲线

项目在每轮对全体个体重新评估,若出现更优个体则更新全局最优:

$$ \boldsymbol{x}_{best}^{(t+1)} = \operatorname*{arg\,min}_{1\le i\le N} f(\boldsymbol{x}_i^{(t+1)}) \tag{11} $$

对应收敛曲线记录为

$$ c^{(t)}=f\big(\boldsymbol{x}_{best}^{(t)}\big) \tag{12} $$

代码使用生成器 yield 把每轮的 iteration/best_cost/best_position 送给上层计算器。

4. 算法流程

结合 core/sca.pycore/sca_calculator.pyutils/problem_definition.pyui/upload_widget.py,本项目 SCA 的流程为:

  1. 选择基准函数或上传代理优化模式。
  2. 读取边界、种群规模、最大迭代次数和常数 a
  3. 按式(5)初始化种群并评估初始适应度。
  4. 每轮计算线性衰减因子 \(r_1(t)\)。
  5. 对每个维度根据式(8)或式(9)执行正弦/余弦更新。
  6. 执行边界截断并更新当前全局最优。
  7. 记录 convergence_curve、最佳位置向量并导出结果。

5. 关键参数说明

  • population_size:搜索个体数。
  • max_iter:最大迭代次数。
  • a:线性衰减控制因子初值。
  • dim:问题维度,上传模式下由数据自动决定。
  • seed:随机种子。若设置,则通过 np.random.seed 固定全局随机序列。

6. 评价指标与输出结果解释

项目输出相对精简,主要包括:

  • Parameters:问题配置和 SCA 参数;
  • Summary:问题名、最优值、维度;
  • Convergence:每轮 best_fitness
  • BestPosition:最终最优解向量;
  • Charts:收敛曲线和最优解分量图路径;
  • 上传模式下附加 BoundsUploadedDataSurrogateMetrics

需要注意,SCA 模块只保存单次运行结果,没有 runsmean curve 或箱线图。因此,论文结果部分更适合采用“Summary 报告最优值、Convergence 展示单次收敛轨迹、BestPosition 作为附录中的最优解向量表”的写法,而不应写成多次独立运行统计。若为上传代理模式,则建议在正文或附录中补充 BoundsSurrogateMetrics,说明搜索空间与代理误差来源。

7. 论文写作模板

可在论文方法部分表述为:

“本文采用正弦余弦算法(SCA)进行单目标连续优化。算法在每一代中通过线性衰减因子控制搜索范围,并针对每个变量维度随机选择正弦或余弦更新方式,使个体围绕当前全局最优解进行跳跃式搜索。对于数据驱动场景,本文进一步使用随机森林构建代理目标,并在样本边界内实施 SCA 搜索。”

7.1 结果部分补充模板

若需把实验结果直接写入论文结果部分,可进一步表述为:

“表X给出了算法在当前问题上的最优目标值、平均最优值和标准差(如有多次独立运行),图X展示了收敛曲线变化。结果表明,该算法在迭代前期能够快速逼近优势区域,并在后期逐步趋于稳定,最终获得最优解 \(\boldsymbol{x}^*\) 及其对应目标值 \(f(\boldsymbol{x}^*)\)。对于上传代理优化场景,结合代理模型误差指标可认为该最优结果具有一定的数据驱动解释性。”

7.2 写作替换提示

为便于直接落稿,正文撰写时可将结果文件中的字段替换为以下论文措辞:

  • best_fitness 或结果汇总表中的最优值,可写为“最优目标函数值”或“最优适应度值”;
  • BestSolutionBestPositionBest_Solution最优解 等工作表,可统一写为“最优决策变量组合 \(\boldsymbol{x}^*\)”;
  • Convergence收敛曲线 等图表,可统一写为“算法收敛曲线图”;
  • SurrogateMetrics 可写为“代理模型训练误差与拟合优度指标”,如 RMSE、MAE、\(R^2\)。

7.3 可直接替换的论文结果段落

若需进一步直接落稿,可按以下模板替换其中的表号、图号和数值:

“由表X可知,该算法在[问题名称]上的最优目标值为 [best_fitness]。若进行了多次独立运行,则其平均最优值与标准差分别为 [mean_best_fitness] 和 [std_best_fitness]。由图X所示收敛曲线可见,算法在迭代前期快速逼近优势区域,后期逐渐趋于平稳,表现出较好的收敛性。最终得到的最优决策变量组合为 \(\boldsymbol{x}^*=[x_1^*,x_2^*,\ldots,x_d^*]\)。若采用上传代理优化模式,则结合 RMSE、MAE 和 \(R^2\) 等代理误差指标,可认为该优化结果具有一定的数据驱动可信度。”

8. 实现说明与注意事项

  • 本实现是标准单目标 SCA,适合连续变量优化。
  • 核心随机数来自 numpy.random 全局状态;若设置 seed,则整个优化过程完全由该全局种子控制。
  • 上传代理模式仍然是单目标优化,没有额外的第二目标或多样性项。
  • 本模块只记录单次最优收敛曲线,若论文需要稳健性统计,需要在界面外自行重复实验。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • Parameters 表可写为:表X SCA 参数设置与问题配置。
  • Summary 表可写为:表X SCA 最优值摘要。
  • Convergence 表可写为:表X SCA 单次运行收敛轨迹。
  • BestPosition 表可写为:表X SCA 求得的最优解向量。
  • Charts 中收敛图建议写为:图X 正弦余弦算法收敛曲线。

9.2 终审说明

  • 当前实现只有单次运行,正文不应写均值曲线、标准差或箱线图。
  • 上传代理模式下,BoundsSurrogateMetrics 应作为搜索空间和代理误差的配套说明同时出现。

9.3 全量强化补充

本次全量强化绑定的真实结果目录为 具体的算法3/优化与多目标/SCA-正弦余弦算法/results/SCA-正弦余弦算法分析结果_20260329_171642。主结果文件为 SCA-正弦余弦算法分析结果_20260329_171642.xlsx,实际工作表为 ParametersSummaryConvergenceBestPositionCharts;当前主图文件位于 charts/convergence.pngcharts/best_position.png

需要如实区分历史目录差异:SCA 的一些旧结果目录同时保留了 *_reproduce.xlsxsca_reproduce_*.py 和输出日志,但本次绑定的 20260329_171642 目录并没有这些额外再生产物,只包含主工作簿、图目录和 repro_sca.py。因此这篇文档应明确说明:当前选用的是结构更干净的一轮结果,不把旧目录里的 _reproduce.xlsx 习惯性套到这份主证据上。

repro_sca.py 的真实口径是 benchmark:problem = 'sphere'problem_mode = 'benchmark'dim = 30lb = -100ub = 100,并通过 params.setdefault('output_dir', str(CURRENT_DIR)) 在当前目录再次输出结果。因此这篇文档当前绑定的是基准函数复算链路,而不是上传代理链路。

10. 软件实现核查补充(2026-07)

本篇对应的软件源码目录是 具体的算法3/优化与多目标/SCA-正弦余弦算法。软件实现支持优化模式和上传数据代理优化模式;上传模式通过数值表训练代理目标后运行正弦余弦搜索。文档中的正弦/余弦位置更新公式可以保留,但软件结果应以 SCA_ParamsConvergenceBest_SolutionCharts 解释。

当前较新的代表性目录为 results/SCA-正弦余弦算法分析结果_20260517_144240-优化模式results/SCA-正弦余弦算法分析结果_20260517_144251-上传数据代理优化。主工作簿通常包含 SummaryProblemSCA_ParamsBoundsRun_SummaryHistory_MeanHistory_AllBest_SolutionCharts;上传模式额外包含 UploadedProblemUploadedDataSurrogateMetrics。如果正文提到最佳解分量,应和对应图表一起引用,而不是只写最优值。

当前图表稳定输出为 SCA_convergence_时间戳.pngSCA_best_solution_时间戳.png。复现代码位于 复现代码/优化模式/复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/sca_sample.xlsx,复现结果进入 repro_outputs/。旧文中的 benchmark 目录可作为历史证据保留,但当前用户说明应优先按 20260517 新目录。