跳到主要内容

差分进化

一、直观理解:用群体中的「向量差」当自适应步长​

差分进化(Differential Evolution, DE)是面向连续空间的种群进化算法。它不用梯度,而是从种群里随机抽个体,用它们的差向量扰动另一个体,生成试验向量,再与父代一对一竞争存活。

典型变异:

vi=xr1+F(xr2−xr3)v_i=x_{r1}+F(x_{r2}-x_{r3})

FF 为缩放因子。差向量大时步子大(探索),种群收敛后差变小(自动缩小步长),这是一种自适应尺度的直觉。

DE 在实参优化、反问题拟合中口碑很好,实现也干净,但依旧是随机启发式,不能证明全局最优。

定位(必读):仅作兜底。可微问题先 fmincon/多起点;凸问题走凸优化。DE 用于多峰、噪声较小的黑箱连续优化。必须报告随机种子、多次运行,并与多起点局部搜索等基线比较。

二、适用场景与优缺点​

类型说明
适用场景连续参数辨识、多峰函数、边界约束实优化;维数约从数维到百维(再高需小心);目标可快速评价。
核心优点参数少(F,CR,NPF,CR,NP);对许多基准函数稳健;无需导数;一对一选择压力适中。
局限与缺点离散/排列问题不是原生领域;约束需罚或特殊处理;高维与昂贵评价时样本效率不如代理模型方法;无最优保证。

动用前:多起点 NLP 是否已做?变量是否缩放?评价预算是否允许种群方法?

三、核心原理​

1. 初始化​

在盒约束 [ℓ,u][\ell,u] 内均匀随机生成 NPNP 个个体。

2. 变异(常见 DE/rand/1)​

vi=xr1+F(xr2−xr3),r1≠r2≠r3≠iv_i=x_{r1}+F(x_{r2}-x_{r3}),\quad r1\neq r2\neq r3\neq i

其它变体:best/1、current-to-best/1 等,平衡探索与开发。

3. 交叉​

二项式交叉:对每一维以概率 CRCR 取 viv_i 的分量,否则保留 xix_i;并至少保证一维来自 viv_i。

4. 选择​

xi←{ui,f(ui)≤f(xi)xi,否则x_i\leftarrow\begin{cases}u_i,& f(u_i)\le f(x_i)\\ x_i,& \text{否则}\end{cases}

(uiu_i 为交叉后的试验向量。)

5. 边界处理​

越界分量可截断到边界、随机重置或反射。

6. 参数经验​

  • NP≈5n∼10nNP\approx 5n\sim 10n(nn 维数);
  • F∈[0.4,0.9]F\in[0.4,0.9];
  • CR∈[0.1,0.9]CR\in[0.1,0.9](可分问题 CRCR 偏小,不可分偏大)。

四、关键决策​

1. 基线对齐评价次数​

设总评价约 NP×GNP\times G,多起点局部搜索使用相同数量级的目标调用次数。

2. 缩放​

把变量映射到 [0,1]n[0,1]^n 再优化,常显著改善 FF 的通用性。

3. 约束​

等式约束难;不等式用罚函数或可行性规则。有大量线性约束时仍应优先数学规划。

4. 复现​

多种子;N≥10N\ge 10;报告 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));

六、如何解释结果​

完整报告:

  1. 选用 DE 的原因(非凸/黑箱/梯度不可用);
  2. 维数、边界、缩放;
  3. 变体(rand/1/bin 等)、NP,F,CR,GNP,F,CR,G 与总评价;
  4. 种子列表与 best/mean/std;
  5. 同预算基线表;
  6. 最优参数的业务含义与约束检查;
  7. 明确「启发式近优」。

七、常见误区​

1. 可微凸问题仍上 DE​

浪费且失去最优性证书。

2. 不缩放变量​

FF 难以通用,某些维抖、某些维僵。

3. NPNP 过小​

多样性不足,早熟。

4. 只报一次运行​

DE 也有随机性。

5. 交叉后不处理边界​

试验点可能非法。

6. 与基线评价次数相差数量级​

结论不成立。

八、小结​

差分进化的核心思想可以概括为:

利用种群个体之间的差分向量生成扰动,经交叉与一对一择优,在连续空间中自适应尺度地搜索近优解。

它是实数黑箱优化中强而简洁的兜底算法,但仍排在精确、凸与梯度方法之后。规范使用要求:合理参数与缩放、多种子统计、同预算基线对比,以及不夸大最优性的结果表述。