正在加载中...

展开本页目录
算法教程Cuckoo-布谷鸟搜索

Cuckoo-布谷鸟搜索

No.178 · 在线教程

布谷鸟搜索(Cuckoo Search, CS)是一类面向连续空间数值优化的群智能算法。本项目中的实现位于 Cuckoo-布谷鸟搜索/core/cuckoo.py,采用标准连续型 CS 框架:以巢穴(nest)表示候选解,通过 Lévy 飞行产生全局扰动,并结合弃巢概率 pa …

Cuckoo-布谷鸟搜索

1. 方法概述

布谷鸟搜索(Cuckoo Search, CS)是一类面向连续空间数值优化的群智能算法。本项目中的实现位于 Cuckoo-布谷鸟搜索/core/cuckoo.py,采用标准连续型 CS 框架:以巢穴(nest)表示候选解,通过 Lévy 飞行产生全局扰动,并结合弃巢概率 pa 执行局部重组;在 core/cuckoo_calculator.py 中,算法既可用于内置基准函数优化,也可用于上传数据后的代理模型优化。

设决策变量向量为

$$ \boldsymbol{x}=(x_1,x_2,\ldots,x_d)^\top \in \Omega \tag{1} $$

其中 \(d\) 为问题维度,\(\Omega=[\boldsymbol{l},\boldsymbol{u}]\subset \mathbb{R}^d\) 为由上下界给定的可行域。项目默认以内置测试函数 \(f(\boldsymbol{x})\) 为目标,并以最小化为主;当界面选择最大化时,程序通过符号变换将问题统一为最小化求解。

2. 问题定义与符号说明

对于连续单目标优化问题,系统求解的基本形式为

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

若用户在界面中选择“最大化”,则程序内部改写为

$$ \min_{\boldsymbol{x}\in \Omega} \tilde{f}(\boldsymbol{x}),\qquad \tilde{f}(\boldsymbol{x})=-f(\boldsymbol{x}) \tag{3} $$

设第 \(t\) 轮迭代时共有 \(N\) 个巢穴,记第 \(i\) 个巢穴为 \(\boldsymbol{x}_i^{(t)}\),其适应度为

$$ F_i^{(t)} = f\!\left(\boldsymbol{x}_i^{(t)}\right),\qquad i=1,2,\ldots,N \tag{4} $$

当前全局最优巢穴记为

$$ \boldsymbol{x}_{\mathrm{best}}^{(t)}=\arg\min_{1\le i\le N}F_i^{(t)} \tag{5} $$

本项目中每一维决策变量均满足边界约束

$$ l_j < x_j < u_j,\qquad j=1,2,\ldots,d \tag{6} $$

若用户输入的是标量边界,程序会自动广播到全部维度;若为向量边界,则要求其长度与 \(d\) 一致。

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{7} $$

其中 \(\odot\) 表示 Hadamard 逐元素乘积。

3.2 Lévy 飞行更新

项目实现采用 Mantegna 形式生成 Lévy 步长。对第 \(i\) 个巢穴,在第 \(t\) 轮迭代中先构造

$$ \boldsymbol{s}_i=\frac{\boldsymbol{u}_i}{|\boldsymbol{v}_i|^{1/\beta}} \tag{8} $$

其中

$$ \boldsymbol{u}_i\sim \mathcal{N}(0,\sigma_u^2\mathbf{I}),\qquad \boldsymbol{v}_i\sim \mathcal{N}(0,\mathbf{I}) \tag{9} $$

而 \(\sigma_u\) 由 Lévy 指数 \(\beta\) 给出

$$ \sigma_u=\left[\frac{\Gamma(1+\beta)\sin(\pi\beta/2)}{\Gamma((1+\beta)/2)\beta\,2^{(\beta-1)/2}}\right]^{1/\beta} \tag{10} $$

在此基础上,代码采用如下步长缩放方式:

