差分进化
一、直观理解:用群体中的「向量差」当自适应步长
差分进化(Differential Evolution, DE)是面向连续空间的种群进化算法。它不用梯度,而是从种群里随机抽个体,用它们的差向量扰动另一个体,生成试验向量,再与父代一对一竞争存活。
典型变异:
为缩放因子。差向量大时步子大(探索),种群收敛后差变小(自动缩小步长),这是一种自适应尺度的直觉。
DE 在实参优化、反问题拟合中口碑很好,实现也干净,但依旧是随机启发式,不能证明全局最优。
定位(必读):仅作兜底。可微问题先
fmincon/多起点;凸问题走凸优化。DE 用于多峰、噪声较小的黑箱连续优化。必须报告随机种子、多次运行,并与多起点局部搜索等基线比较。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 连续参数辨识、多峰函数、边界约束实优化;维数约从数维到百维(再高需小心);目标可快速评价。 |
| 核心优点 | 参数少();对许多基准函数稳健;无需导数;一对一选择压力适中。 |
| 局限与缺点 | 离散/排列问题不是原生领域;约束需罚或特殊处理;高维与昂贵评价时样本效率不如代理模型方法;无最优保证。 |
动用前:多起点 NLP 是否已做?变量是否缩放?评价预算是否允许种群方法?
三、核心原理
1. 初始化
在盒约束 内均匀随机生成 个个体。
2. 变异(常见 DE/rand/1)
其它变体:best/1、current-to-best/1 等,平衡探索与开发。
3. 交叉
二项式交叉:对每一维以概率 取 的分量,否则保留 ;并至少保证一维来自 。
4. 选择
( 为交叉后的试验向量。)
5. 边界处理
越界分量可截断到边界、随机重置或反射。
6. 参数经验
- ( 维数);
- ;
- (可分问题 偏小,不可分偏大)。
四、关键决策
1. 基线对齐评价次数
设总评价约 ,多起点局部搜索使用相同数量级的目标调用次数。
2. 缩放
把变量映射到 再优化,常显著改善 的通用性。
3. 约束
等式约束难;不等式用罚函数或可行性规则。有大量线性约束时仍应优先数学规划。
4. 复现
多种子;;报告 best/mean/std 与成功率(若定义阈值)。
5. 与 PSO/GA 的选择
连续盒约束实优化中,DE 常作为很强的默认元启发式;但仍次于可用的精确/凸/梯度方法。
五、MATLAB 示例
手写 DE/rand/1/bin + 基线
% Ackley 函数
ackley = @(x) -20*exp(-0.2*sqrt(mean(x.^2))) ...
- exp(mean(cos(2*pi*x))) + 20 + exp(1);
n = 6;
lb = -5*ones(1,n); ub = 5*ones(1,n);
% 评价计数器包装
function [f, cnt] = evalFun(fun, x, cnt)
f = fun(x); cnt = cnt + 1;
end
% ---- 基线:固定预算多起点 fmincon ----
budget = 12000;
cnt = 0; baseBest = inf; starts = 0;
while cnt < budget - 200
starts = starts + 1;
rng(3000+starts);
x0 = lb + rand(1,n).*(ub-lb);
opts = optimoptions("fmincon", "Display", "off", ...
"MaxFunctionEvaluations", 200);
[~, fk, ~, out] = fmincon(@(x) ackley(x(:)'), x0, [], [], [], [], lb, ub, [], opts);
cnt = cnt + out.funcCount;
baseBest = min(baseBest, fk);
end
fprintf("基线多起点 fmincon: best=%.6f, 约用评价 %d, 启动 %d 次\n", ...
baseBest, cnt, starts);
% ---- DE 多次,每次评价预算相近 ----
nRuns = 12; seeds = 15000+(1:nRuns); rec = zeros(nRuns,1);
NP = 8*n; F = 0.7; CR = 0.9;
G = max(50, floor(budget / NP)); % 代数
for r = 1:nRuns
rng(seeds(r));
X = lb + rand(NP,n).*(ub-lb);
fit = zeros(NP,1);
for i = 1:NP, fit(i)=ackley(X(i,:)); end
for g = 1:G
for i = 1:NP
idx = randperm(NP, 3);
while any(idx == i), idx = randperm(NP, 3); end
v = X(idx(1),:) + F*(X(idx(2),:)-X(idx(3),:));
v = min(max(v, lb), ub);
u = X(i,:);
jrand = randi(n);
mask = rand(1,n) < CR; mask(jrand)=true;
u(mask) = v(mask);
fu = ackley(u);
if fu <= fit(i)
X(i,:)=u; fit(i)=fu;
end
end
end
rec(r) = min(fit);
end
fprintf("DE %d次 best/mean/std=%.6f/%.6f/%.6f\n", ...
nRuns, min(rec), mean(rec), std(rec));
fprintf("种子: "); disp(seeds);
fprintf("评价/次约 %d;相对基线差 %.6f\n", NP*G, min(rec)-baseBest);
工具箱 de 风格接口(若有 Global Optimization 其它算法)
MATLAB 没有永远同名的 de 于所有版本;可用自写 DE 或 ga/particleswarm 作对照。关键是实验协议一致,而不是调用名字。
% 与 particleswarm 同预算粗比
opts = optimoptions("particleswarm", "Display", "off", ...
"SwarmSize", NP, "MaxIterations", G);
ps = zeros(10,1);
for r = 1:10
rng(16000+r);
[~, ps(r)] = particleswarm(@(x) ackley(x), n, lb, ub, opts);
end
fprintf("PSO 对照 best/mean=%.6f/%.6f\n", min(ps), mean(ps));
六、如何解释结果
完整报告:
- 选用 DE 的原因(非凸/黑箱/梯度不可用);
- 维数、边界、缩放;
- 变体(rand/1/bin 等)、 与总评价;
- 种子列表与 best/mean/std;
- 同预算基线表;
- 最优参数的业务含义与约束检查;
- 明确「启发式近优」。
七、常见误区
1. 可微凸问题仍上 DE
浪费且失去最优性证书。
2. 不缩放变量
难以通用,某些维抖、某些维僵。
3. 过小
多样性不足,早熟。
4. 只报一次运行
DE 也有随机性。
5. 交叉后不处理边界
试验点可能非法。
6. 与基线评价次数相差数量级
结论不成立。
八、小结
差分进化的核心思想可以概括为:
利用种群个体之间的差分向量生成扰动,经交叉与一对一择优,在连续空间中自适应尺度地搜索近优解。
它是实数黑箱优化中强而简洁的兜底算法,但仍排在精确、凸与梯度方法之后。规范使用要求:合理参数与缩放、多种子统计、同预算基线对比,以及不夸大最优性的结果表述。