跳到主要内容

目标规划

一、直观理解:先定「满意水准」,再尽量少偏离​

目标规划(Goal Programming, GP)不追求每个目标的数学极端最优,而是先为各目标设定期望水准(aspiration level),然后最小化「没达到」或「超出」的不利偏差。

这更接近管理现实:领导说「成本最好控制在 100 万以内,服务水平尽量不低于 95%,能达到就很好」,而不是「在无穷偏好下求帕累托极点」。

对每个目标 fk(x)f_k(x) 与期望值 gkg_k,引入正负偏差变量 dk+,dk−≥0d_k^+, d_k^-\ge 0:

fk(x)+dk−−dk+=gkf_k(x)+d_k^--d_k^+=g_k
  • dk−d_k^-:未达到期望的不足;
  • dk+d_k^+:超过期望的超额。

再根据「越多越好 / 越少越好 / 恰好最好」,惩罚相应的偏差,得到单目标(或优先级)优化问题。

二、适用场景与优缺点​

类型说明
适用场景决策者能给出各指标的目标值或满意区间;多目标且偏好用「优先级」表达;资源分配、预算编制、指标考核型赛题。
核心优点贴合「满意化」决策;偏差变量有直接解释;可用优先级词典优化,避免强行加权;常保持线性,便于 linprog/intlinprog。
局限与缺点期望水准设得不合理会扭曲结果;不同优先级完全字典序时,低优先级可能几乎无影响;不是专门描绘完整帕累托前沿的工具。

使用前确认:

  1. 每个目标的期望值 gkg_k 从何而来;
  2. 偏差是单向惩罚还是双向;
  3. 用权重 GP 还是优先级 GP;
  4. 原决策变量是否还需整数约束。

三、核心原理:偏差变量与达成函数​

1. 目标约束​

fk(x)+dk−−dk+=gk,dk+,dk−≥0f_k(x)+d_k^--d_k^+=g_k,\quad d_k^+,d_k^-\ge 0

通常可假设 dk+dk−=0d_k^+d_k^-=0(同一目标不会同时 excess 与 shortage),线性求解器在最优时一般自动满足。

2. 三类典型目标​

类型业务含义惩罚对象
不超过 gkg_k(成本类)fkf_k 越小越好,最好 ≤gk\le g_k主要罚 dk+d_k^+
不少于 gkg_k(利润/服务)fkf_k 越大越好,最好 ≥gk\ge g_k主要罚 dk−d_k^-
恰好 gkg_k过高过低都不好罚 dk++dk−d_k^++d_k^-

3. 加权目标规划​

min⁡∑k(wk−dk−+wk+dk+)s.t. 目标约束 + 系统硬约束\min\quad \sum_k\bigl(w_k^- d_k^-+w_k^+ d_k^+\bigr) \quad\text{s.t. 目标约束 + 系统硬约束}

权重反映「哪种偏离更不可接受」。注意对 dd 的量纲:不同目标的偏差尺度应归一化,例如用 dk/gkd_k/g_k 或事先缩放 fkf_k。

4. 优先级(词典式)目标规划​

设优先级 P1≫P2≫⋯P_1\gg P_2\gg\cdots:先最小化 P1P_1 层加权偏差,再在最优值锁定的前提下优化 P2P_2,以此类推。适合「安全第一,成本第二」这类严格顺序偏好。

5. 与加权法、ε-约束的差异​

  • 加权法:直接权衡原始目标值;
  • ε-约束:一个主优化 + 其它阈值;
  • 目标规划:围绕设定点最小化偏离,强调满意而非极端最优。

四、关键决策​

1. 期望水准 gkg_k 的设定​

可来自:历史均值、政策红线、单目标最优的打折(如成本最优的 1.1 倍作为可接受成本)。gkg_k 过松则解不唯一信息少;过紧则偏差必然很大。

2. 硬约束 vs 目标约束​

物理定律、法规底线应作硬约束;希望达到但可商量的指标作目标约束。不要把硬可行性放进软偏差里「买通」。

3. 优先级不要过多​

三层以上时,底层往往只在前层有多重最优时才起作用。优先级过多会显得武断。

4. 归一化偏差​

min⁡∑kwkdk++dk−∣gk∣+ε\min\sum_k w_k\frac{d_k^++d_k^-}{|g_k|+\varepsilon}

避免「成本差 1 元」与「满意度差 0.01」不可比。

五、MATLAB 示例​

某生产:x1,x2≥0x_1,x_2\ge 0,工时 2x1+x2≤202x_1+x_2\le 20(硬约束)。