$$ \Delta \boldsymbol{x}_i^{(t)}=\alpha\,\boldsymbol{s}_i\odot\left(\boldsymbol{x}_i^{(t)}-\boldsymbol{x}_{\mathrm{best}}^{(t)}\right) \tag{11} $$

从而得到新的候选巢穴

$$ \widetilde{\boldsymbol{x}}_i^{(t+1)}=\boldsymbol{x}_i^{(t)}+\Delta \boldsymbol{x}_i^{(t)} \tag{12} $$

3.3 边界处理

core/cuckoo.py 中对新解统一采用截断式边界处理,即

$$ \widetilde{x}_{ij}^{(t+1)}=\min\!\left(\max\!\left(\widetilde{x}_{ij}^{(t+1)},\,l_j\right),\,u_j\right) \tag{13} $$

这意味着算法不会丢弃越界个体,而是将其直接拉回到边界区间内。

3.4 随机巢替换机制

项目实现并不是把新巢直接回写到原位置,而是为每个新解随机抽取一个巢穴 \(j\),若新解更优,则替换该巢穴:

$$ \text{若 } f\!\left(\widetilde{\boldsymbol{x}}_i^{(t+1)}\right)<f\!\left(\boldsymbol{x}_j^{(t)}\right),\text{ 则令 }\boldsymbol{x}_j^{(t)}\leftarrow \widetilde{\boldsymbol{x}}_i^{(t+1)} \tag{14} $$

这一实现细节与部分教材中“父代对应位置替换”的写法不同,因此在论文说明中应以式(14)所示的随机竞争替换为准。

3.5 弃巢与重组机制

程序随后依据发现概率 \(p_a\) 构造伯努利掩码矩阵:

$$ K_{ij}^{(t)} \sim \mathrm{Bernoulli}(p_a) \tag{15} $$

再通过两个随机排列 \(\pi_1,\pi_2\) 形成差分步长:

$$ \Delta \boldsymbol{z}_i^{(t)} = r^{(t)}\left(\boldsymbol{x}_{\pi_1(i)}^{(t)}-\boldsymbol{x}_{\pi_2(i)}^{(t)}\right),\qquad r^{(t)}\sim U(0,1) \tag{16} $$

据此生成弃巢后的候选解

$$ \widehat{\boldsymbol{x}}_i^{(t+1)}=\boldsymbol{x}_i^{(t)}+ \boldsymbol{K}_i^{(t)}\odot \Delta \boldsymbol{z}_i^{(t)} \tag{17} $$

同样对其执行截断边界处理,并按“若新解更优则替换原巢”的规则更新:

$$ \text{若 } f\!\left(\widehat{\boldsymbol{x}}_i^{(t+1)}\right)<f\!\left(\boldsymbol{x}_i^{(t)}\right),\text{ 则令 }\boldsymbol{x}_i^{(t)}\leftarrow \widehat{\boldsymbol{x}}_i^{(t+1)} \tag{18} $$

3.6 收敛记录

第 \(t\) 轮的全局最优值记为

$$ g^{(t)}=\min_{1\le i\le N} f\!\left(\boldsymbol{x}_i^{(t)}\right) \tag{19} $$

程序将 \(\{g^{(t)}\}_{t=1}^{T}\) 作为收敛曲线输出,其中 \(T\) 为最大迭代次数。

3.7 上传数据代理优化机制

除内置 \(F1\sim F13\) 基准函数外,本项目还支持上传 csv/xlsx 数据后构造代理目标函数。utils/problem_definition.py 的处理逻辑为:从数值列中识别特征列与目标列,使用随机森林回归器拟合代理模型,并把训练样本特征范围作为搜索边界。

设上传数据经清洗后得到样本集

$$ \mathcal{D}=\{(\boldsymbol{x}^{(n)},y^{(n)})\}_{n=1}^{N_s} \tag{20} $$

其中 \(\boldsymbol{x}^{(n)}\in\mathbb{R}^d\) 为数值特征,\(y^{(n)}\) 为目标列。系统训练随机森林代理函数

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

