正在加载中...

展开本页目录
算法教程DE-差分进化

DE-差分进化

No.180 · 在线教程

差分进化(Differential Evolution, DE)是一类面向连续变量优化的群体智能算法,其核心思想是利用种群个体之间的差分向量构造搜索方向。本项目的实现位于 DE-差分进化/core/de.py,明确采用经典 DE/rand/1/bin 策略,即“随机基向量 + …

DE-差分进化

1. 方法概述

差分进化(Differential Evolution, DE)是一类面向连续变量优化的群体智能算法,其核心思想是利用种群个体之间的差分向量构造搜索方向。本项目的实现位于 DE-差分进化/core/de.py,明确采用经典 DE/rand/1/bin 策略,即“随机基向量 + 单差分变异 + 二项式交叉”。

设第 \(t\) 轮迭代时,第 \(i\) 个个体表示为

$$ \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\) 为搜索区间。对基准函数模式,系统直接求解连续单目标最小化问题:

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

在上传数据代理优化模式下,DE 同样在连续边界内执行,但目标函数由随机森林代理模型给出。

2. 问题定义与代理优化机制

2.1 基准函数模式

core/benchmarks.py 中内置了 \(F1\sim F13\) 共 13 个连续测试函数,并为每个函数给出默认边界与默认维度。例如 Sphere、Schwefel、Rosenbrock、Ackley、Griewank 等均可直接作为目标函数:

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

其中 \(NP\) 表示种群规模。

2.2 上传数据代理优化

当界面切换为“上传数据代理优化”时,utils/problem_definition.py 会从上传表格中识别特征列与目标列,并以随机森林回归器建立代理模型。设清洗后的训练样本为

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

则代理目标函数写为

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

