正在加载中...

展开本页目录
算法教程DA-蜻蜓优化

DA-蜻蜓优化

No.179 · 在线教程

蜻蜓优化算法(Dragonfly Algorithm, DA)是一类面向连续空间优化的群智能方法,通过模拟蜻蜓群体的分离、对齐、聚合、觅食与避敌行为构建搜索动力学。本项目的核心实现位于 DA-蜻蜓优化/core/darunner.py,用于单目标连续优化;同时支持三类问题输入:…

DA-蜻蜓优化

1. 方法概述

蜻蜓优化算法(Dragonfly Algorithm, DA)是一类面向连续空间优化的群智能方法,通过模拟蜻蜓群体的分离、对齐、聚合、觅食与避敌行为构建搜索动力学。本项目的核心实现位于 DA-蜻蜓优化/core/da_runner.py,用于单目标连续优化;同时支持三类问题输入:内置基准函数、自定义表达式目标函数(含罚函数约束)以及上传数据后的代理优化。

设第 \(i\) 个个体在第 \(t\) 轮迭代的位置为

$$ \boldsymbol{x}_i^{(t)}=(x_{i1}^{(t)},x_{i2}^{(t)},\ldots,x_{id}^{(t)})^\top \in \Omega \tag{1} $$

其中 \(d\) 为维度,\(\Omega=[\boldsymbol{l},\boldsymbol{u}]\subset \mathbb{R}^d\) 为决策空间。与标准 DA 一致,项目同时维护位置向量与步长向量(或速度向量)

$$ \Delta \boldsymbol{x}_i^{(t)} \in \mathbb{R}^d \tag{2} $$

用于描述个体在相邻两轮之间的移动趋势。

2. 问题定义与符号说明

2.1 基本优化目标

对内置基准函数或自定义目标函数,系统求解的基本问题可写为

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

若界面中选择最大化,则程序在比较优劣时改用

$$ \max_{\boldsymbol{x}\in\Omega} f(\boldsymbol{x}) \tag{4} $$

并通过 _better 函数统一控制“更优”关系。

2.2 自定义约束目标

项目允许用户输入自定义目标表达式 \(\phi(\boldsymbol{x})\),并定义不等式约束

$$ g_k(\boldsymbol{x})\le 0,\qquad k=1,2,\ldots,m \tag{5} $$

以及等式约束

$$ h_\ell(\boldsymbol{x})=0,\qquad \ell=1,2,\ldots,q \tag{6} $$

core/custom_objective.py 中采用罚函数方式构造适应度。对最小化情形,罚项定义为

$$ P(\boldsymbol{x})= \rho\sum_{k=1}^{m}\max\!\big(0,g_k(\boldsymbol{x})\big)^p + \rho_{\mathrm{eq}}\sum_{\ell=1}^{q}\max\!\big(0,|h_\ell(\boldsymbol{x})|-\varepsilon_{\mathrm{eq}}\big)^p \tag{7} $$

于是最小化适应度为

$$ F(\boldsymbol{x})=\phi(\boldsymbol{x})+P(\boldsymbol{x}) \tag{8} $$

若选择最大化,程序实现使用

$$ F(\boldsymbol{x})=\phi(\boldsymbol{x})-P(\boldsymbol{x}) \tag{9} $$

因此,约束违背会降低最大化问题的适应度,同时提高最小化问题的适应度。

2.3 上传数据代理优化

problem_mode=upload_surrogate 时,系统先根据上传样本训练随机森林代理模型,再以该代理模型作为黑箱目标函数。设训练样本为

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

则代理模型写为

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

其中 \(T_b(\cdot)\) 为第 \(b\) 棵回归树输出,本项目默认 \(B=300\)。搜索边界由样本特征逐维最小值与最大值确定:

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

3. 核心数学模型

3.1 初始化

设种群规模为 \(N\)。程序在可行域中均匀生成初始位置:

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

同时将初始步长向量限制在最大步长范围内:

$$ \Delta_{\max}=(\boldsymbol{u}-\boldsymbol{l})\cdot \eta_{\Delta} \tag{14} $$