其中 \(T_b(\cdot)\) 为第 \(b\) 棵回归树的输出,本项目默认 \(B=300\)。对第 \(j\) 个特征,优化边界由样本最小值与最大值给定:

$$ l_j=\min_{1\le n\le N_s}x_j^{(n)},\qquad u_j=\max_{1\le n\le N_s}x_j^{(n)} \tag{22} $$

若界面选择“最大化”,则代理问题同样转换为最小化形式:

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

因此,本系统的 Cuckoo Search 既可以解释为“经典测试函数优化器”,也可以解释为“基于随机森林代理模型的黑箱优化器”。

4. 算法流程

结合 core/cuckoo.pycore/cuckoo_calculator.py,本项目的求解步骤可概括为:

  1. 根据用户选择确定问题模式:内置测试函数或上传代理优化。
  2. 解析维度、边界、种群规模、最大迭代次数、paalphabeta、随机种子等参数。
  3. 在可行域内均匀初始化 \(N\) 个巢穴,并计算初始适应度。
  4. 通过 Lévy 飞行生成候选巢穴,随机选择对手巢穴进行竞争替换。
  5. 根据发现概率 \(p_a\) 执行弃巢重组,再次按适应度比较更新巢穴。
  6. 记录当前最优值,重复步骤 4 至步骤 5,直至达到最大迭代次数。
  7. 若设置了重复运行次数 runs>1,程序对多次独立运行结果统计最优值、均值、标准差与耗时。

5. 关键参数说明

5.1 结构参数

  • pop_size:巢穴数量,对应式(7)中的种群规模 \(N\)。
  • max_iter:最大迭代次数,对应收敛曲线长度 \(T\)。
  • runs:独立重复运行次数,用于输出多次实验统计结果。
  • seed:随机种子。多次运行时,第 \(r\) 次运行使用 seed + r - 1

5.2 算法参数

  • pa:发现概率或弃巢概率,对应式(15),取值范围为 \([0,1]\)。
  • alpha:Lévy 飞行步长缩放系数,对应式(11),控制搜索幅度。
  • beta:Lévy 指数,对应式(8)至式(10),控制步长分布的厚尾程度。

5.3 问题参数

  • function_code:内置测试函数编号,项目内置 \(F1\sim F13\)。
  • dimlbub:维度与边界设置;在代理优化模式下由数据自动推断。
  • objective_direction:代理优化模式中的目标方向,可选 minmax

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

core/cuckoo_calculator.py 中的输出并不只包含单次最优值,而是形成完整的论文型结果包。若共有 \(R\) 次独立运行,第 \(r\) 次的最优值记为 \(b_r\),则程序统计:

$$ b_{\mathrm{best}}= \begin{cases} \min_{1\le r\le R} b_r, & \text{最小化}\\ \max_{1\le r\le R} b_r, & \text{最大化} \end{cases} \tag{24} $$

$$ \bar{b}=\frac{1}{R}\sum_{r=1}^{R} b_r \tag{25} $$

$$ s_b=\sqrt{\frac{1}{R-1}\sum_{r=1}^{R}(b_r-\bar{b})^2} \tag{26} $$

save_to_excel() 实际导出的主要工作表包括:

  • Metricsbest_runbest_fitnessmean_best_fitnessstd_best_fitness、总耗时等摘要指标;
  • Parameters:问题模式、维度、边界、pa/alpha/beta/runs/seed 等参数;
  • InitialPopulationFinalPopulation:代表性最佳运行复跑得到的初始/最终巢穴群体;
  • Runs:每次运行的 runseedbest_fitnessruntime_s
  • Convergence:最佳运行曲线以及多次运行的均值/标准差曲线;
  • BestSolution:最佳解向量;
  • Charts:收敛图、箱线图等图表路径。

对于代理优化模式,还会额外导出 UploadedDataUploadedProblemSurrogateMetrics,用于记录上传样本预览、目标列/特征列/方向等元信息,以及代理模型训练误差(如 RMSE、MAE、\(R^2\))。

