跳到主要内容

ε-约束法

一、直观理解:主攻一个目标,其余目标设成「及格线」​

ε-约束法(ε-Constraint Method)处理多目标时,不把所有目标揉进一个加权和,而是:

  1. 选定一个主目标继续优化;
  2. 把其余目标变成约束:必须不劣于给定阈值 ε\varepsilon。

就像考试:主攻总分最高,但要求每一门都不低于及格线。收紧或放宽及格线,就会逼出不同的折中方案。

对双目标 min⁡(f1,f2)\min(f_1,f_2):

min⁡ f1(x)s.t.f2(x)≤ε, x∈X\min\ f_1(x)\quad\text{s.t.}\quad f_2(x)\le\varepsilon,\ x\in X

让 ε\varepsilon 从松到紧变化,记录每次最优的 (f1,f2)(f_1,f_2),即可描出帕累托前沿,而且对非凸前沿往往比加权法更完整。

二、适用场景与优缺点​

类型说明
适用场景目标冲突明显;怀疑帕累托前沿非凸;决策者更习惯「在指标 B 不超过某值时优化 A」;需要均匀覆盖的前沿样本。
核心优点能生成加权法得不到的有效解;ε 有明确业务含义(预算上限、排放上限);实现仍是单目标优化。
局限与缺点ε 网格需设计,太疏漏点、太密费时;目标很多时约束组合爆炸;每个 ε 都要求解一次,总计算量大;主目标选择影响数值表现。

使用前确认:

  1. 哪个目标作主目标最符合提问方式;
  2. 各目标单独优化的值域,以便设定 ε 范围;
  3. 约束 fk(x)≤εkf_k(x)\le\varepsilon_k 是否保持原模型类(线性/非线性);
  4. 需要多少个代表性折中点。

三、核心原理:切片可行域​

1. 一般形式​

min⁡x∈Xfj(x)s.t.fk(x)≤εk,k≠j\begin{aligned} \min_{x\in X}\quad & f_j(x) \\ \text{s.t.}\quad & f_k(x)\le\varepsilon_k,\quad k\neq j \end{aligned}

若原目标是最大化,约束改为 fk(x)≥εkf_k(x)\ge\varepsilon_k。

2. 为什么能补全非凸部分​

加权和的等值面是「斜切」目标空间,可能跨过凹陷区而切不到支撑点;ε-约束是「水平/垂直切割」,在每个切片上优化,更容易贴到凹陷边界上的有效点。

3. ε 的取值范围​

对 k≠jk\neq j,先求:

  • fkmin⁡=min⁡x∈Xfkf_k^{\min}=\min_{x\in X}f_k(单目标最优);
  • fkmax⁡f_k^{\max}:可在其它目标最优点处评估 fkf_k,或求 max⁡fk\max f_k(若有界)。

然后在 [fkmin⁡,fkmax⁡][f_k^{\min}, f_k^{\max}] 上取网格 εk(t)\varepsilon_k^{(t)}。过紧可能导致不可行,过松则约束不活跃。

4. 弱有效与真正帕累托​

某些 ε 下可能得到弱有效解。实践中可:对主目标最优后再做词典式优化、或给其它目标加微小权重,以筛选强帕累托点。

5. 与加权法、目标规划的关系​

方法偏好表达前沿覆盖
加权法相对重要性 ww凸部分好
ε-约束阈值/预算 ε\varepsilon非凸也较好
目标规划期望水准与偏离惩罚满意解导向

四、关键决策​

1. 主目标怎么选​

选「最想极致优化」或「量纲清晰、求解稳定」的目标。另一目标天然是资源/风险上限时,特别适合做 ε 约束。

2. 网格策略​

均匀网格简单;也可在变化剧烈处加密。二维用一维网格即可;三维需二维网格,点数平方增长。

3. 不可行处理​

某 ε\varepsilon 下模型不可行,说明阈值过严,记录后跳过,不要误报。

4. 保持可解性​