$$ \Delta \boldsymbol{x}_i^{(0)}\sim U(-\Delta_{\max},\,\Delta_{\max}) \tag{15} $$

其中 \(\eta_{\Delta}\) 对应代码中的 delta_max_frac

3.2 邻域半径与惯性权重

项目实现中,邻域半径随迭代逐步扩大。若总迭代次数为 \(T\),第 \(t\) 轮的邻域尺度为

$$ \boldsymbol{r}^{(t)}=(\boldsymbol{u}-\boldsymbol{l})\cdot \eta_r + (\boldsymbol{u}-\boldsymbol{l})\cdot \frac{t}{T}\cdot \kappa_r \tag{16} $$

其中 \(\eta_r\) 与 \(\kappa_r\) 分别对应 r_base_fracr_linear_coef。惯性权重按线性递减方式更新:

$$ w^{(t)}=w_{\max}-t\cdot \frac{w_{\max}-w_{\min}}{T} \tag{17} $$

同时社会行为控制系数按前半程衰减至 0:

$$ c^{(t)}=\max\!\left(0,\;c_0-t\cdot \frac{c_0}{T_c}\right) \tag{18} $$

其中 \(c_0\) 对应 c_start,\(T_c=\max(1,T\cdot \text{c\_decay\_ratio})\)。

3.3 群体行为向量

对第 \(i\) 个个体,若邻域内个体集合记为 \(\mathcal{N}_i^{(t)}\),则项目实现中的 5 类行为向量分别为:

分离项

$$ \boldsymbol{S}_i^{(t)}=-\sum_{j\in\mathcal{N}_i^{(t)}}\left(\boldsymbol{x}_j^{(t)}-\boldsymbol{x}_i^{(t)}\right) \tag{19} $$

对齐项

$$ \boldsymbol{A}_i^{(t)}= \begin{cases} \dfrac{1}{|\mathcal{N}_i^{(t)}|}\sum_{j\in\mathcal{N}_i^{(t)}}\Delta\boldsymbol{x}_j^{(t)}, & |\mathcal{N}_i^{(t)}|>1\\[6pt] \Delta\boldsymbol{x}_i^{(t)}, & \text{否则} \end{cases} \tag{20} $$

聚合项

$$ \boldsymbol{C}_i^{(t)}= \begin{cases} \dfrac{1}{|\mathcal{N}_i^{(t)}|}\sum_{j\in\mathcal{N}_i^{(t)}}\boldsymbol{x}_j^{(t)}-\boldsymbol{x}_i^{(t)}, & |\mathcal{N}_i^{(t)}|>1\\[6pt] \boldsymbol{0}, & \text{否则} \end{cases} \tag{21} $$

食物吸引项

$$ \boldsymbol{F}_i^{(t)}= \begin{cases} \boldsymbol{x}_{\mathrm{food}}^{(t)}-\boldsymbol{x}_i^{(t)}, & |\boldsymbol{x}_{\mathrm{food}}^{(t)}-\boldsymbol{x}_i^{(t)}|\le \boldsymbol{r}^{(t)}\\ \boldsymbol{0}, & \text{否则} \end{cases} \tag{22} $$

避敌项按项目代码实现为

$$ \boldsymbol{E}_i^{(t)}= \begin{cases} \boldsymbol{x}_{\mathrm{enemy}}^{(t)}+\boldsymbol{x}_i^{(t)}, & |\boldsymbol{x}_{\mathrm{enemy}}^{(t)}-\boldsymbol{x}_i^{(t)}|\le \boldsymbol{r}^{(t)}\\ \boldsymbol{0}, & \text{否则} \end{cases} \tag{23} $$

其中 \(\boldsymbol{x}_{\mathrm{food}}^{(t)}\) 为当前最优个体位置,\(\boldsymbol{x}_{\mathrm{enemy}}^{(t)}\) 为当前最差个体位置。式(23)特别对应 da_runner.py 中的 enemy_pos + x[i],论文写作时应以项目实现为准,而不是直接套用教科书中的其他变体。