论文结果部分建议先用 Metrics 汇报 best_fitness / mean_best_fitness / std_best_fitness,再结合 Convergence 说明代表性最佳运行与均值收敛行为,最后用 BestSolution 给出最优解向量。由于 InitialPopulationFinalPopulation 来自最佳运行复跑结果,正文若引用这两张表,应说明其用途是复现与解释,而不是全部运行过程的原始缓存快照。

7. 论文写作模板

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

“本文采用布谷鸟搜索算法对目标函数进行全局寻优。设候选解为 \(d\) 维连续向量,首先在变量上下界内随机生成初始巢穴群体;随后利用 Lévy 飞行机制产生新解,并通过随机竞争替换策略保留更优个体。在每轮迭代后,进一步依据弃巢概率 \(p_a\) 执行差分式重组,以增强种群多样性并避免早熟收敛。针对最大化任务,本文将目标函数统一转换为等价最小化形式进行求解。对于上传样本数据的情形,先以随机森林回归器建立代理目标函数,再在样本特征范围内执行布谷鸟搜索,从而实现数据驱动的黑箱优化。”

在结果部分可进一步写为:

“本文记录了算法在独立重复运行下的最优值、均值、标准差及收敛曲线,并输出最优解向量、初始与最终群体分布等结果,以分析布谷鸟搜索在目标空间中的寻优效率与稳定性。”

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. 实现说明与注意事项

  • 本实现适用于连续变量单目标优化,不适用于离散编码或显式多目标问题。
  • alpha 取值过大时,Lévy 飞行步长可能导致搜索过于发散;过小时则可能降低全局探索能力。
  • pa 越大,弃巢重组越频繁,种群多样性增强,但局部收敛速度可能下降。
  • 上传代理优化时,实质上优化的是随机森林近似函数而非真实实验函数,因此结论依赖于样本覆盖范围和代理模型精度。
  • 程序使用截断式边界处理,若真实问题在边界附近存在不可行区域或复杂约束,则需要额外约束建模。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • Metrics 表可写为:表X 布谷鸟搜索运行指标表。
  • Parameters 表可写为:表X 布谷鸟搜索参数设置表。
  • InitialPopulation 表可写为:表X 布谷鸟搜索初始种群表。
  • FinalPopulation 表可写为:表X 布谷鸟搜索最终种群表。
  • Runs 表可写为:表X 布谷鸟搜索多次运行汇总表。
  • Convergence 表可写为:表X 布谷鸟搜索收敛历史表。
  • BestSolution 表可写为:表X 布谷鸟搜索最优解决策变量表。
  • UploadedData 表可写为:表X 布谷鸟搜索上传样本预览表。
  • UploadedProblem 表可写为:表X 布谷鸟搜索上传问题定义表。
  • SurrogateMetrics 表可写为:表X 布谷鸟搜索代理模型误差指标表。
  • Charts 表可写为:表X 布谷鸟搜索图表索引表。
  • convergence_curve.png 建议写为:图X 布谷鸟搜索收敛曲线图。
  • best_fitness_boxplot.png 建议写为:图X 布谷鸟搜索多次运行最优值箱线图。

9.2 终审说明

  • 当前代表性结果目录建议优先采用上传代理模式的 results/Cuckoo-布谷鸟搜索分析结果_20260328_115124。其中主工作簿为 cuckoo_results_20260328_115124.xlsx,同目录还保留了 repro_inputs/cuckoo_sample.xlsx
  • 当前上传模式下的真实工作表为 Metrics/Parameters/InitialPopulation/FinalPopulation/Runs/Convergence/BestSolution/UploadedData/UploadedProblem/SurrogateMetrics/Charts;普通解析模式则通常没有后三张上传相关表。论文若讨论上传数据驱动优化,应固定引用上传模式目录。
  • 当前稳定实体图文件位于 cuckoo_results_时间戳_plots/cuckoo_manual_upload_时间戳_plots/ 目录下,代表性文件为 convergence_curve.png,多次运行目录还可能有 best_fitness_boxplot.png。图题应按实际目录中的实体文件落地。
  • 真实 repro 脚本统一命名为 repro_cuckoo.py。其关键参数集中在 PARAMS 字典中,其中 source_file = 'repro_inputs/cuckoo_sample.xlsx' 才是附录应强调的可移植输入路径。
  • 当前上传代理模式优化的是随机森林代理目标,不是原始真实函数。论文若引用 SurrogateMetrics,应明确其含义是代理模型训练误差与拟合优度,而不是最终优化算法本身的误差。