其中 \(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{6} $$

若用户在上传模式中选择“最大化”,系统内部通过

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

将问题统一交给最小化形式的 DE 求解;结果展示阶段再用 predict_actualdisplay_curve 恢复为原始目标方向。

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

其中 \(\odot\) 为逐元素乘积。若边界输入为标量,程序会自动广播到全部维度;若输入为向量,则直接按逐维边界处理。

3.2 差分变异

对目标个体 \(\boldsymbol{x}_i^{(t)}\),程序从其余个体中无放回随机选取三个不同索引 \(r_1,r_2,r_3\),满足

$$ r_1\neq r_2\neq r_3\neq i \tag{9} $$

随后构造变异向量

$$ \boldsymbol{v}_i^{(t)}=\boldsymbol{x}_{r_1}^{(t)}+F\left(\boldsymbol{x}_{r_2}^{(t)}-\boldsymbol{x}_{r_3}^{(t)}\right) \tag{10} $$

其中 \(F\) 为差分缩放因子,对应代码中的 self.F。式(10)正是 DE/rand/1 策略的核心形式。

3.3 二项式交叉

DE/rand/1/bin 中,试验向量 \(\boldsymbol{u}_i^{(t)}\) 通过二项式交叉生成。程序先随机抽取一个强制继承位置 \(j_{\mathrm{rand}}\),然后对每个维度 \(j\) 生成交叉掩码。其数学表达为

$$ u_{ij}^{(t)}= \begin{cases} v_{ij}^{(t)}, & \text{rand}_j<CR \ \text{或}\ j=j_{\mathrm{rand}}\\ x_{ij}^{(t)}, & \text{否则} \end{cases} \tag{11} $$

其中 \(CR\) 为交叉概率。强制位置 \(j_{\mathrm{rand}}\) 的设置保证至少有一个维度来自变异向量,避免试验向量与目标向量完全相同。

3.4 边界处理

生成试验向量后,程序立即采用截断式边界处理:

$$ u_{ij}^{(t)}\leftarrow \min\!\big(\max(u_{ij}^{(t)},l_j),u_j\big) \tag{12} $$

这说明本项目并未使用镜像反弹或随机重采样,而是直接将越界分量裁剪回区间内部。

3.5 贪婪选择

试验向量与原个体比较后执行一对一生存选择:

$$ \boldsymbol{x}_i^{(t+1)}= \begin{cases} \boldsymbol{u}_i^{(t)}, & f(\boldsymbol{u}_i^{(t)})\le f(\boldsymbol{x}_i^{(t)})\\ \boldsymbol{x}_i^{(t)}, & \text{否则} \end{cases} \tag{13} $$

对应适应度更新为

$$ F_i^{(t+1)}=\min\!\left(f(\boldsymbol{x}_i^{(t)}),\,f(\boldsymbol{u}_i^{(t)})\right) \tag{14} $$

因此,该实现属于典型的贪婪型选择机制。

3.6 全局最优与收敛曲线

第 \(t\) 轮迭代后的全局最优值为

$$ g^{(t)}=\min_{1\le i\le NP}F_i^{(t)} \tag{15} $$

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

4. 算法流程

结合 core/de.pyui/upload_widget.pycore/exporter.py,本项目的 DE 求解过程可概括为:

  1. 选择问题模式:内置基准函数或上传数据代理优化。
  2. 确定目标函数、维度及边界;上传模式下先训练随机森林代理模型。
  3. 初始化种群,并计算全部个体适应度。
  4. 对每个目标个体执行差分变异,生成变异向量 \(\boldsymbol{v}_i^{(t)}\)。
  5. 执行二项式交叉得到试验向量 \(\boldsymbol{u}_i^{(t)}\)。
  6. 对试验向量做边界裁剪,并依据式(13)执行贪婪选择。
  7. 更新当轮全局最优值并记录收敛曲线。
  8. 迭代至最大代数后输出最优解、最优值和导出结果。

5. 关键参数说明

  • pop_size:种群规模 \(NP\),控制差分向量来源的丰富程度。
  • max_iter:最大迭代次数 \(T\),决定收敛曲线长度。
  • F:变异因子,对应式(10),控制差分向量放大比例。
  • CR:交叉概率,对应式(11),控制试验向量从变异向量继承信息的强度。
  • dim:维度。在上传模式下由特征列数自动确定。
  • lbub:搜索边界;在代理优化模式下由样本特征极值自动生成。
  • objective_direction:仅在上传代理优化模式下使用,决定目标列是最小化还是最大化。

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

core/exporter.py 最终导出的真实工作表包括:

  • 参数problem_mode、函数名、pop_sizeiterationsFCR、维度、边界摘要以及 best_fitness
  • 收敛曲线:每轮迭代的 iteration / best_fitness
  • 最优解:最终最优位置向量;
  • 图表清单:收敛曲线图片路径;
  • 上传代理模式下额外导出 BoundsUploadedDataSurrogateMetrics

该实现仍是单次运行优化,不提供内置多次独立运行统计;同时导出目录会自动生成复现脚本 repro_de.py。在上传代理模式下,Excel 中的 best_fitness 与收敛曲线已经通过 predict_actualdisplay_curve 恢复为原始目标方向。

若记最终最优解为

$$ \boldsymbol{x}^*=\arg\min_{\boldsymbol{x}_i^{(T)}} f(\boldsymbol{x}_i^{(T)}) \tag{16} $$

则导出表中的 best_fitness 即对应

$$ f^*=f(\boldsymbol{x}^*) \tag{17} $$

收敛曲线工作表中记录的则是每轮迭代的

$$ \big(t,\ g^{(t)}\big),\qquad t=1,2,\ldots,T \tag{18} $$

在上传代理优化模式下,Excel 中还会追加代理模型训练误差,例如

$$ \mathrm{RMSE}=\sqrt{\frac{1}{N_s}\sum_{n=1}^{N_s}\left(y^{(n)}-\hat{f}(\boldsymbol{x}^{(n)})\right)^2} \tag{19} $$

以及

$$ R^2=1-\frac{\sum_{n=1}^{N_s}\left(y^{(n)}-\hat{f}(\boldsymbol{x}^{(n)})\right)^2}{\sum_{n=1}^{N_s}\left(y^{(n)}-\bar{y}\right)^2} \tag{20} $$

用于衡量代理模型对真实目标列的拟合质量。

因此,论文结果部分更适合采用“参数 或问题设置表 + 收敛曲线 + 最优解 + 代理误差指标”的组织方式,而不应写成多次独立运行统计。若为上传代理模式,正文中应明确 best_fitness 与收敛曲线已经恢复为原始目标方向。

7. 论文写作模板

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

“本文采用差分进化算法对连续变量优化问题进行求解。算法使用 DE/rand/1/bin 策略:首先在变量边界内随机初始化种群,然后利用随机基向量与差分向量构造变异个体,并通过二项式交叉生成试验个体,最后采用贪婪选择机制保留更优解。该实现中所有越界分量均通过截断方式投影回可行域。对于上传数据驱动的问题,本文先训练随机森林代理模型,再在样本特征边界内使用差分进化执行黑箱寻优。”

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

“本文记录了差分进化算法的单次最优收敛曲线、最优解向量与最优目标值,并导出参数配置、代理模型拟合指标和可复现实验脚本,以支持方法复现与结果追踪。”

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

  • 本实现适用于连续变量单目标优化,且优化器本体默认按最小化问题设计。
  • 基准函数模式主要面向 \(F1\sim F13\) 数值测试;上传代理模式则适用于数据驱动黑箱优化。
  • F 过大可能导致搜索步长过激,CR 过低则可能削弱变异信息的继承效率。
  • 本实现采用单次运行结果展示,若需要稳健性分析,应额外进行多次独立重复实验。
  • 上传代理优化的实际最优值依赖随机森林代理的泛化精度,训练样本不足时需谨慎解释最优解。

9. 单篇终审补充

9.1 图题与表题对齐建议

  • 收敛曲线 图建议统一写为:图X 差分进化算法收敛曲线。
  • 最优解 表建议写为:表X DE 求得的最优解向量。
  • 最佳适应度 或结果汇总表建议写为:表X DE 最终最优目标值。

9.2 终审说明

  • 当前文档已经具备结果解释段落,但正式落稿时应确认图题直接对应 convergence.png 或同义收敛图,而不是泛写“优化结果图”。
  • 若采用上传代理模式,结果段落中提到的最优值应明确是“恢复原始目标方向后的显示值”,这一点当前文档已和实现口径保持一致。

9.3 全量强化补充

本次全量强化绑定的真实上传验证目录为 具体的算法3/优化与多目标/DE-差分进化/results/manual_upload_verify_20260328/DE-差分进化分析结果_20260328_121519。主结果文件为 DE-差分进化_结果_20260328_121519.xlsx,实际工作表为 参数收敛曲线最优解图表清单BoundsUploadedDataSurrogateMetrics

当前真实图文件为 charts/convergence.png。该目录还存在复现后生成的 DE-差分进化_结果_20260328_121525.xlsx,论文正文若引用主实验,应固定主结果文件;复现再生产物可作为附录可复核证据。

复现脚本为 repro_de.py,输入口径为 INPUT_FILE = Path('repro_inputs/de_sample.xlsx'),运行模式为 problem_mode = 'upload_surrogate'。因此这篇文档已经可以明确写成“基于结果目录内 repro_inputs/de_sample.xlsx 的上传代理 DE 复现”,并应结合 SurrogateMetrics 说明代理模型拟合质量。

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

本篇对应的软件源码目录是 具体的算法3/优化与多目标/DE-差分进化。软件实现支持优化模式和上传数据代理优化模式;上传模式读取数值表后用代理模型给差分进化提供目标函数。理论中关于变异、交叉、选择、缩放因子和交叉概率的公式可以保留,但软件交付说明应强调当前是单目标连续优化实现,并按 DE_Params 中的参数解释结果。

当前较新的代表性目录为 results/DE-差分进化分析结果_20260517_103741-优化模式results/DE-差分进化分析结果_20260517_103755-上传数据代理优化。主工作簿 DE_results_*.xlsx 在优化模式下包含 字段说明SummaryProblemDE_ParamsBoundsRun_SummaryHistory_MeanHistory_AllBest_SolutionCharts;上传模式额外包含 UploadedProblemUploadedDataSurrogateMetrics。如果使用上传数据结果,应把最优值解释为代理模型目标上的显示值,并报告代理模型拟合质量。

当前图表通常直接位于结果目录下,例如 DE_convergence_时间戳.pngDE_preview_时间戳.png;复现输出中也会生成 DE_convergence_*.png。复现脚本位于 复现代码/优化模式/复现代码/上传数据代理优化/,上传模式输入副本为 repro_inputs/de_sample.xlsx,复现结果写入 repro_outputs/。旧文中提到 charts/convergence.png 的历史目录可以保留为历史证据,但当前较新的软件结果应按 Charts 表和直接生成的 DE_convergence_*.png 解释。