2线性规划
线性规划与应用笔记
一、线性规划基础理论
(一)数学标准型
线性规划的数学标准型以最大化目标函数为核心,形式为:
- 可行解:满足约束条件的解 $ x = [x_1, x_2, \dots, x_n]^T $。
- 最优解:使目标函数达到最大值的可行解。
- 可行域:所有可行解的集合,记为 $ R $。
(二)Matlab标准型与求解
Matlab 为统一形式,规定线性规划的标准型为最小化目标函数,形式为:
其中,$ c, x, b, b_{\text{eq}}, lb, ub $ 为列向量,$ A, A_{\text{eq}} $ 为矩阵。
Matlab 求解命令:linprog
根据约束类型选择调用形式:
-
仅含不等式约束 $ Ax \leq b $:
[x,fval] = linprog(c,A,b)
-
含不等式和等式约束:
[x,fval] = linprog(c,A,b,Aeq,beq)
-
含所有约束(不等式、等式、变量上下界):
[x,fval] = linprog(c,A,b,Aeq,beq,lb,ub)
- 输出说明:
x
为决策向量的最优值,fval
为目标函数的最优值。
(三)可转化为线性规划的问题(以绝对值目标为例)
对于目标函数含绝对值的问题(如 $ \min \sum_{i=1}^n |x_i| $,约束 $ Ax \leq b $),通过变量替换转化为线性规划:
对任意 $ x_i $,引入 $ u_i, v_i \geq 0 $,满足:
(实际可取 $ u_i = \frac{x_i + |x_i|}{2} \(,\) v_i = \frac{|x_i| - x_i}{2} $)。
转化后问题为:
二、投资的收益与风险模型(多目标线性规划应用)
(一)问题背景与假设
- 资产:$ n $ 种风险资产 $ s_1, s_2, \dots, s_n $(如股票、债券) + 银行存款 $ s_0 $(无风险,收益率 $ r_0 $,无交易费/风险)。
- 参数:各资产 $ s_i $ 的平均收益率 $ r_i $、交易费率 $ p_i $、风险损失率 $ q_i $;交易定额 $ u_i \((\) x_i \leq u_i $ 时,交易费按 $ u_i $ 计算)。
- 假设:
- 投资总额 $ M $ 足够大(简化为 $ M=1 $);
- 总体风险用“各资产中最大的风险 $ \max{q_i x_i} $”衡量;
- 资产相互独立;
- $ r_i, p_i, q_i $ 为定值等。
(二)多目标规划模型
目标:“净收益尽可能大”且“总体风险尽可能小”,约束:“投资总额守恒”。
-
目标函数:
\[\begin{cases} \max \ \sum_{i=0}^n (r_i - p_i) x_i \quad \text{(最大化净收益,$ s_0 $ 的 $ p_0=0 $)} \\ \min \ \max\{q_i x_i\} \quad \text{(最小化总体风险,$ s_0 $ 的 $ q_0=0 $)} \end{cases} \] -
约束条件:
\[\begin{cases} \sum_{i=0}^n (1 + p_i) x_i = M \quad \text{(投资总额守恒,含交易费)} \\ x_i \geq 0 \quad (i=0,1,\dots,n) \quad \text{(投资金额非负)} \end{cases} \]
(三)多目标转单目标的策略
模型一:固定风险水平,优化收益
给定风险界限 $ a $(使最大风险 $ \frac{q_i x_i}{M} \leq a $),转化为单目标最大化收益:
模型二:固定收益水平,极小化风险
给定收益下限 $ k $(使净收益 $ \sum_{i=0}^n (r_i - p_i) x_i \geq k $),转化为单目标最小化风险:
注:可通过引入辅助变量 $ t \geq q_i x_i $ 将 $ \min \max{q_i x_i} $ 转化为线性目标 $ \min t $。
模型三:加权综合(投资偏好系数)
对风险、收益分别赋予权重 $$ s $$($ 0 < s \leq 1 $,风险偏好)和 $ 1-s $(收益偏好),转化为单目标最小化加权和:
同样需引入辅助变量处理 $ \max{q_i x_i} $。
(四)模型一的 Matlab 求解示例
以 $$ n=4 \((4 种风险资产)、\) M=1 $ 为例,风险约束为 $ q_i x_i \leq a $$,目标最大化净收益。
模型转化(Matlab 标准型)
- 目标函数变为:$ \min - \sum_{i=0}^4 (r_i - p_i) x_i $
- 约束包括:
- 投资总额:$ x_0 + 1.01x_1 + 1.02x_2 + 1.045x_3 + 1.065x_4 = 1 $
- 风险约束:
$ 0.025x_1 \leq a \(, \) 0.015x_2 \leq a \(, \) 0.055x_3 \leq a \(, \) 0.026x_4 \leq a $ - 非负约束:$ x_i \geq 0 \ (i=0,1,\dots,4) $
Matlab 代码(循环搜索风险水平 $ a $)
clc, clear
a = 0;
hold on
while a < 0.05
c = [-0.05, -0.27, -0.19, -0.185, -0.185]; % 目标函数系数(最小化 → 最大化的相反数)
A = [zeros(4,1), diag([0.025, 0.015, 0.055, 0.026])]; % 不等式约束矩阵 A
b = a * ones(4,1); % 不等式约束右侧 b
Aeq = [1, 1.01, 1.02, 1.045, 1.065]; % 等式约束矩阵 Aeq
beq = 1; % 等式约束右侧 beq
LB = zeros(5,1); % 变量下界 lb
[x, Q] = linprog(c, A, b, Aeq, beq, LB); % 调用 linprog 求解
Q = -Q; % 转换为最大化的收益值
plot(a, Q, '*k'); % 绘制风险 a 与收益 Q 的关系
a = a + 0.001; % 步长迭代
end
xlabel('a'), ylabel('Q') % 坐标轴标签
三、课后作业
作业(1):生产计划优化问题
某厂生产三种产品Ⅰ、Ⅱ、Ⅲ,需经 A(设备 $ A_1, A_2 $)、B(设备 $ B_1, B_2, B_3 $)两道工序。加工规则:
- 产品Ⅰ:可在 A、B 的任意设备加工;
- 产品Ⅱ:A 的任意设备加工,B 仅能在 $ B_1 $ 加工;
- 产品Ⅲ:仅能在 $ A_2 \((A 工序)、\) B_2 $(B 工序)加工。
已知设备工时、原材料费、销售价、设备有效台时及满负荷费用如下表,求最优生产计划使利润最大。
设备 | 产品Ⅰ | 产品Ⅱ | 产品Ⅲ | 设备有效台时 | 满负荷设备费用(元) |
---|---|---|---|---|---|
$ A_1 $ | 5 | 10 | — | 6000 | 300 |
$ A_2 $ | 7 | 9 | 12 | 10000 | 321 |
$ B_1 $ | 6 | 8 | — | 4000 | 250 |
$ B_2 $ | 4 | — | 11 | 7000 | 783 |
$ B_3 $ | 7 | — | — | 4000 | 200 |
原料费(元/件) | 0.25 | 0.35 | 0.50 | — | — |
单价(元/件) | 1.25 | 2.00 | 2.80 | — | — |
提示:利润 = 销售收入 − 原料成本 − 设备使用成本(若设备满负荷才收费?需明确费用计算方式;通常假设费用按实际使用比例分摊或固定成本需建模为是否启用设备的 0-1 变量)。
作业(2):工人-工作指派问题
有 4 个工人,需分别完成 4 项工作,每人做各项工作的耗时如下表。求指派方案使总耗时最小。
工人\工作 | A | B | C | D |
---|---|---|---|---|
甲 | 15 | 18 | 21 | 24 |
乙 | 19 | 23 | 22 | 18 |
丙 | 26 | 17 | 16 | 19 |
丁 | 19 | 21 | 23 | 17 |
提示:可建立 0-1 规划模型,或用匈牙利算法求解。