鸣谢:
1. 细语呢喃
2. 算法导论
什么是线性规划?
只要上过高中的人都知道:定区间,画直线,求最值?
今天我们说的线性规划,可以说是高中课本中内容的升华↓
定义
在给定有限的资源和竞争约束情况下,很多问题都可以表述成最大化或最小化某个目标
如果可以把目标指定为某些变量的线性函数,而且如果可以将资源约束指定为这些变量的等式或不等式,则得到了一个线性规划问题
很学术是吧,不喜欢这种表达方式?
那么我们就直观一点 — —
简单的引入
假设食物的各种营养成分,价格如下表:
Food | Energy(能量) | Protein(蛋白质) | Calcium(钙) | Price |
---|---|---|---|---|
Oatmeal(燕麦) | 110 | 4 | 2 | 3 |
Whole milk(全奶) | 160 | 8 | 285 | 9 |
Cherry pie(草莓派) | 420 | 4 | 22 | 20 |
Pork with beans(猪肉) | 260 | 14 | 80 | 19 |
要求我们买的食物中,至少要有2000的能量,55的蛋白质,800的钙,怎样买最省钱?
设买燕麦、全奶、草莓派、猪肉为
x1,x2,x3,x4
于是我们可以写出如下的不等式组:
3x1+9x2+20x3+19x4 (money)
110x1+160x2+420x3+260x4>=2000 (energy)
4x1+8x2+4x3+14x4>=55 (protein)
2x1+285x2+22x3+80x4>=800 (calcium)
x1,x2,x3,x4>=0
其实这些不等式组就是线性规划方程(Linear programming formulation)
简单的说,线性规划就是在给定限制的情况下,求解目标
可行域
考虑把一些的线性规划:求
max(x1+x2)
4x1−x1<=8
2x1+x2<=10
5x1−2x2>=−2
x1,x2>=0
我们可以画出下面的图:
看图(a),灰色的区域就是这几个约束条件要求x1,x2所在的区域,而我们最后的解x1,x2也要在这里面。我们把这个区域称为可行域(feasible region)
图(b)可以直观的看出,最优解为8, 而 x1=2,x2=6
线性规划的最优解出现在可行域的顶点上并不是巧合
实际上,我们可以简单地认为:
目标函数代表一条直线,当取得最优解时,这条直线与可行域的交集就是原问题的解
如果解集是一个点,那么只有一个最优解
如果解集是一条线段,那么有无数最优解(在此线段上)
上面给出了两个变量时,我们直观求解线性规划的一般方式
如果变量的数量增加,我们的直觉告诉我们,可行域应该也是一个存在于某个维度中一个“凸多面体”,
而最优解应该也是取在某个顶点上
总结一下:
如果有n个变量,每个约束条件定义了n维空间中的一个半平面,
我们称这些半平面的交形成的可行域为单纯形
目标函数现在是一个超平面,并且因为ta的凸性,一个最优解仍在单纯形的一个顶点上取得
单纯形算法
以一个线性规划作为输入,输出一个最优解
从单纯形的一个顶点开始,执行顺序迭代
在每次迭代中,ta沿着单纯形的一条边从当前结点移动到一个目标值不小于当前顶点的相邻顶点
当达到一个局部最大值,即存在一个顶点,所有的相邻结点的目标值都小于该结点的目标值,算法结束
因为可行域是凸的,且目标函数是线性的,所以局部最优解就是全局最优解
以上我们用几何的角度给出了该算法的定义
之后我们会从其他角度讨论该方法
应用
线性规划有着大量的应用
从成山的数学练习题中就可见一斑
下面就给出两个经典的线性规划实例:
- 一家航空公司希望调度ta的飞机机组人员,但是航空委员会给出了一些限制:例如每个机组人员可以连续工作的小时数,以及要求一个特定机组在每个月内只能在一种机型上工作
公司希望尽可能少的机组人员 - 一家石油公司想要确定在何处开采石油
在一个特定位置钻井有一定的费用,且能过开采的石油桶数是不一样的
这家公司用来布置新油井的预算有限,希望在预算内使得回报的石油量最大
线性规划中,有一类很特殊的问题:差分约束
具体内容在图论讲解中已有涉及
另外,线性规划和网络流等算法也是有干系的(之后会详细讲到)
常用形式
线性规划有两种常见的形式:标准型和松弛型
在标准型中,所有的约束条件都是不等式
在松弛型中,所有的约束条件都是等式
标准型
已知
n
个实数
我们希望找到
n
个实数
最大化:
Σcjxj
满足约束条件:
Σa(ij)xj<=bi,i=1,2,...,m
xj>=0,j=1,2,...,n
即
满足条件:
- 目标函数最小化
- 所有约束条件都是非负约束(<=)
- 所有的变量都具有非负性(>=0)
所时候我们遇到的线性规划并不满足上面三个条件
然而我们可以ta们转化成标准型:
- 原来是 max , ∗−1 转化为 min
- 若原来约束为
=
,转为
>= 和 <= <script type="math/tex" id="MathJax-Element-5334"><=</script> - 约束原来为 >= ,同样的 ∗−1 ,就改为了 <= <script type="math/tex" id="MathJax-Element-5337"><=</script>
- 若有变量 xi<0 ,那么用 x′–x′′ 来替代,其中 x′>=0,x′′>=0
∞ 例一
最大化:
−2x1+3x2
满足约束条件:
x1+x2=7
x1−2x2<=4
x1>=0
我们将目标函数系数取负得到:
最小化:
2x1−3x2
满足约束条件:
x1+x2=7
x1−2x2<=4
x1>=0
若有变量 xi 不具有非负条件,用 x′i−x′′i 代替 xi ,得:
最小化:
2x1−3x′2+3x′′2
满足约束条件:
x1+x′2−x′′2=7
x1−2x′2+2x′′2<=4
x1,x′2,x′′2>=0
改变约束 = :
最小化:
满足约束条件:
x1+x′2−x′′2<=7
x1+x′2−x′′2>=7
x1−2x′2+2x′′2<=4
x1,x′2,x′′2>=0
改变约束 >= :
最小化:
2x1−3x′2+3x′′2
满足约束条件:
x1+x′2−x′′2<=7
−x1−x′2+x′′2<=−7
x1−2x′2+2x′′2<=4
x1,x′2,x′′2>=0
松弛型
标准形式:
满足条件:
- 目标函数最小化
- 所有约束条件都是等式(=)
- 所有的变量都具有非负性(>=0)
可以看到,约束条件都是等号,那么我们就面临把一般的线性规划转化为松弛型的问题
∞ 例二
最大化:
−2x1+3x2
满足约束条件:
x1+x2=7
x1−2x2<=4
x1>=0
我们将目标函数系数取负得到:
最小化:
2x1−3x2
满足约束条件:
x1+x2=7
x1−2x2<=4
x1>=0
变形:
最小化:
2x1−3x2
满足约束条件:
x1+x2<=7
−x1−x2<=−7
x1−2x2<=4
x1>=0
引入变量之一:
最小化:
2x1−3x2+3x3
满足约束条件:
x1+x2−x3<=7
−x1−x2+x3<=−7
x1−2x2+2x3<=4
x1,x2,x3>=0
引入变量之二:
最小化:
2x1−3x2+3x3
满足约束条件:
x1+x2−x3+x4=7
−x1−x2+x3+x5=−7
x1−2x2+2x3+x6=4
x1,x2,x3,x4,x5,x6>=0
移项:
最小化:
z=2x1−3x2+3x3
满足约束条件:
x4=7−x1−x2+x3
x5=−7+x1+x2−x3
x6=4−x1+2x2−2x3
x1,x2,x3,x4,x5,x6>=0