3.4 更新规则

程序首先为分离、对齐、聚合、觅食项分别生成随机系数,形式上可记为

$$ s^{(t)}=2u_1c^{(t)},\quad a^{(t)}=2u_2c^{(t)},\quad c_1^{(t)}=2u_3c^{(t)},\quad f^{(t)}=2u_4,\quad e^{(t)}=c^{(t)} \tag{24} $$

其中 \(u_1,u_2,u_3,u_4\sim U(0,1)\)。

若食物位置不在邻域范围内,则项目采用两种分支:

  1. 当邻域内存在足够多邻居时,

$$ \Delta \boldsymbol{x}_i^{(t+1)}= w^{(t)}\Delta \boldsymbol{x}_i^{(t)} +u_5\boldsymbol{A}_i^{(t)} +u_6\boldsymbol{C}_i^{(t)} +u_7\boldsymbol{S}_i^{(t)} \tag{25} $$

  1. 当邻域过稀疏时,转而执行 Lévy flight:

$$ \boldsymbol{x}_i^{(t+1)}=\boldsymbol{x}_i^{(t)}+\boldsymbol{L}^{(t)}\odot \boldsymbol{x}_i^{(t)} \tag{26} $$

其中 \(\boldsymbol{L}^{(t)}\) 由 Mantegna 形式生成,即

$$ \boldsymbol{L}^{(t)}=\eta_L \frac{\boldsymbol{u}}{|\boldsymbol{v}|^{1/\beta_L}},\qquad \boldsymbol{u}\sim \mathcal{N}(0,\sigma_L^2\mathbf{I}),\quad \boldsymbol{v}\sim \mathcal{N}(0,\mathbf{I}) \tag{27} $$

若食物位置已进入邻域,则采用完整的蜻蜓群体更新式:

$$ \Delta \boldsymbol{x}_i^{(t+1)}= a^{(t)}\boldsymbol{A}_i^{(t)} +c_1^{(t)}\boldsymbol{C}_i^{(t)} +s^{(t)}\boldsymbol{S}_i^{(t)} +f^{(t)}\boldsymbol{F}_i^{(t)} +e^{(t)}\boldsymbol{E}_i^{(t)} +w^{(t)}\Delta \boldsymbol{x}_i^{(t)} \tag{28} $$

随后程序对步长执行截断:

$$ \Delta \boldsymbol{x}_i^{(t+1)}\leftarrow \min\!\big(\max(\Delta \boldsymbol{x}_i^{(t+1)},-\Delta_{\max}),\Delta_{\max}\big) \tag{29} $$

并更新个体位置:

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

3.5 边界处理与最优更新

代码中边界控制分两步执行。首先,在主更新前对越界个体进行“跨边界回置”:

$$ x_{ij}^{(t)}= \begin{cases} l_j, & x_{ij}^{(t)}>u_j\\ u_j, & x_{ij}^{(t)}<l_j \end{cases} \tag{31} $$

然后在更新完成后再做一次区间截断:

$$ x_{ij}^{(t+1)}\leftarrow \min\!\big(\max(x_{ij}^{(t+1)},l_j),u_j\big) \tag{32} $$

若个体适应度为 \(F_i^{(t)}\),则全局最优与最差个体分别定义为

$$ \boldsymbol{x}_{\mathrm{food}}^{(t)}=\arg\operatorname*{best}_{1\le i\le N}F_i^{(t)},\qquad \boldsymbol{x}_{\mathrm{enemy}}^{(t)}=\arg\operatorname*{worst}_{1\le i\le N}F_i^{(t)} \tag{33} $$

其中 \(\operatorname*{best}\) 与 \(\operatorname*{worst}\) 的具体含义由 minmax 决定。

4. 算法流程