9.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法3/优化与多目标/Cuckoo-布谷鸟搜索,代表性结果目录为 具体的算法3/优化与多目标/Cuckoo-布谷鸟搜索/results/manual_upload_verify_20260328/Cuckoo-布谷鸟搜索分析结果_20260328_115124
  • 该目录实际包含两份工作簿:cuckoo_results.xlsxcuckoo_results_20260328_115124.xlsx。两份工作簿的真实工作表一致,均为 MetricsParametersInitialPopulationFinalPopulationRunsConvergenceBestSolutionUploadedDataUploadedProblemSurrogateMetricsCharts
  • 当前图目录为 cuckoo_results_20260328_115124_plots/cuckoo_results_plots/ 两套,当前实际可见主图均是 convergence_curve.png。这一轮目录中没有实际落地 best_fitness_boxplot.png,因此正文图题应以收敛曲线为主,不应把箱线图写成这次目录既有产物。
  • 当前 repro 脚本为 repro_cuckoo.py,脚本中 PARAMS['source_file'] = 'repro_inputs/cuckoo_sample.xlsx',输入副本 repro_inputs/cuckoo_sample.xlsx 在目录中实际存在。这篇应按 PARAMS 字典中的 source_file 口径写复现说明,而不是寻找单独的 SRC_FILE
  • 由于当前目录属于上传代理优化模式,UploadedDataUploadedProblemSurrogateMetrics 必须和 BestSolution/Convergence 联合解读;若只讨论解析 benchmark 优化,应另换 manual_check_20260324 目录,而不能把上传代理字段混写进去。
  • 这篇当前最合适的表述是“主结果目录保留两份等结构工作簿、两套收敛图目录和一份携带上传样本路径的 repro 脚本”,而不是单工作簿目录。

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

本篇对应的软件源码目录是 具体的算法3/优化与多目标/Cuckoo-布谷鸟搜索。软件实现支持优化模式和上传数据代理优化模式;上传模式读取 csv/xlsx/xls,用数值特征与目标列训练代理模型,再由布谷鸟搜索执行 Levy 飞行、巢穴更新和弃巢替换。文档中的 Levy 飞行公式、发现概率和巢穴选择机制可以保留,但输出解读必须绑定 Problem.problem_mode

当前较新的代表性目录为 results/Cuckoo-布谷鸟搜索分析结果_20260517_101927-优化模式results/Cuckoo-布谷鸟搜索分析结果_20260517_102026-上传数据代理优化。主工作簿 cuckoo_results_*.xlsx 在优化模式下包含 结果说明字段说明SummaryProblemCuckoo_ParamsBoundsInitialPopulationFinalPopulationRun_SummaryHistory_MeanBest_SolutionCharts;上传模式额外包含 UploadedProblemUploadedDataSurrogateMetrics。因此这篇文档应继续突出初始种群、最终种群和代理模型指标三个工程化输出。

当前图表目录形如 cuckoo_results_时间戳_plots/,稳定输出包括 convergence_curve.pngfinal_population.png。复现代码位于 复现代码/优化模式/复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/cuckoo_sample.xlsx,复现后进入 repro_outputs/。旧文中提到两份同结构工作簿和历史 manual_upload_verify 目录可以保留,但当前用户交付说明应优先按 20260517 的新结果目录、复现代码/模式 层级和 Charts 表来写。