目标:

  1. 利润 3x1+4x23x_1+4x_2 希望不少于 30(不足要罚);
  2. 加班量用「工时尽量不超过 15」表达(超额要罚)——这里把 15 当软目标,20 仍是硬上限。

为清晰,令:

  • f1=3x1+4x2f_1=3x_1+4x_2,g1=30g_1=30,罚 d1−d_1^-;
  • f2=2x1+x2f_2=2x_1+x_2,g2=15g_2=15,罚 d2+d_2^+。

变量 [x1,x2,d1−,d1+,d2−,d2+][x_1,x_2,d_1^-,d_1^+,d_2^-,d_2^+]。

% 目标约束:
% 3x1+4x2 + d1- - d1+ = 30
% 2x1+x2 + d2- - d2+ = 15
% 硬约束:2x1+x2 <= 20

% 优先级示例:先保证利润达标(min d1-),再在此基础上 min d2+
% --- 第一阶段:min d1- ---
f1 = [0; 0; 1; 0; 0; 0];
A = [2, 1, 0, 0, 0, 0];
b = 20;
Aeq = [
3, 4, 1, -1, 0, 0;
2, 1, 0, 0, 1, -1
];
beq = [30; 15];
lb = zeros(6, 1);

[z1, d1min, ef1] = linprog(f1, A, b, Aeq, beq, lb, []);
fprintf("阶段1 exitflag=%d, 最小利润不足 d1-=%g\n", ef1, d1min);

% --- 第二阶段:锁定 d1- = d1min,最小化 d2+ ---
% 增加等式 d1- = d1min
Aeq2 = [Aeq; 0, 0, 1, 0, 0, 0];
beq2 = [beq; d1min];
f2 = [0; 0; 0; 0; 0; 1]; % min d2+

[z2, d2plus, ef2] = linprog(f2, A, b, Aeq2, beq2, lb, []);
x = z2(1:2);
fprintf("阶段2 exitflag=%d, d2+=%g\n", ef2, d2plus);
fprintf("方案 x1=%.4f, x2=%.4f\n", x(1), x(2));
fprintf("利润=%.4f, 工时=%.4f\n", 3*x(1)+4*x(2), 2*x(1)+x(2));
fprintf("偏差: d1-=%.4f, d1+=%.4f, d2-=%.4f, d2+=%.4f\n", ...
z2(3), z2(4), z2(5), z2(6));

加权 GP(单阶段)示例:

% min 10*(d1-/30) + 1*(d2+/15) 归一化加权
w = [0; 0; 10/30; 0; 0; 1/15];
[zw, fw, efw] = linprog(w, A, b, Aeq, beq, lb, []);
fprintf("加权GP: 利润=%.4f, 工时=%.4f, 标量=%g\n", ...
3*zw(1)+4*zw(2), 2*zw(1)+zw(2), fw);

六、如何解释结果​

应说明:

  1. 各目标的期望水准与惩罚方向;
  2. 采用优先级还是加权,权重/优先级的业务理由;
  3. 最优决策 xx;
  4. 每个目标的实际达成值与 d+,d−d^+,d^-(哪项目标未达标、超额多少);
  5. 硬约束的松弛情况;
  6. 若调整 gkg_k 或优先级,方案如何变化(敏感性);
  7. 明确:这是满意解,不一定是某一极端帕累托极点。

表述示例:「在优先满足利润不低于 30 的前提下,工时超出 15 的部分被压到 2;利润恰好达标,无超额。」

七、常见误区​

1. 把所有约束都改成软的​

会导致物理上不可能的「最优」。底线必须硬约束。

2. 不同量纲偏差直接相加​

未归一化时,权重大小失真。

3. 同时惩罚 d+d^+ 与 d−d^- 却期望「越多越好」​

类型与惩罚项必须匹配,否则逻辑自相矛盾。

4. 优先级过多且无数据支持​

显得随意。优先用少量清晰层级。

5. 与帕累托分析完全对立起来​

GP 给满意解;仍可用加权/ε-约束展示权衡全貌,二者互补。

6. 偏差变量忘记非负​

d+,d−d^+,d^- 必须 ≥0\ge 0,否则目标约束失去意义。

八、小结​

目标规划的核心思想可以概括为:

为各目标设定期望水准,引入正负偏差变量,在系统硬约束下最小化加权或分优先级的不利偏差,求「尽量满意」的方案。

它特别适合指标考核、预算与服务水准并存的题目。用好 GP 的关键是:分清软硬约束、设好 gkg_k、归一化偏差,并用业务语言解释「谁达标、谁差多少」,而不是只给出合成目标值。