根据 core/da_runner.py,本项目的 DA 求解过程可概括为:

  1. 解析问题模式:基准函数、自定义目标或上传代理优化。
  2. 根据边界模式生成统一边界或逐维边界向量。
  3. 初始化种群位置 \(\boldsymbol{x}_i\) 与步长向量 \(\Delta \boldsymbol{x}_i\)。
  4. 计算当前种群适应度,识别食物个体与敌对个体。
  5. 按式(16)至式(18)更新邻域半径、惯性权重和社会控制因子。
  6. 对每个个体计算分离、对齐、聚合、觅食与避敌项。
  7. 按邻域稀疏/稠密状态,分别执行式(25)至式(30)的更新。
  8. 记录 best_fitnessmean_fitnessworst_fitness 与动态参数 \(w^{(t)},c^{(t)}\)。
  9. 若设置 runs>1,则对多次独立运行结果进行汇总统计。

5. 关键参数说明

  • n_agents:蜻蜓个体数,对应种群规模 \(N\)。
  • max_iters:最大迭代次数,对应总迭代轮数 \(T\)。
  • runs:独立重复运行次数,用于输出多次实验统计。
  • seed:随机种子,第 \(r\) 次运行采用 seed + r 形式派生。
  • w_maxw_min:惯性权重上下界,对应式(17)。
  • c_startc_decay_ratio:社会行为控制项初值与衰减比例,对应式(18)。
  • delta_max_frac:最大步长与变量区间长度的比例,对应式(14)。
  • r_base_fracr_linear_coef:邻域半径的初始比例与线性扩张系数,对应式(16)。
  • levy_betalevy_step_scale:Lévy flight 的分布指数与步长缩放系数,对应式(27)。
  • penalty_rhopenalty_rho_eqpenalty_powereq_epsilon:自定义约束罚函数参数,对应式(7)。

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

