SA-模拟退火
本项目实现的是 SA(Simulated Annealing,模拟退火)单目标连续优化版本,核心代码位于 SA-模拟退火/core/sacalculator.py,界面实际通过 ui/uploadwidget.py -> ui/resultswidget.py 调用 SACal…
SA-模拟退火
1. 方法概述
本项目实现的是 SA(Simulated Annealing,模拟退火)单目标连续优化版本,核心代码位于 SA-模拟退火/core/sa_calculator.py,界面实际通过 ui/upload_widget.py -> ui/results_widget.py 调用 SACalculator.run_analysis。项目支持:
- 内置基准函数与
CustomExpression; - 上传数据后训练随机森林代理;
gaussian/cauchy/uniform三种邻域扰动;- 温度曲线、收敛曲线和最优解分量图导出。
项目求解的基本问题为
$$ \min_{\boldsymbol{x}\in\Omega} f(\boldsymbol{x}) \tag{1} $$
与前面的群智能算法不同,该实现是单次运行的退火过程,不提供 runs 多次重复实验选优。
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} $$
导出时通过 predict_actual 恢复最佳预测值,并把收敛曲线中的 current_fitness 与 best_fitness 恢复为真实方向。
3. 核心数学模型
3.1 初始化
初始解按均匀分布产生:
$$ \boldsymbol{x}^{(0)}=\boldsymbol{l}+\boldsymbol{r}\odot(\boldsymbol{u}-\boldsymbol{l}), \qquad \boldsymbol{r}\sim U(0,1)^d \tag{5} $$
并记录初始最优解 \(\boldsymbol{x}_{best}^{(0)}=\boldsymbol{x}^{(0)}\)。邻域步长向量定义为
$$ \boldsymbol{s}=\max\big((\boldsymbol{u}-\boldsymbol{l})\cdot \lambda,10^{-12}\big) \tag{6} $$
其中 \(\lambda\) 对应参数 step_scale。
3.2 邻域提案
若 neighbor_mode=gaussian,则新解提案为
$$ \boldsymbol{x}'=\boldsymbol{x}+\mathcal{N}(\boldsymbol{0},\mathbf{I})\odot \boldsymbol{s} \tag{7} $$
若 neighbor_mode=cauchy,则
$$ \boldsymbol{x}'=\boldsymbol{x}+\boldsymbol{c}\odot \boldsymbol{s}, \qquad \boldsymbol{c}\sim \mathrm{Cauchy}(0,1)^d \tag{8} $$
若 neighbor_mode=uniform,则
$$ \boldsymbol{x}'=\boldsymbol{x}+(2\boldsymbol{u}_r-\boldsymbol{1})\odot \boldsymbol{s}, \qquad \boldsymbol{u}_r\sim U(0,1)^d \tag{9} $$
随后执行边界截断:
$$ \boldsymbol{x}'\leftarrow \operatorname{clip}(\boldsymbol{x}',\boldsymbol{l},\boldsymbol{u}) \tag{10} $$
3.3 Metropolis 接受准则
记目标增量为
$$ \Delta f=f(\boldsymbol{x}')-f(\boldsymbol{x}) \tag{11} $$
代码采用标准 Metropolis 接受概率:
$$ P(\text{accept})= \begin{cases} 1, & \Delta f\le 0\\ \exp(-\Delta f/T), & \Delta f>0 \end{cases} \tag{12} $$
每个温度层执行 steps_per_temp=L 次邻域采样,接受率记录为
$$ \mathrm{acc\_rate}_t=\frac{n_t^{accept}}{L} \tag{13} $$
3.4 温度衰减
项目采用几何降温:
$$ T_{t+1}=\max(T_{\min},\alpha T_t) \tag{14} $$
其中初始温度为 \(T_1=T_{\max}\)。因此这里的 max_iter 实际表示“温度层数”,而不是总函数评价次数。总评价次数约为
$$ 1+T\cdot L \tag{15} $$
3.5 收敛记录
第 \(t\) 个温度层结束后,项目记录
$$ \big(t,\ T_t,\ f(\boldsymbol{x}_t),\ f(\boldsymbol{x}_{best,t}),\ \mathrm{acc\_rate}_t\big) \tag{16} $$
并把当时的最优位置存入 best_positions 历史表。
4. 算法流程
结合 core/sa_calculator.py、utils/problem_definition.py、ui/upload_widget.py 与 ui/results_widget.py,本项目 SA 的流程为:
- 选择内置基准函数、自定义表达式或上传代理优化模式。
- 解析边界、初始温度、终止温度、降温率和邻域参数。
- 按式(5)初始化当前解与最优解。
- 每个温度层执行
steps_per_temp次邻域提案与 Metropolis 接受。 - 按式(14)更新温度,并记录温度、当前值、最优值和接受率。
- 导出
Convergence、BestPosition、上传样本信息及图表。 - 生成复现实验脚本
repro_sa.py。
5. 关键参数说明
max_iter:温度层数。steps_per_temp:每个温度层的 Metropolis 采样次数。t_max、t_min:初始温度和最低温度。alpha:几何降温系数。step_scale:邻域步长比例。neighbor_mode:gaussian、cauchy或uniform。seed:随机种子。
6. 评价指标与输出结果解释
项目输出的核心表和图包括:
Parameters:退火参数、问题模式与边界设置;Summary:best_fitness、目标函数名、问题模式;BestPosition:最终最优解向量;Convergence:每一温度层的temperature/current_fitness/best_fitness/acceptance_rate;Charts:temperature.png、convergence.png、best_position.png等图表路径索引。
上传模式下还会追加 Bounds、UploadedData、SurrogateMetrics。
与很多简化 SA 说明不同,这里代码真实输出了 acceptance_rate,论文中可以把它当作退火过程活跃度的辅助指标。论文结果部分建议按“Summary 给出最优值、Convergence 说明温度层内搜索过程、BestPosition 列出最优解向量”的顺序组织,其中 BestPosition 仅对应最优位置,不包含最优目标值。若为上传代理模式,还应把 SurrogateMetrics 与最终最优预测结果同时呈现。
7. 论文写作模板
可在论文方法部分表述为:
“本文采用模拟退火算法(SA)求解单目标连续优化问题。算法在给定温度层内重复执行邻域扰动与 Metropolis 接受判定,并通过几何降温策略逐步降低搜索温度。为适应不同问题尺度,本文把邻域步长设置为变量边界跨度的固定比例,并分别支持高斯、柯西和均匀分布三种扰动模式。对于数据驱动问题,本文先在样本上训练随机森林代理模型,再利用 SA 在样本边界内搜索最优预测解。”
7.1 结果部分补充模板
若需把实验结果直接写入论文结果部分,可进一步表述为:
“表X给出了算法在当前问题上的最优目标值、平均最优值和标准差(如有多次独立运行),图X展示了收敛曲线变化。结果表明,该算法在迭代前期能够快速逼近优势区域,并在后期逐步趋于稳定,最终获得最优解 \(\boldsymbol{x}^*\) 及其对应目标值 \(f(\boldsymbol{x}^*)\)。对于上传代理优化场景,结合代理模型误差指标可认为该最优结果具有一定的数据驱动解释性。”
7.2 写作替换提示
为便于直接落稿,正文撰写时可将结果文件中的字段替换为以下论文措辞:
best_fitness或结果汇总表中的最优值,可写为“最优目标函数值”或“最优适应度值”;BestSolution、BestPosition、Best_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. 实现说明与注意事项
- 本实现是单次退火过程,不提供多次独立运行统计。
max_iter对应温度层数,不是总函数评价次数;总评价次数还要乘以steps_per_temp。CustomExpression会通过安全eval计算,并强制检查结果是否为有限数值。- 上传代理模式下,最佳值与收敛曲线在导出前都会恢复成真实优化方向。
9. 单篇终审补充
9.1 图题与表题对齐建议
Parameters表可写为:表X SA 退火参数与问题配置。Summary表可写为:表X SA 最优值摘要。BestPosition表可写为:表X SA 求得的最优解向量。Convergence表可写为:表X SA 温度层搜索历史与接受率。Charts中temperature.png可写为:图X SA 温度衰减过程。Charts中convergence.png可写为:图X SA 最优值收敛曲线。
9.2 终审说明
- 当前实现为单次退火,不应写多次运行均值和标准差。
Convergence不只是收敛值,还包含acceptance_rate,正文如要体现退火活跃度应优先引用这一列。
9.3 全量强化补充
本次全量强化绑定的真实结果目录为 具体的算法3/优化与多目标/SA-模拟退火/results/SA-模拟退火分析结果_20260101_041118。主结果文件为 SA-模拟退火分析结果_20260101_041118.xlsx,实际工作表为 Parameters、Summary、BestPosition、Convergence、Charts。根据当前磁盘索引,图表应位于同目录下 charts/best_position.png、charts/convergence.png、charts/temperature.png,但本轮 results 快照里只直接列出了工作簿,说明图片可能未在当前层级完整保留,或已由旧版本导出后清理。
因此这篇文档要如实区分两件事:一是工作簿结构已经能被真实核验;二是图文件在当前磁盘快照里不像 AOA、SCA 那样可直接逐个列出。正文若引用 SA 的工程证据,可以放心引用主工作簿和其五张工作表;若要逐一引用图路径,建议后续再对该目录补跑一次,确保 charts/ 实物完整落盘。
当前 results 目录里也没有直接看到 repro_sa.py,因此本轮只能确认主结果工作簿已存在,不能把 repro 链路写成已完整核验通过。这里应保持保守描述,不把代码层面“支持导出图表索引”误写成当前磁盘上“所有图表已可逐一复核”。
10. 软件实现核查补充(2026-07)
本篇对应的软件源码目录是 具体的算法3/优化与多目标/SA-模拟退火。软件实现支持优化模式和上传数据代理优化模式;上传模式将数值表训练为代理目标后执行模拟退火。文档中的初温、降温、接受准则和扰动策略公式可以保留,但软件结果应以 SA_Params、Run_Summary、History_Mean、History_All 和 Best_Solution 解读。
当前较新的代表性目录为 results/SA-模拟退火分析结果_20260517_144210-优化模式 与 results/SA-模拟退火分析结果_20260517_144221-上传数据代理优化。主工作簿通常包含 Summary、Problem、SA_Params、Bounds、Run_Summary、History_Mean、History_All、Best_Solution、Charts;上传模式额外包含 UploadedProblem、UploadedData、SurrogateMetrics。与旧文相比,当前版本更适合按统一结果表来解释退火过程,而不是只写公式。
当前图表稳定输出为 SA_convergence_时间戳.png。复现代码位于 复现代码/优化模式/ 或 复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/sa_sample.xlsx,复现结果进入 repro_outputs/。若正文写上传代理结果,应同步描述代理模型训练质量。