线性规划在数学建模中的应用
线性规划在数学建模中的应用
1. 基本思想
- 线性规划(Linear Programming, LP) 是数学规划的一种,用于在 约束条件 下,寻找 线性目标函数 的最优解。
- 数学建模中常用于 资源优化配置、产量安排、运输调度、投资组合 等问题。
2. 一般模型形式
一个典型的线性规划模型可以表示为:
目标函数:
min Z=c1x1+c2x2+⋯+cnxn\min \; Z = c_1x_1 + c_2x_2 + \cdots + c_nx_nminZ=c1x1+c2x2+⋯+cnxn
或
max Z=c1x1+c2x2+⋯+cnxn\max \; Z = c_1x_1 + c_2x_2 + \cdots + c_nx_nmaxZ=c1x1+c2x2+⋯+cnxn
约束条件:
{a11x1+a12x2+⋯+a1nxn (≤,=,≥) b1a21x1+a22x2+⋯+a2nxn (≤,=,≥) b2⋮am1x1+am2x2+⋯+amnxn (≤,=,≥) bm\begin{cases} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n \; (\leq,=,\geq) \; b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n \; (\leq,=,\geq) \; b_2 \\ \vdots \\ a_{m1}x_1 + a_{m2}x_2 + \cdots + a_{mn}x_n \; (\leq,=,\geq) \; b_m \end{cases}⎩⎨⎧a11x1+a12x2+⋯+a1nxn(≤,=,≥)b1a21x1+a22x2+⋯+a2nxn(≤,=,≥)b2⋮am1x1+am2x2+⋯+amnxn(≤,=,≥)bm
非负约束:
xj≥0,j=1,2,…,nx_j \geq 0, \quad j=1,2,\ldots,nxj≥0,j=1,2,…,n
3. 应用场景
(1) 资源分配问题
- 问题背景:有限的资源如何分配到多个项目,使收益最大或成本最小。
- 建模思路:
- 决策变量:各项目的资源分配量 xix_ixi
- 目标函数:最大化收益 maxZ=∑pixi\max Z = \sum p_i x_imaxZ=∑pixi
- 约束条件:资源不超过总量 ∑aixi≤R\sum a_i x_i \leq R∑aixi≤R
(2) 生产计划问题
- 问题背景:工厂有多种产品,每种产品消耗不同的资源,如何安排产量使利润最大化。
- 建模思路:
- 决策变量:每种产品的产量 xix_ixi
- 目标函数:最大化利润 maxZ=∑cixi\max Z = \sum c_i x_imaxZ=∑cixi
- 约束条件:原料、劳动力、机器时间等限制
(3) 运输问题
- 问题背景:多个供货地向多个需求地运输货物,如何确定运输量以最小化运输成本。
- 建模思路:
- 决策变量:从供给地 iii 运到需求地 jjj 的数量 xijx_{ij}xij
- 目标函数:minZ=∑i=1m∑j=1ncijxij\min Z = \sum_{i=1}^m \sum_{j=1}^n c_{ij}x_{ij}minZ=∑i=1m∑j=1ncijxij
- 约束条件:供给约束 ∑jxij≤Si\sum_j x_{ij} \leq S_i∑jxij≤Si,需求约束 ∑ixij≥Dj\sum_i x_{ij} \geq D_j∑ixij≥Dj
(4) 投资组合问题
- 问题背景:资金分配到不同的投资项目中,如何在风险约束下获得最大收益。
- 建模思路:
- 决策变量:投资于项目 iii 的金额 xix_ixi
- 目标函数:maxZ=∑rixi\max Z = \sum r_i x_imaxZ=∑rixi
- 约束条件:资金总额、风险控制、投资比例限制等
4. 解法工具
- 单纯形法(Simplex Method)
- 对偶理论(Duality)
- 灵敏度分析(Sensitivity Analysis)
- 软件工具:MATLAB(linprog)、Lingo、Excel Solver、Python(PuLP、scipy.optimize)
5. MATLAB 示例:生产计划问题
问题背景
某工厂生产两种产品 A 和 B:
- 每件产品 A 的利润为 40 元,每件产品 B 的利润为 30 元。
- 产品 A 每件需要 2 小时人工和 1 单位原料。
- 产品 B 每件需要 1 小时人工和 1 单位原料。
- 工厂一周可提供的人工时间为 100 小时,原料为 80 单位。
问题: 如何安排生产计划,使工厂的利润最大?
数学模型
-
决策变量:
x1x_1x1 = 产品 A 的产量
x2x_2x2 = 产品 B 的产量 -
目标函数:
maxZ=40x1+30x2\max Z = 40x_1 + 30x_2maxZ=40x1+30x2 -
约束条件:
2x1+x2≤1002x_1 + x_2 \leq 100 \quad2x1+x2≤100 (人工限制)
x1+x2≤80x_1 + x_2 \leq 80 \quadx1+x2≤80 (原料限制)
x1,x2≥0x_1, x_2 \geq 0x1,x2≥0 (非负约束)
MATLAB 代码
%% MATLAB 线性规划标准型要求
% linprog 的标准形式:
% min f^T * x
% 如果是最大化问题 max c^T * x,
% 则需要转换为最小化:min (-c)^T * x
% ------------------------------------------------------------------
% 约束条件要求:
% A * x <= b
% Aeq * x = beq
% lb <= x <= ub
% ------------------------------------------------------------------
% MATLAB 调用格式:
% [x, fval] = linprog(f, A, b, Aeq, beq, lb, ub, options)
% 输入参数:
% f : 列向量,目标函数系数
% A, b : 不等式约束 A*x <= b
% Aeq, beq : 等式约束 Aeq*x = beq
% lb, ub : 变量下界和上界
% options : 优化选项(可选,optimoptions)
% ------------------------------------------------------------------
% 示例问题:
% max Z = 3*x1 + 2*x2
% s.t.
% 2*x1 + x2 <= 100
% x1 + x2 <= 80
% x1, x2 >= 0
% 转换为标准型:
% f = [-3; -2]; % 取负号实现最大化
% A = [2 1; 1 1];
% b = [100; 80];
% lb = [0; 0];
% ------------------------------------------------------------------
% 代码实现:
f = [-3; -2]; % 目标函数(最大化取负)
A = [2 1; % 不等式约束矩阵1 1];
b = [100;80];
lb = [0; 0]; % 下界,非负约束% 调用 linprog 求解
[x, fval] = linprog(f, A, b, [], [], lb, []);
% 输出结果
disp('最优解:');
disp(x);
disp('最大目标值:');
disp(-fval); % 注意取负号