项目会把每次运行的最优值整理到 Run_Summary 工作表。设第 \(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{34} $$

同时,对所有运行的收敛历史在相同迭代步上做均值统计:

$$ \bar{g}^{(t)}=\frac{1}{R}\sum_{r=1}^{R} g_r^{(t)} \tag{35} $$

其中 \(g_r^{(t)}\) 表示第 \(r\) 次运行在第 \(t\) 轮的 best_fitness。系统还会同步记录 mean_fitnessworst_fitness 的跨运行均值,用于描述种群整体搜索状态。

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

  • Summary:最佳适应度、运行次数、目标信息等摘要;
  • ProblemDA_Params:问题配置与蜻蜓算法参数;
  • Bounds:变量边界;
  • Run_Summary:多次运行最优值汇总;
  • History_Mean:各迭代轮的均值收敛曲线;
  • History_All:全部运行的收敛历史;
  • Best_Solution:最优解向量及其目标值;
  • Charts:收敛图路径。

若为 Custom 模式,还会追加 Custom_Objective;若为代理优化模式,还会追加 UploadedDataSurrogateMetrics

论文结果部分可按“Summary 总结最优值、Run_Summary 报告多次独立运行统计、History_Mean/History_All 展示收敛稳定性、Best_Solution 给出代表性最优解”的顺序组织。若为代理优化模式,还应同步引用 SurrogateMetrics,避免只给最优预测值而不说明代理拟合质量。

7. 论文写作模板

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

“本文采用蜻蜓优化算法对连续决策变量进行单目标寻优。算法以种群位置向量和步长向量共同描述搜索状态,并通过分离、对齐、聚合、觅食和避敌五类行为项构建个体更新机制。本文实现中,邻域半径随迭代逐步扩张,惯性权重线性递减;当个体附近缺少有效邻居时,采用 Lévy flight 增强全局探索能力。对于含约束的自定义目标,使用罚函数将不等式与等式约束转化为适应度惩罚项;对于数据驱动问题,则先训练随机森林代理模型,再在样本特征边界内执行蜻蜓优化搜索。”

在结果部分可写为:

“本文记录了 DA 在多次独立运行下的最优值、平均收敛轨迹和最优解向量,并结合边界设置与参数表对实验过程进行复现说明。对于代理优化情形,还报告了代理模型训练误差指标,以辅助分析优化结果的可靠性。”

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

  • 本实现适用于连续变量单目标优化,不直接适用于离散编码和显式多目标场景。
  • enemy_vec 采用 enemy_pos + x_i 的实现形式,论文写作时应基于项目代码而非其他 DA 变体。
  • 当邻域过稀疏时,算法会切换到 Lévy flight 分支,因此其探索行为明显依赖 r_base_fracr_linear_coeflevy_step_scale
  • 自定义目标表达式仅允许 x/np/math 与少量安全函数,适合数值型解析表达式,不适合带副作用的复杂程序逻辑。
  • 上传代理优化本质上优化的是随机森林近似函数,样本分布不充分时,得到的最优解可能只是在代理模型意义下最优。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • Run_Summary 表可写为:表X DA 多次独立运行最优值统计。
  • History_Mean 表可写为:表X DA 平均收敛曲线。
  • History_All 表可写为:表X DA 全部运行收敛历史。
  • Best_Solution 表可写为:表X DA 求得的最优解向量。
  • Charts 中收敛图建议写为:图X 蜻蜓优化算法收敛曲线。

9.2 终审说明

  • 当前文档已经有较完整结果模板,终稿时应把正文里的“Summary”表述改成与实际工作表一致的 Run_Summary 或其汇总结果,避免表名和程序导出不一致。
  • 若采用代理优化模式,最优值解释应和 SurrogateMetrics 一起出现。

9.3 全量强化补充

本次全量强化绑定的真实结果目录为 具体的算法3/优化与多目标/DA-蜻蜓优化/results/pytest_baseline_test_swarm_improved_baseline_d0。当前建议作为主引用对象的工作簿为 DA_results_20260329_171707.xlsx,实际工作表为 SummaryProblemDA_ParamsBoundsRun_SummaryHistory_MeanHistory_AllBest_SolutionCharts;主图可引用 DA_convergence_20260329_171707.png

该目录中堆积了大量连续时间戳 xlsx + png,属于 baseline 多轮执行累计目录,而不是单次实验静态快照。本次文档应明确最后一轮 171707 是当前主引用对象,其他时间戳仅为历史运行残留,不宜合并描述成一轮实验。

repro_da.py 的真实口径支持多模式,但当前绑定这份结果时采用的是 benchmark:problem_mode = 'benchmark'objective_name = 'Sphere'n_dims = 6runs = 2,且 source_filetarget_column 为空。也就是说,这里虽然脚本保留了上传代理分支,但本轮强证据绑定到的是 benchmark 双运行统计链路,而不是上传样本链路。

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

本篇对应的软件源码目录是 具体的算法3/优化与多目标/DA-蜻蜓优化。软件实现支持优化模式和上传数据代理优化模式;上传模式同样通过数值表构造代理目标。文档中关于分离、对齐、凝聚、趋食、避敌和惯性权重的理论模型可以保留,但应说明软件输出的是单目标连续优化及其工程化审计表,不是完整生态仿真。

当前较新的代表性目录为 results/DA-蜻蜓优化分析结果_20260517_121925-优化模式results/DA-蜻蜓优化分析结果_20260517_121946-上传数据代理优化。主工作簿 DA_results_*.xlsx 在优化模式下包含 结果摘要结果说明字段说明SummaryProblemDA_ParamsBoundsRun_SummaryHistory_MeanHistory_AllBest_SolutionCharts;上传模式额外包含 UploadedProblemUploadedDataSurrogateMetrics。这说明当前文档中的结果表名应以 Run_SummaryHistory_MeanHistory_AllBest_Solution 为准,而不是泛写 Summary 一张表。

当前图表文件通常直接位于结果目录下,例如 DA_convergence_时间戳.pngDA_preview_时间戳.png;复现输出也会生成新的 DA_convergence_*.png。复现脚本位于 复现代码/优化模式/复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/da_sample.xlsx,复现产物进入 repro_outputs/。因此最终说明中应区分 baseline 历史累计目录、当前主结果目录和复现二次目录,避免把多次时间戳文件合并成一轮实验。