ABC-人工蜂群
ABC-人工蜂群 的真实核心位于:
ABC-人工蜂群
1. 方法概述
ABC-人工蜂群 的真实核心位于:
core/abc_runner.pycore/objectives.pycore/custom_objective.pyutils/problem_definition.py
这份实现是单目标连续优化版 ABC,支持三类问题来源:
- 内置基准函数:
Sphere、Rosenbrock、Rastrigin、Ackley、Griewank - 自定义表达式目标:
Custom - 上传数据后训练代理模型再优化:
upload_surrogate
对维度为 \(d\) 的解向量 \(x\in\mathbb{R}^d\),搜索域写成
$$ \Omega=\{x\in\mathbb{R}^d\mid l_j\le x_j\le u_j,\ j=1,\dots,d\} \tag{1} $$
算法内部统一维护 food_number 个食物源,也就是候选解集合
$$ X=\{x_i\}_{i=1}^{SN},\qquad SN=\texttt{food\_number} \tag{2} $$
其中每个食物源对应一个试错计数 trials[i],用于触发侦察蜂重置。
2. 目标函数与问题建模
2.1 最小化 / 最大化
真实代码通过 _better(a,b,minmax) 决定优劣,即
$$ x_a \text{ 优于 } x_b \iff \begin{cases} f(x_a)<f(x_b), & \text{min}\\ f(x_a)>f(x_b), & \text{max} \end{cases} \tag{3} $$
因此这不是“永远最小化”的简化版,而是显式支持 min / max。
2.2 自定义表达式与罚函数
当 objective_name="Custom" 时,代码不会调用现成函数库,而是先对表达式做 AST 白名单检查,再构造带约束罚项的目标。若原始目标是 \(g(x)\),不等式约束为 \(c_m(x)\le 0\),等式约束为 \(h_n(x)=0\),则内部适应度写成
$$ F(x)=g(x)+\rho\sum_m \max\!\big(0,c_m(x)\big)^p+\rho_{eq}\sum_n \max\!\big(0,|h_n(x)|-\varepsilon\big)^p \tag{4} $$
若用户选择最大化,则代码改成
$$ F(x)=g(x)-\rho\sum_m \max\!\big(0,c_m(x)\big)^p-\rho_{eq}\sum_n \max\!\big(0,|h_n(x)|-\varepsilon\big)^p \tag{5} $$
也就是说,约束违反在最大化模式下会直接扣分。
2.3 上传数据代理优化
上传模式不是直接优化原始表格,而是先从数值列中分出特征 \(X\) 与目标 \(y\),再训练
$$ \hat y(x)=\mathrm{RandomForestRegressor}_{300}(x) \tag{6} $$
随后把代理目标写成
$$ F(x)= \begin{cases} \hat y(x), & \text{上传目标方向为 min}\\ -\hat y(x), & \text{上传目标方向为 max} \end{cases} \tag{7} $$
这里有一个实现细节要写清:进入 upload_surrogate 后,effective_problem.minmax 会被强制改成 "min",真正的显示方向由 objective_direction 决定,最终再把历史曲线和最优值映射回原目标口径。
3. ABC 更新机制
3.1 雇佣蜂阶段
第 \(i\) 个食物源会随机挑选另一个食物源 \(x_k\) 和一个维度 \(j\),然后只在该维度做扰动:
$$ v_{ij}=x_{ij}+\phi_{ij}(x_{ij}-x_{kj}),\qquad \phi_{ij}\sim U(-1,1) \tag{8} $$
其余维度保持不变,之后统一裁剪到边界区间。若新解更优,则接受并把 trials[i] 归零,否则试错次数加一。
3.2 观察蜂阶段
观察蜂不是均匀抽样食物源,而是根据一个显式的轮盘赌适应度变换选择。对当前目标值 \(f_i\),代码先在最大化问题中取 \(-f_i\),再计算
$$ \mathrm{fit}_i= \begin{cases} \dfrac{1}{1+f_i}, & f_i\ge 0\\ 1+|f_i|, & f_i<0 \end{cases} \tag{9} $$
再归一化成选择概率
$$ p_i=\frac{\mathrm{fit}_i}{\sum_{r=1}^{SN}\mathrm{fit}_r} \tag{10} $$
被选中的食物源继续沿用式 \((8)\) 的单维邻域更新。
3.3 侦察蜂阶段
若某个食物源长期未改进,满足
$$ \mathrm{trials}_i\ge \texttt{limit} \tag{11} $$
则该食物源被直接丢弃,并在整个搜索区间重新均匀采样:
$$ x_i\sim U(l,u) \tag{12} $$
这一步对应代码中的 Scout bees 分支。
4. 多次运行与输出结果
若 runs>1,程序会以 seed + r 为每次运行的随机种子,分别执行单次 ABC,然后选出全局最佳运行。历史曲线则按迭代号做平均:
$$ \bar f_t=\frac{1}{R}\sum_{r=1}^{R} f_t^{(r)} \tag{13} $$
因此导出的 History_Mean 不是某一次真实轨迹,而是多次运行的逐代均值。
save_results() 的真实 Excel 工作表为:
SummaryProblemABC_ParamsCustom_Objective(仅Custom时出现)BoundsRun_SummaryHistory_MeanHistory_AllBest_SolutionChartsUploadedData(仅上传模式)SurrogateMetrics(仅上传模式)
其中上传模式的 SurrogateMetrics 来自随机森林在训练集上的 rmse_train、mae_train、r2_train。
5. 实现说明与注意事项
从真实代码看,这个目录在论文说明里应明确写出以下几点:
- 它是连续变量单目标 ABC,不是离散路径规划版,也不是多目标版。
- 邻域更新只改动一个维度,不是整向量同时扰动。
Custom模式支持表达式、约束和罚函数,但表达式语法经过 AST 白名单限制,只允许np、math、x等有限对象。- 上传模式本质上是“随机森林代理模型 + ABC 搜索”,而不是直接对原始数据做解析优化。
- 结果页导出的
History_Mean与Run_Summary可以反映多次运行稳定性,但不会保存每次运行的最终种群矩阵。
6. 论文写作模板
可在论文“方法部分”中写为:
“本文采用人工蜂群算法对连续变量优化问题进行求解。首先,在给定搜索边界内初始化食物源种群,并依据目标函数计算各候选解的适应度;其次,依次执行雇佣蜂阶段、观察蜂阶段和侦察蜂阶段,通过邻域扰动、轮盘赌选择和停滞重置机制不断更新候选解;随后,在多次独立运行场景下统计最优值轨迹与平均收敛曲线;最后,输出最优解、最优适应度、运行汇总和收敛结果,用于评价算法的搜索能力与稳定性。”
7. 单篇终审补充
7.1 图题与表题对齐建议
Summary表可写为:表X ABC 运行摘要表。Problem表可写为:表X ABC 问题定义表。ABC_Params表可写为:表X ABC 参数设置表。Custom_Objective表可写为:表X ABC 自定义目标函数表。Bounds表可写为:表X ABC 变量边界表。Run_Summary表可写为:表X ABC 多次运行汇总表。History_Mean表可写为:表X ABC 平均收敛历史表。History_All表可写为:表X ABC 全部运行历史表。Best_Solution表可写为:表X ABC 最优解表。UploadedData表可写为:表X ABC 上传样本预览表。SurrogateMetrics表可写为:表X ABC 代理模型误差指标表。Charts表可写为:表X ABC 图表索引表。ABC_convergence_*.png建议写为:图X ABC 收敛曲线图。ABC_preview_*.png建议写为:图X ABC 最优解分量预览图。
7.2 终审说明
- 当前代表性结果目录建议同时保留解析模式与上传代理模式两套证据。上传代理模式可采用
results/manual_upload_verify_20260328/ABC-人工蜂群分析结果_20260328_105335,解析模式可采用results/ABC-人工蜂群分析结果_20260329_171838。 - 当前上传代理模式下的真实工作表为
Summary/Problem/ABC_Params/Bounds/Run_Summary/History_Mean/History_All/Best_Solution/Charts/UploadedData/SurrogateMetrics;解析模式通常只有前 9 张表。论文若讨论数据驱动优化,应优先引用上传模式目录。 - 当前稳定实体图文件为
ABC_convergence_时间戳.png,部分目录还会出现ABC_preview_时间戳.png。正文若说明图义,应先确认该目录是否确实生成了 preview 图。 - 真实 repro 脚本统一命名为
repro_abc.py。在上传代理目录中,脚本把输入路径固化在problem_kwargs['source_file'] = 'repro_inputs/abc_sample.xlsx',这比单独暴露SRC_FILE更关键,附录应按这一口径写明复现输入。 - 当前上传代理模式输出的
SurrogateMetrics来自随机森林训练集误差,不是独立测试集指标。论文若引用这些误差,应写成“代理模型训练误差与拟合优度”,不要误写成泛化性能。
7.3 全量强化补充
- 本轮按真实磁盘再次核对,算法目录为
具体的算法3/优化与多目标/ABC-人工蜂群。上传代理模式代表性结果目录为具体的算法3/优化与多目标/ABC-人工蜂群/results/manual_upload_verify_20260328/ABC-人工蜂群分析结果_20260328_105335,解析 benchmark 模式代表性结果目录为具体的算法3/优化与多目标/ABC-人工蜂群/results/ABC-人工蜂群分析结果_20260329_171838_01。 - 上传代理模式主工作簿为
ABC_results_20260328_105343.xlsx,真实工作表为Summary、Problem、ABC_Params、Bounds、Run_Summary、History_Mean、History_All、Best_Solution、Charts、UploadedData、SurrogateMetrics。该目录主图为ABC_convergence_20260328_105343.png,未见主目录根部的ABC_preview_*.png。 - 上传代理模式的复现脚本为
repro_abc.py,脚本中problem_kwargs['source_file'] = 'repro_inputs/abc_sample.xlsx',输入副本实际位于repro_inputs/abc_sample.xlsx。复现后又在repro_outputs/下生成ABC_results_20260328_105419.xlsx、ABC_convergence_20260328_105420.png、新的repro_abc.py和新的repro_inputs/abc_sample.xlsx。 - 解析 benchmark 模式主工作簿为
ABC_results_20260329_171838.xlsx,真实工作表为Summary、Problem、ABC_Params、Bounds、Run_Summary、History_Mean、History_All、Best_Solution、Charts;该目录图文件为ABC_convergence_20260329_171838.png,repro_abc.py中source_file为空,说明它不依赖上传输入副本。 - 因此这篇必须按“双模式”写:若论文讨论上传数据驱动优化,应引用上传代理目录及其
UploadedData/SurrogateMetrics;若只讨论经典 ABC 求解 benchmark,应引用解析模式目录,且不能把UploadedData或随机森林代理指标写进去。 - 需要避免把
manual_upload_verify_20260324与manual_upload_verify_20260328中的不同轮次图和 repro 输出混成一次实验;当前推荐证据以manual_upload_verify_20260328/ABC-人工蜂群分析结果_20260328_105335为准。
8. 软件实现核查补充(2026-07)
- 当前上传代理模式主结果目录应写作
具体的算法3/优化与多目标/ABC-人工蜂群/results/manual_upload_verify_20260328/ABC-人工蜂群分析结果_20260328_105335;解析 benchmark 模式主结果目录应写作具体的算法3/优化与多目标/ABC-人工蜂群/results/ABC-人工蜂群分析结果_20260329_171838_01。 - 上传代理模式正文应围绕
Summary、Problem、ABC_Params、Bounds、Run_Summary、History_Mean、History_All、Best_Solution、Charts、UploadedData、SurrogateMetrics来写。 - 图证应对应
ABC_convergence_*.png,上传代理模式还应说明UploadedData/SurrogateMetrics。 - 复现脚本应按
repro_abc.py + repro_inputs/abc_sample.xlsx的口径说明;解析 benchmark 模式中source_file为空,不能写成上传模式。