若 fkf_k 非线性,ε 约束使问题变 NLP;若 fkf_k 线性,LP/MILP 结构保留。尽量避免把简单问题弄复杂。

五、MATLAB 示例​

沿用加权法中的双目标 LP:

min⁡f1=4x1+x2,min⁡f2=x1+3x2,x1+x2≥4, x≥0\min f_1=4x_1+x_2,\quad \min f_2=x_1+3x_2,\quad x_1+x_2\ge 4,\ x\ge 0

以 f1f_1 为主目标,f2≤εf_2\le\varepsilon。

A_base = [-1, -1];
b_base = -4;
lb = [0; 0];
c1 = [4; 1];
c2 = [1; 3];

% 估计 f2 的范围
[x2opt, f2min] = linprog(c2, A_base, b_base, [], [], lb, []);
[x1opt, f1min] = linprog(c1, A_base, b_base, [], [], lb, []);
f2max = c2' * x1opt; % 在 f1 最优处的 f2
f1_at_f2min = c1' * x2opt;

fprintf("f1 理想=%.4f, f2 理想=%.4f, f2 上端≈%.4f\n", ...
f1min, f2min, f2max);

epsGrid = linspace(f2min, f2max, 11);
front = [];

for t = 1:numel(epsGrid)
eps2 = epsGrid(t);
% f2 = c2'x <= eps2
A = [A_base; c2'];
b = [b_base; eps2];
[x, f1val, exitflag] = linprog(c1, A, b, [], [], lb, []);
if exitflag ~= 1
fprintf("eps=%.4f 不可行或未最优, exitflag=%d\n", eps2, exitflag);
continue;
end
f2val = c2' * x;
front = [front; eps2, x(1), x(2), f1val, f2val]; %#ok<AGROW>
end

disp(array2table(front, "VariableNames", ...
["eps", "x1", "x2", "f1", "f2"]));

figure;
plot(front(:, 4), front(:, 5), "-s", "LineWidth", 1.2);
xlabel("f_1");
ylabel("f_2");
title("ε-约束法得到的帕累托近似前沿");
grid on;

非线性示例骨架(示意):

% min f1(x) s.t. f2(x) <= eps, lb <= x <= ub
% fun = @(x) f1(x);
% nonlcon = @(x) deal(f2(x)-eps, []); % c<=0, ceq=[]
% x = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, opts);

六、如何解释结果​

报告建议:

  1. 主目标与被约束目标的选择理由;
  2. 各目标单独最优(理想点)与 ε 网格设计;
  3. 表格:ε\varepsilon、可行性、最优 xx、F(x)F(x);
  4. 目标空间图:随 ε 收紧,主目标如何变差;
  5. 推荐 2~3 个代表性情景(宽松 / 中等 / 严格阈值);
  6. 与加权法结果对比:是否出现加权未扫到的点;
  7. 决策建议用业务语言:「若时间不超过 12,最低成本为…」。

七、常见误区​

1. ε 超出可达范围却不检查 exitflag​

不可行时没有有效折中点,不能沿用上一次的 xx。

2. 网格过粗就画「光滑前沿」​

点与点之间可能有结构变化,应说明是离散采样。

3. 主目标选错导致约束病态​

数值尺度悬殊时,可对 fkf_k 缩放后再设 ε。

4. 目标很多时穷举所有 ε 组合​

维数高应结合偏好缩小范围,或分层/交互式设定 ε。

5. 认为 ε-约束一定给出全部帕累托解​

理论上在连续变化且求解全局最优时表现好,但数值网格与局部最优(非凸 NLP)仍会遗漏。

八、小结​

ε-约束法的核心思想可以概括为:

只优化一个主目标,把其它目标转化为带阈值 ε 的约束,通过移动阈值生成一系列帕累托折中解。

它特别适合「有硬性指标上限/下限」的提问方式,并能补强加权法在非凸前沿上的盲区。实践中先求理想点、设计 ε 网格、记录可行性与目标向量,再给出情景化推荐,而不是只交一个解。