目标规划
一、直观理解:先定「满意水准」,再尽量少偏离
目标规划(Goal Programming, GP)不追求每个目标的数学极端最优,而是先为各目标设定期望水准(aspiration level),然后最小化「没达到」或「超出」的不利偏差。
这更接近管理现实:领导说「成本最好控制在 100 万以内,服务水平尽量不低于 95%,能达到就很好」,而不是「在无穷偏好下求帕累托极点」。
对每个目标 与期望值 ,引入正负偏差变量 :
- :未达到期望的不足;
- :超过期望的超额。
再根据「越多越好 / 越少越好 / 恰好最好」,惩罚相应的偏差,得到单目标(或优先级)优化问题。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 决策者能给出各指标的目标值或满意区间;多目标且偏好用「优先级」表达;资源分配、预算编制、指标考核型赛题。 |
| 核心优点 | 贴合「满意化」决策;偏差变量有直接解释;可用优先级词典优化,避免强行加权;常保持线性,便于 linprog/intlinprog。 |
| 局限与缺点 | 期望水准设得不合理会扭曲结果;不同优先级完全字典序时,低优先级可能几乎无影响;不是专门描绘完整帕累托前沿的工具。 |
使用前确认:
- 每个目标的期望值 从何而来;
- 偏差是单向惩罚还是双向;
- 用权重 GP 还是优先级 GP;
- 原决策变量是否还需整数约束。
三、核心原理:偏差变量与达成函数
1. 目标约束
通常可假设 (同一目标不会同时 excess 与 shortage),线性求解器在最优时一般自动满足。
2. 三类典型目标
| 类型 | 业务含义 | 惩罚对象 |
|---|---|---|
| 不超过 (成本类) | 越小越好,最好 | 主要罚 |
| 不少于 (利润/服务) | 越大越好,最好 | 主要罚 |
| 恰好 | 过高过低都不好 | 罚 |
3. 加权目标规划
权重反映「哪种偏离更不可接受」。注意对 的量纲:不同目标的偏差尺度应归一化,例如用 或事先缩放 。
4. 优先级(词典式)目标规划
设优先级 :先最小化 层加权偏差,再在最优值锁定的前提下优化 ,以此类推。适合「安全第一,成本第二」这类严格顺序偏好。
5. 与加权法、ε-约束的差异
- 加权法:直接权衡原始目标值;
- ε-约束:一个主优化 + 其它阈值;
- 目标规划:围绕设定点最小化偏离,强调满意而非极端最优。
四、关键决策
1. 期望水准 的设定
可来自:历史均值、政策红线、单目标最优的打折(如成本最优的 1.1 倍作为可接受成本)。 过松则解不唯一信息少;过紧则偏差必然很大。
2. 硬约束 vs 目标约束
物理定律、法规底线应作硬约束;希望达到但可商量的指标作目标约束。不要把硬可行性放进软偏差里「买通」。
3. 优先级不要过多
三层以上时,底层往往只在前层有多重最优时才起作用。优先级过多会显得武断。
4. 归一化偏差
避免「成本差 1 元」与「满意度差 0.01」不可比。
五、MATLAB 示例
某生产:,工时 (硬约束)。
目标:
- 利润 希望不少于 30(不足要罚);
- 加班量用「工时尽量不超过 15」表达(超额要罚)——这里把 15 当软目标,20 仍是硬上限。
为清晰,令:
- ,,罚 ;
- ,,罚 。
变量 。
% 目标约束:
% 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);
六、如何解释结果
应说明:
- 各目标的期望水准与惩罚方向;
- 采用优先级还是加权,权重/优先级的业务理由;
- 最优决策 ;
- 每个目标的实际达成值与 (哪项目标未达标、超额多少);
- 硬约束的松弛情况;
- 若调整 或优先级,方案如何变化(敏感性);
- 明确:这是满意解,不一定是某一极端帕累托极点。
表述示例:「在优先满足利润不低于 30 的前提下,工时超出 15 的部分被压到 2;利润恰好达标,无超额。」
七、常见误区
1. 把所有约束都改成软的
会导致物理上不可能的「最优」。底线必须硬约束。
2. 不同量纲偏差直接相加
未归一化时,权重大小失真。
3. 同时惩罚 与 却期望「越多越好」
类型与惩罚项必须匹配,否则逻辑自相矛盾。
4. 优先级过多且无数据支持
显得随意。优先用少量清晰层级。
5. 与帕累托分析完全对立起来
GP 给满意解;仍可用加权/ε-约束展示权衡全貌,二者互补。
6. 偏差变量忘记非负
必须 ,否则目标约束失去意义。
八、小结
目标规划的核心思想可以概括为:
为各目标设定期望水准,引入正负偏差变量,在系统硬约束下最小化加权或分优先级的不利偏差,求「尽量满意」的方案。
它特别适合指标考核、预算与服务水准并存的题目。用好 GP 的关键是:分清软硬约束、设好 、归一化偏差,并用业务语言解释「谁达标、谁差多少」,而不是只给出合成目标值。