ε-约束法
一、直观理解:主攻一个目标,其余目标设成「及格线」
ε-约束法(ε-Constraint Method)处理多目标时,不把所有目标揉进一个加权和,而是:
- 选定一个主目标继续优化;
- 把其余目标变成约束:必须不劣于给定阈值 。
就像考试:主攻总分最高,但要求每一门都不低于及格线。收紧或放宽及格线,就会逼出不同的折中方案。
对双目标 :
让 从松到紧变化,记录每次最优的 ,即可描出帕累托前沿,而且对非凸前沿往往比加权法更完整。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 目标冲突明显;怀疑帕累托前沿非凸;决策者更习惯「在指标 B 不超过某值时优化 A」;需要均匀覆盖的前沿样本。 |
| 核心优点 | 能生成加权法得不到的有效解;ε 有明确业务含义(预算上限、排放上限);实现仍是单目标优化。 |
| 局限与缺点 | ε 网格需设计,太疏漏点、太密费时;目标很多时约束组合爆炸;每个 ε 都要求解一次,总计算量大;主目标选择影响数值表现。 |
使用前确认:
- 哪个目标作主目标最符合提问方式;
- 各目标单独优化的值域,以便设定 ε 范围;
- 约束 是否保持原模型类(线性/非线性);
- 需要多少个代表性折中点。
三、核心原理:切片可行域
1. 一般形式
若原目标是最大化,约束改为 。
2. 为什么能补全非凸部分
加权和的等值面是「斜切」目标空间,可能跨过凹陷区而切不到支撑点;ε-约束是「水平/垂直切割」,在每个切片上优化,更容易贴到凹陷边界上的有效点。
3. ε 的取值范围
对 ,先求:
- (单目标最优);
- :可在其它目标最优点处评估 ,或求 (若有界)。
然后在 上取网格 。过紧可能导致不可行,过松则约束不活跃。
4. 弱有效与真正帕累托
某些 ε 下可能得到弱有效解。实践中可:对主目标最优后再做词典式优化、或给其它目标加微小权重,以筛选强帕累托点。
5. 与加权法、目标规划的关系
| 方法 | 偏好表达 | 前沿覆盖 |
|---|---|---|
| 加权法 | 相对重要性 | 凸部分好 |
| ε-约束 | 阈值/预算 | 非凸也较好 |
| 目标规划 | 期望水准与偏离惩罚 | 满意解导向 |
四、关键决策
1. 主目标怎么选
选「最想极致优化」或「量纲清晰、求解稳定」的目标。另一目标天然是资源/风险上限时,特别适合做 ε 约束。
2. 网格策略
均匀网格简单;也可在变化剧烈处加密。二维用一维网格即可;三维需二维网格,点数平方增长。
3. 不可行处理
某 下模型不可行,说明阈值过严,记录后跳过,不要误报。
4. 保持可解性
若 非线性,ε 约束使问题变 NLP;若 线性,LP/MILP 结构保留。尽量避免把简单问题弄复杂。
五、MATLAB 示例
沿用加权法中的双目标 LP:
以 为主目标,。
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);
六、如何解释结果
报告建议:
- 主目标与被约束目标的选择理由;
- 各目标单独最优(理想点)与 ε 网格设计;
- 表格:、可行性、最优 、;
- 目标空间图:随 ε 收紧,主目标如何变差;
- 推荐 2~3 个代表性情景(宽松 / 中等 / 严格阈值);
- 与加权法结果对比:是否出现加权未扫到的点;
- 决策建议用业务语言:「若时间不超过 12,最低成本为…」。
七、常见误区
1. ε 超出可达范围却不检查 exitflag
不可行时没有有效折中点,不能沿用上一次的 。
2. 网格过粗就画「光滑前沿」
点与点之间可能有结构变化,应说明是离散采样。
3. 主目标选错导致约束病态
数值尺度悬殊时,可对 缩放后再设 ε。
4. 目标很多时穷举所有 ε 组合
维数高应结合偏好缩小范围,或分层/交互式设定 ε。
5. 认为 ε-约束一定给出全部帕累托解
理论上在连续变化且求解全局最优时表现好,但数值网格与局部最优(非凸 NLP)仍会遗漏。
八、小结
ε-约束法的核心思想可以概括为:
只优化一个主目标,把其它目标转化为带阈值 ε 的约束,通过移动阈值生成一系列帕累托折中解。
它特别适合「有硬性指标上限/下限」的提问方式,并能补强加权法在非凸前沿上的盲区。实践中先求理想点、设计 ε 网格、记录可行性与目标向量,再给出情景化推荐,而不是只交一个解。