SO-蛇优化
本项目实现的是 SO(Snake Optimization,蛇优化)单目标连续优化版本,核心代码位于 SO-蛇优化/core/so.py,界面调用链为 ui/uploadwidget.py -> ui/resultswidget.py。代码支持两类问题来源:
SO-蛇优化
1. 方法概述
本项目实现的是 SO(Snake Optimization,蛇优化)单目标连续优化版本,核心代码位于 SO-蛇优化/core/so.py,界面调用链为 ui/upload_widget.py -> ui/results_widget.py。代码支持两类问题来源:
benchmark:内置标准测试函数;upload_surrogate:上传数据后训练随机森林代理,并在样本边界内搜索最优解。
项目内部统一按最小化问题求解:
$$ \min_{\boldsymbol{x}\in\Omega} f(\boldsymbol{x}) \tag{1} $$
与前面一些算法不同,这个目录当前实现为单次运行,不包含 runs/run_times 多次独立重复实验框架。
2. 问题定义与上传代理优化
上传模式下,项目会先对数值特征训练 RandomForestRegressor(n_estimators=300),得到代理目标
$$ \hat f(\boldsymbol{x})=\frac{1}{300}\sum_{b=1}^{300}T_b(\boldsymbol{x}) \tag{2} $$
若界面选择“最大化”,则 utils/problem_definition.py 会把内部优化目标写成
$$ \tilde f(\boldsymbol{x})=\sigma \hat f(\boldsymbol{x}), \qquad \sigma= \begin{cases} 1, & \text{min}\\ -1, & \text{max} \end{cases} \tag{3} $$
导出阶段再通过 predict_actual 与 display_curve 恢复成真实预测值。上传模式的逐维边界来自样本特征列的极值:
$$ l_j=\min_n x_j^{(n)}, \qquad u_j=\max_n x_j^{(n)} \tag{4} $$
3. 核心数学模型
3.1 种群划分与初始化
项目先把总种群划分为雄蛇与雌蛇两组:
$$ N_m=\operatorname{round}\!\left(\frac{N}{2}\right), \qquad N_f=N-N_m \tag{5} $$
随后分别在边界内均匀初始化:
$$ \boldsymbol{X}_{m,i}^{(0)},\boldsymbol{X}_{f,i}^{(0)} \sim U(\boldsymbol{l},\boldsymbol{u}) \tag{6} $$
初始“食物”位置由当前雄蛇最优与雌蛇最优中更优者决定:
$$ \boldsymbol{X}_{food}^{(0)} = \operatorname*{arg\,min}\big(f(\boldsymbol{X}_{best,m}^{(0)}),\,f(\boldsymbol{X}_{best,f}^{(0)})\big) \tag{7} $$
3.2 状态变量
第 \(t\) 轮迭代时,代码计算温度因子与食物量因子:
$$ \mathrm{Temp}=\exp\!\left(-\frac{t}{T}\right), \qquad Q=\min\!\left(1,\ C_1\exp\!\left(\frac{t-T}{T}\right)\right) \tag{8} $$
其中实现中固定
Threshold = 0.25Threshold2 = 0.6C1 = 0.5C2 = 0.05C3 = 2
于是状态切换可以概括为
$$ \text{state}(t)= \begin{cases} \text{exploration}, & Q<0.25\\ \text{food exploitation}, & Q\ge 0.25,\ \mathrm{Temp}>0.6\\ \text{fight}, & Q\ge 0.25,\ \mathrm{Temp}\le 0.6,\ r>0.6\\ \text{mating}, & \text{otherwise} \end{cases} \tag{9} $$
3.3 无食物探索阶段
当 \(Q<\text{Threshold}\) 时,雄蛇和雌蛇都随机选择组内个体作为参考领导者。代码先计算
$$ A=\exp\!\left(-\frac{f_{rand}}{f_i+\varepsilon}\right), \qquad F\in\{+1,-1\} \tag{10} $$
再按下式更新位置:
$$ \boldsymbol{x}_{i,new} = \boldsymbol{x}_{rand} +F\,C_2\,A\,\boldsymbol{\xi}, \qquad \boldsymbol{\xi}\sim U(\boldsymbol{l},\boldsymbol{u}) \tag{11} $$
这里雄蛇和雌蛇各自都在本组内部执行相同结构的探索。
3.4 向食物靠拢的开发阶段
当 \(Q\ge \text{Threshold}\) 且 \(\mathrm{Temp}>\text{Threshold2}\) 时,个体围绕当前食物位置移动:
$$ \boldsymbol{x}_{i,new} = \boldsymbol{X}_{food} +C_3\,F\,\mathrm{Temp}\,\boldsymbol{r}\odot(\boldsymbol{X}_{food}-\boldsymbol{x}_i), \qquad \boldsymbol{r}\sim U(0,1)^d \tag{12} $$
3.5 Fight 阶段
当 \(\mathrm{Temp}\) 已降低且随机数大于 \(0.6\) 时,雄蛇朝雌蛇最优靠拢、雌蛇朝雄蛇最优靠拢。代码分别构造
$$ F_M=\exp\!\left(-\frac{f_{best,f}}{f_{m,i}+\varepsilon}\right), \qquad F_F=\exp\!\left(-\frac{f_{best,m}}{f_{f,i}+\varepsilon}\right) \tag{13} $$
并更新为
$$ \boldsymbol{X}_{m,i}^{new} = \boldsymbol{X}_{m,i} +C_3\,F_M\,\boldsymbol{r}\odot\big(Q\boldsymbol{X}_{best,f}-\boldsymbol{X}_{m,i}\big) \tag{14} $$
$$ \boldsymbol{X}_{f,i}^{new} = \boldsymbol{X}_{f,i} +C_3\,F_F\,\boldsymbol{r}\odot\big(Q\boldsymbol{X}_{best,m}-\boldsymbol{X}_{f,i}\big) \tag{15} $$
3.6 Mating 阶段与最差个体重置
否则进入交配阶段,个体与异性组的配对个体互相吸引。代码中使用
$$ M_M=\exp\!\left(-\frac{f_{f,i\bmod N_f}}{f_{m,i}+\varepsilon}\right), \qquad M_F=\exp\!\left(-\frac{f_{m,i\bmod N_m}}{f_{f,i}+\varepsilon}\right) \tag{16} $$
对应更新公式为
$$ \boldsymbol{X}_{m,i}^{new} = \boldsymbol{X}_{m,i} +C_3\,\boldsymbol{r}\odot M_M\big(Q\boldsymbol{X}_{f,i\bmod N_f}-\boldsymbol{X}_{m,i}\big) \tag{17} $$
$$ \boldsymbol{X}_{f,i}^{new} = \boldsymbol{X}_{f,i} +C_3\,\boldsymbol{r}\odot M_F\big(Q\boldsymbol{X}_{m,i\bmod N_m}-\boldsymbol{X}_{f,i}\big) \tag{18} $$
随后代码随机生成 egg in {+1,-1}。若 egg==1,则把当前最差雄蛇与最差雌蛇直接重置为随机位置:
$$ \boldsymbol{x}_{worst}\leftarrow \boldsymbol{l}+\boldsymbol{r}\odot(\boldsymbol{u}-\boldsymbol{l}) \tag{19} $$
3.7 边界处理与贪婪接受
每轮更新后都会执行边界截断,并采用贪婪保优:
$$ \boldsymbol{x}_{i,new}\leftarrow \operatorname{clip}(\boldsymbol{x}_{i,new},\boldsymbol{l},\boldsymbol{u}) \tag{20} $$
$$ \boldsymbol{x}_i\leftarrow \begin{cases} \boldsymbol{x}_{i,new}, & f(\boldsymbol{x}_{i,new})<f(\boldsymbol{x}_i)\\ \boldsymbol{x}_i, & \text{otherwise} \end{cases} \tag{21} $$
然后重新比较雄/雌最优,更新全局食物位置 \(\boldsymbol{X}_{food}\) 与收敛曲线。
4. 算法流程
结合 core/so.py、ui/upload_widget.py、ui/results_widget.py 与 utils/problem_definition.py,本项目 SO 的实际流程为:
- 选择
benchmark或upload_surrogate。 - 若为上传模式,则训练随机森林代理,并读取逐维样本边界。
- 按式(5)至式(7)初始化雄蛇、雌蛇及食物位置。
- 每轮计算
Temp和Q,按式(9)判断当前处于探索、向食物开发、fight 还是 mating。 - 分别按式(11)至式(19)更新雄蛇与雌蛇。
- 按式(20)和式(21)进行截断与贪婪接受。
- 更新当前最优个体并记录
convergence_curve。 - 自动导出结果 Excel、收敛图与复现脚本
repro_so.py。
5. 关键参数说明
population_size:总种群规模 \(N\)。max_iter:最大迭代次数 \(T\)。random_state:随机种子。problem_mode:benchmark或upload_surrogate。target_column:上传模式的目标列。objective_direction:上传模式的优化方向,决定式(3)的符号。
6. 评价指标与输出结果解释
ui/results_widget.py 最终导出的主要内容包括:
Convergence:每轮最优值曲线;Best Solution:最佳解向量;Parameters:问题、边界、种群规模、种子等参数;Charts:收敛图路径;- 上传模式下额外包含
Bounds、UploadedData、SurrogateMetrics。
需要注意:界面显示的 best_fitness 在上传模式下已经恢复为真实预测值,而 best_internal_fitness 才是内部最小化目标值。因此,论文结果部分可按“最优值与最优解、收敛曲线、代理模型精度”三层组织;其中上传模式应优先引用恢复方向后的 best_fitness,避免把内部最小化值误写成真实预测值。若需要附录复现,可直接使用 Parameters 与 Bounds 作为实验设置表。
7. 论文写作模板
可在论文方法部分表述为:
“本文采用蛇优化算法(SO)进行连续变量单目标优化。算法将种群划分为雄蛇与雌蛇两组,并依据食物量因子 \(Q\) 与温度因子 Temp 在无食物探索、向食物靠拢、竞争(fight)和交配(mating)等不同状态之间切换。在每轮迭代中,个体经边界截断后按贪婪准则保留更优位置。对于数据驱动问题,本文进一步基于样本训练随机森林代理模型,并在样本逐维边界内执行 SO 搜索。”
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. 实现说明与注意事项
- 本实现是单目标连续 SO,不含多目标扩展,也不含多次独立运行统计。
- 上传模式支持
min/max两种方向,方向切换通过代理目标符号翻转实现。 - 重置最差雄蛇/雌蛇的逻辑只在 mating 分支且
egg==1时触发,这属于当前代码实现细节。 - 导出 Excel 时,上传模式会额外写出代理训练指标,适合在论文中补充说明数据驱动优化背景。
9. 单篇终审补充
9.1 图题与表题对齐建议
Parameters表可写为:表X SO 参数设置与问题配置。Convergence表可写为:表X SO 单次运行收敛轨迹。Best Solution表可写为:表X SO 求得的最优解向量。Charts中收敛图建议写为:图X 蛇优化算法收敛曲线。
9.2 终审说明
- 上传模式下应优先引用恢复方向后的
best_fitness,不要误写内部最小化值best_internal_fitness。 - 当前实现无多次运行统计,正文不宜写稳定性分析结论,除非补做重复实验。
9.3 全量强化补充
本次全量强化不再使用顶层 so_smoke_20260227_192852 作为主证据,而是绑定结构更完整的真实结果目录 具体的算法3/优化与多目标/SO-蛇优化/results/SO-蛇优化分析结果_20260320_181212_880571。该目录下主结果文件为 SO-蛇优化分析结果_20260320_181212_880571.xlsx,实际工作表为 Convergence、Best Solution、Parameters、Charts;主图文件为 SO-蛇优化_convergence.png。
这篇文档要特别写清一个真实差异:SO 在不同历史目录里存在两套图命名,一套是 convergence.png,另一套是 SO-蛇优化_convergence.png。当前绑定的 20260320_181212_880571 目录采用的是后一种命名,而且没有额外的 convergence.png 副本。因此正式引用图路径时应以当前目录真实文件名为准,不应直接照搬早期 smoke 目录的 convergence.png。
复现脚本 repro_so.py 当前采用的是 benchmark 口径:problem = 'sphere'、max_iter = 24、population_size = 12、dim = 5、random_state = 8,脚本内部直接调用 Benchmark.get_function(problem) 和 Benchmark.get_bounds(problem, dim),没有 repro_inputs。因此 SO 当前绑定的是 benchmark 实跑/复算链路,而不是上传代理链路;论文中若引用 best_fitness,也应基于这一路径下的 benchmark 结果来解释。
10. 软件实现核查补充(2026-07)
本篇对应的软件源码目录是 具体的算法3/优化与多目标/SO-蛇优化。软件实现支持优化模式和上传数据代理优化模式;上传模式把数值表训练成代理目标后运行蛇优化。文档中的蛇群分层、温度控制或探索开发公式可以保留,但软件结果应以 SO_Params、Run_Summary、History_Mean、History_All、Best_Solution 和 Charts 解读。
当前较新的代表性目录为 results/SO-蛇优化分析结果_20260517_144300-优化模式 与 results/SO-蛇优化分析结果_20260517_144312-上传数据代理优化。主工作簿通常包含 Summary、Problem、SO_Params、Bounds、Run_Summary、History_Mean、History_All、Best_Solution、Charts;上传模式额外包含 UploadedProblem、UploadedData、SurrogateMetrics。这说明当前实现已经形成标准化的工程导出结构,文档不应只停留在算法理论描述。
当前图表稳定输出为 SO_convergence_时间戳.png。复现代码位于 复现代码/优化模式/ 或 复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/so_sample.xlsx,复现结果进入 repro_outputs/。如果正文引用上传代理模式,SurrogateMetrics 必须和结果一起解释。