1. 情景代入
大学毕业后,你继承了家里的工厂,成为了一名厂长。你的工厂可以生产A、B、C三种产品,生产三种产品会用到a、b、c三种原材料。你的工厂通过长期生产已经摸索出生产每种产品所消耗的原料和单位产品的利润;你通过调取仓库库存,了解了可利用的各种原料的库存(如下表)。现在你需要制定一个生产计划,使你的工厂的总利润最大。
| 原料 \ 产品 | A | B | C | 库存 | 
|---|---|---|---|---|
| a | 3 | 4 | 2 | 60 | 
| b | 2 | 1 | 2 | 40 | 
| c | 1 | 3 | 2 | 80 | 
| 单位产品利润 | 2 | 4 | 3 | 
2. 模型介绍
【定义】线性规划模型是在一系列等式或不等式约束条件下,是某个或多个目标函数达到最值的数学模型。
别怕,我也看不懂 ^o^,但我们可以大概分析一下:像每种原料的库存,就应该是属于一种约束条件,因为当你的工厂用完了某种原材料,那么它将不能再生产任何需要该原材料的产品,即使其他原材料还有剩余,此时你的工厂的生产就受到了约束;其次我们制定生产计划的目标是要获得最大的利润,所以利润就应当属于目标函数,因为我们在这个过程中是想获得利润函数的极大值。最后我们的生产计划就是要确定生产多少产品A、多少产品B、多少产品C以获得最大利润,像这样的一系列生产数量,称为你对这个问题的决策。
3. 模型的一般形式
- 决策变量:通常是所研究的问题要求解的未知量。在你的工厂中,它表示了工厂将生产多少产品A、多少产品B、多少产品C。
- 目标函数:通常是所研究的问题要求达到最大(最小)的那个指标的数学表达式,它是决策变量的函数, 记为 - 。在你的工厂中,它就是你的利润函数。 
- 约束条件:通常是所研究问题的决策向量 - 的限制条件, - 允许取值的范围记为 - ,称为可行域,有 - 。 - 通常由一组关于决策变量 - 的等式 - ,和不等式 - 或 - 来界定。其中 - 称为等式约束, - 称为不等式约束。 
线性规划模型主要就包括以上3个部分,其一般形式可以表示为:
其中表示对目标函数求最大值或最小值,
表示受约束于
。由数学规划模型的一般形式,可行域可表达为:
满足约束条件的解,即可行域中的点称为可行解;使目标函数
达到最值的可行解,即可行域
中使得目标函数
取得极值的点称为最优解。
4.模型的建立
我们现在可以尝试解决在你的工厂中的生产计划的问题了,因为我们现在并不能直接确定每种产品的产量,不妨设来分别表示A、B、C三种产品的产量,此时的三个变量称之为决策变量。(贴心的再把表格贴一遍)
| 原料 \ 产品 | A | B | C | 库存 | 
|---|---|---|---|---|
| a | 3 | 4 | 2 | 60 | 
| b | 2 | 1 | 2 | 40 | 
| c | 1 | 3 | 2 | 80 | 
| 单位产品利润 | 2 | 4 | 3 | 
因为仓库里每种原材料的库存是有限的,所以(1)我们所生产的三种产品所消耗的某种原材料总计不能超过仓库的库存;(2)其次三种产品的产量均不应小于零。以上都是我们的约束条件,(3)在满足以上约束条件的同时,如果有一种生产计划可以使得你的工厂生产的3种产品所获得的利润和最大,你就找到了工厂生产的最优解。由此我们可以构建出以下模型:
求解出满足所有限制条件的我们就得到了可行解,若在可行解中可以找到一组解使得你的工厂获利最大,我们就找到了最优解。
5. 模型的抽象
我们刚才建立的模型,只解决了你的工厂里的生产计划问题,如果我们要继续解决机床刀头磨损更换的问题,又或者要解决深海石油平台开采石油的问题,我们就需要一个更具有一般性的模型。所以接下来我们要对我们的工厂模型进行抽象。
- 
目标函数:首先,对于每个线性规划模型,模型的目的都是要求解目标函数的最值,比如利润最大化,成本最小化。而且每个目标函数都是以决策变量为自变量。
 
- 
约束条件:其次,模型中的每个决策变量均有一定的约束,如资源、工期、时间等,其具体表现为决策变量的一些等式和不等式。
 
 确定了目标函数和约束条件,线性模型的建模部分就完成了。
6. 模型的求解
求解线性规划模型有三种方法:单纯形法、图解法和软件求解法。
- 单纯形法:方法偏向于纯数学,一般不会涉及。 
- 图解法:通过在坐标系中做出约束条件来确定可行域的方法,因为超过三维的图形没法做出,所以该方法只能求解决策变量不大于三个的问题,一般不在建模中使用。 
 例如求解以下模型:
 
 首先在坐标系中画出约束条件,确定可行域:

将目标函数当作直线的截距,平移到可行域的边缘拐点得到最优解:

- MATLAB求解:MATLAB适用于所有线性规划模型,在建模中可以直接使用。在MATLAB中使用函数求解。MATLAB中规定线性规划的标准形式为: 
其中为不等式约束,对应数学模型中的
;
 为等式约束,对应数学模型中的
,
为
的上下界,表示决策向量
的可行区间。
、
均为矩阵,
、
、
、
、
均为列向量,在叉乘之后可以表示多组约束条件。最后,Matlab默认求解目标函数的最小值,所以可以将目标函数整体取负(即令
)来求的目标函数的最大值。
函数中一共包括上述所有7个参数:
函数的返回值包括一个最优解,在
处的目标函数值
:
使用以上方法,我们尝试解决如下问题:
代码如下:
c=[-0.4 -0.28 -0.32 -0.72 -0.64 -0.6];
A=[0.01 0.01 0.01 0.03 0.03 0.03;
   0.02 0 0 0.05 0 0;
   0 0.02 0 0 0.05 0;
   0 0 0.03 0 0 0.08];
b=[850;700;100;900];
Aeq=[];
beq=[];
lb=[0;0;0;0;0;0];
ub=[];
[x,fval]=linprog(c,A,b,Aeq,beq,lb,ub)
其中,,
为
的求和的最小值,
为各项
的系数;
,
、
、
均为数组,这是不等式约束条件,若没有不等式存在,则令
;
,
、
均为数组,为等式约束条件,
为各项
的系数,若没有等式约束则令
;
,是对变量
的约束;
为返回最优解;
为
处目标函数值。
输入Matlab得到结果:


2022/7/28
JavaArtist