本部分为应用运筹学基础笔记整理Part 1。由于有部分内容课上没来得及记下,用学长的博客补充了部分定理证明的内容。
latex被我修好了,可喜可贺。
参考博客
1. 优化问题的基本概念
基本模型
-
基本模型:变量,变量限制和一个需要优化的目标函数。
-
数学表示:min(max) f(x), s.t. x∈Ω. 这里 Ω 为变量限制(Feasible Set),通常是一些等式或不等式。
-
例子:LP,TSP
邻域、局部最优与全局最优
- 邻域(Neighborhood):给定一个优化问题 (Ω,f) ,邻域是 Ω 到其幂集 2Ω 的映射,即 N:Ω→2Ω 。
- TSP:对一个可行解,去掉两条不相邻的边,交叉相连,即可得到一个邻域解(2-change,N2)。
- MST:改变一条边。
- 对某一个邻域,如果其局部最优就是全局最优,我们称这个邻域是精确(exact)的。
- 对TSP,N2 不精确,Nn精确。
- 对MST,邻域精确。
凸集、凸函数与凸规划
- 凸组合:对于 x,y∈Rn,有 z=λx+(1−λ)y, 0<λ<1,则称 z 是 x,y 的一个凸组合。
- 凸集(Convex Set):如果对任意 x,y∈S,其凸组合都属于 S,则称 S 是一个凸集。
- 凸函数:对于定义在凸集 S 上的函数 f:S→R,如果对任意 x,y∈S,0<λ<1,有 f(λx+(1−λ)y)≤λf(x)+(1−λ)f(y),则 f 是凸函数。
- 若 f 是凸函数,则 −f 是凹函数(Concave)。
- 仿射函数既是凸函数也是凹函数。
- 凸规划:在凸集上求凸函数的最小值。
- 性质:凸规划的局部最优就是全局最优,其邻域是精确的。
- LP是特殊的凸规划。
2. 线性规划的基本原理
线性规划定义
线性规划问题有如下形式:maxz=cTxs.t.Ax=bx≥0
- 仿射函数既是凸函数也是凹函数,因此优化目标是max还是min差别不大。
- 对于 Ax≤b 的约束,可以添加松弛变量,让它变成等式。
极点与基可行解
-
极点:对于 γ∈S,γ 不能表示成 S 中任意两点的严格凸组合。
-
严格指 λ=0,λ=1。
-
极点是一个几何学的概念,LP问题的可行域实际上是很多超平面的交,组成一个超多面体,极点就是超多面体的顶点。
-
如果目标函数值是有限的,则LP问题的最优解一定能在极点处取得。
- 证明如下:假设存在一个非极点 x 是最优解,则可以找到 x1,x2∈S, 使得 x=λx1+(1−λ)x2。因为 z=cTx,所以 z=λcTx1+(1−λ)cTx2。又因为 x 是最优解,则 x1,x2 也一定是最优解,同理 x1,x2 这条直线上的所有点都能取到最优解,就能够把最优点一步一步约束到极点上。
-
基可行解:考虑 Ax=b,假定 r(A)=m 且行满秩(如果不满足行满秩,说明有约束条件冗余,可以去掉变成行满秩)。设 A 是一个 m∗n 的矩阵,我们可以从 A 中选出最多 m 列线性无关的列向量,其它列向量都和它们线性相关。把这 m 个列向量调整到前面去,把 A 分成两部分:A=[ABAN], AB 就是 m 个线性无关的列向量,并称 AB 是基矩阵。我们容易构造出 Ax=b 的一个解:x=[AB−1b0] 。称这种解为基可行解。显然,基可行解至多有 Cnm 种。
-
基本定理:**线性规划的基可行解是极点,反之亦然。**证明如下:
-
极点 → 基可行解,证明过程:
- 引理:如果存在 x 不是基可行解,设 x=(x1,x2,...xk,0,...0),即 x 有 k 个非零元素,则这些非零分量对应在 A 中的 k 列是线性相关的。
- 引理证明:如果 k>m,显然这 k 列线性相关;如果 k≤m 但这 k 列线性无关,再选几个线性无关的列,凑成 m 个,就可以把 x 扩充成基可行解。所以这 k 列线性相关。
- 反证法:假设 x 不是基可行解,则 x=(x1,x2,...xk,0,...0) 的非零分量在 A 中对应的 k 列向量(p1,...pk) 线性相关。则存在不全为0的 λ1,...λk,使得 λ1p1+...+λkpk=0。取 x′=x+ϵ(λ1,...λk,0,...0),x′′=x−ϵ(λ1,...λk,0,...0),可知 x 是 x′,x′′ 的中点,又有Ax′=Ax′′=Ax=b,所以 x′,x′′ 在该LP问题的可行域上,所以 x 不是极点。
- 基可行解 → 极点,证明过程:
- 反证法:假设 x 不是极点,则可行域内存在 x′=(x1′,...xn′),x′′=(x1′′,...xn′′) ,使得 x=λx′+(1−λ)x′′,0<λ<1,而且 x′=x′′,x′≥0 ,x′′≥0。设 x=(x1,x2,...xk,0,...0) ,容易知道 x′,x′′ 在 x 为0的分量上也为0。设 x 的非零分量在 A 中对应的 k 列向量为 (p1,...pk) ,则有 Σi=1kxi′pi=b,Σi=1kxi′′pi=b。所以Σi=1k(xi′−xi′′)pi=0。所以 (p1,...pk) 线性相关,x 不是基可行解。
- 基可行解和极点不一定一样多,两者可能不是一对一的关系。
-
**一定存在一个基可行解是最优解。**证明如下:
- 假设没有基可行解是最优解,设最优解为 x=(x1,x2,...xk,0,...0) 不是基可行解,由引理,x1 到 xk 对应的 A 中 k 列 (p1,...pk) 是线性相关的。那么有不全为 0 的 λ,使得 ∑i=1kλipi=0。
- 记辅助向量 v=(λ1,λ2,…,λk,0,…0)T,我们仍然构造 x′=x+ϵv 和 x′′=x−ϵv。显然有 x=2x′+x′′,由于 x 是最优解,当然 x′ 和 x′′ 也是最优解。如果存在 λi<0,那么我们取 ϵ=λi<0min−λixi,就能把 x′ 中 x1 到 xk 的某一个变成 0;如果不存在 λi<0,那么我们取 ϵ=minλixi,就能把 x′′ 中 x1 到 xk 的某一个变成 0。也就是说,非 0 元素少了一个。这样一直构造下去,我们就能不断减少非 0 元素,直到 x1 到 xk 在 A 中对应的 k 列线性无关,x 就变成了一个基可行解。而且在构造过程中,最优性没有改变,x 还是最优解。
- 所以综上所述,已知基可行解是有限多个,一定存在基可行解是最优解,我们可以通过找基可行解的方式求得LP问题的解。接下来介绍找基可行解的方法。
3. 线性规划的单纯形法
单纯形法
单纯形法的每一步都在引入一个非基变量取代某一基变量,找出目标函数值更优的另一基本可行解,这样一步一步调整到最优解。
给定一个例子:maxz=x1+2x2s.t.x1+x2≤3x2≤1x1,x2≥0,添加松弛变量化成标准形式:maxz=x1+2x2s.t.x1+x2+x3=3x2+x4=1x1,x2,x3,x4≥0
选取x3,x4为基变量,则可以构造初始基本可行解为 x=(0,0,3,1)T,此时 z=0。
将原问题化成典则形式,即用非基变量表示基变量与目标函数:x3x4z=3−x1−x2=1−x2=x1+2x2
此时在目标函数中,x1和 x2 的系数称为检验数。x2的检验数更大,我们增大x2,增大到1时x4变成0, x4 出基,x2 成为基变量。此时 x=(0,1,2,0)T,z=2,典则形式为:x2x3z=1−x4=2−x1+x4=2+x1−2x4
从检验数可以看出,接下来只能增大 x1。x1 增大到2时,x3 变成0,出基。此时 x=(2,1,0,0)T,z=4,典则形式为:x1x2z=2−x3+x4=1−x4=4−x3−x4 。这时目标函数中所有的检验数都小于0,因为 x1,x2,x3,x4≥0,无法继续优化,我们就得到了该LP问题的最优解。
归纳起来,单纯形法的基本步骤如下:
- 把线性规划问题的约束方程组表达成典则形式,找出基本可行解作为初始基可行解。
- 若基本可行解不存在,即约束条件有矛盾,则问题无解。
- 若基本可行解存在,从初始基可行解作为起点,根据最优性条件和可行性条件,引入非基变量取代某一基变量,找出目标函数值更优的另一基本可行解。
- 按步骤3进行迭代,直到对应检验数满足最优性条件(这时目标函数值不能再改善),即得到问题的最优解。
- 若迭代过程中发现问题的目标函数值无限,则终止迭代。
单纯形表
设A=[ABAN], x=[xBTxNT]T。
则有 ABxB+ANxN=bz=cBTxB+cNTxN 。移项转化为典则形式,xBz=AB−1b−AB−1ANxN=cBTAB−1b+(cNT−cBTAB−1AN)xN。
可以看出,cNT−cBTAB−1AN 是检验数。如果检验数都小于等于0,x 就成为最优解。如果存在检验数大于0且在矩阵中对应的系数都小于等于0(该分量可以取到无限大),就没有有限最优解了。
单纯形表的原理如下:
初始表:xBcBTABcNTAN0b
对于第二行,利用行变换将 AB 变为 I,相当于左乘 AB−1:xBcBTIcNTAB−1AN0AB−1b
再把第二行乘上 cBT,用第一行相减,得到 xB0IcNT−cBTAB−1ANAB−1AN−cBTAB−1bAB−1b
这个线性变换的过程就是化成典则形式的过程,第一行第三列就是检验数,第一行第四列就是 −z,而基变量和非基变量之间的系数也可以通过第二行的第三、四两列求出。表格每这样计算一次,就是单纯形法里的一次迭代。
简单的说,对于取 max 的情况,我们首先选择检验数大于0且绝对值最大的 xj 分量入基;之后在aij 大于0的基变量中选择 bi/aij 最小的分量 xi 出基。之所以选择最小的分量,是因为它对应的基变量会最先变成0(约束最紧)。通过线性变换,入基变量对应行的系数调整为1,其他基变量行和目标函数行(检验数)调整为0,完成一次迭代。所有的检验数都小于等于0时,得到最优解。
就前面介绍单纯形法的例子 maxz=x1+2x2s.t.x1+x2+x3=3x2+x4=1x1,x2,x3,x4≥0来说,单纯形表的过程如下:
- 选取基变量为 x3,x4,有初始单纯形表:x3x4110211010001031
- 最大的正检验数对应 x2,x2 入基;$ 3/1 > 1/1,x_4$ 出基。线性变换得到 x3x2110001010−2−11−221
- 最大的正检验数对应 x1, x1 入基;只剩 x3 可以出基。线性变换得到 x1x2010001−110−1−11−421
- 所有的检验数都小于等于0,得到最优 z=4,x=(2,1,0,0)T。
单纯形表的过程实际上是在选取不同的非基变量组合表达目标函数,每变换一次都是重新转换一次典则形式。当检验数都小于0时,结果没办法再改善,目标函数就取得了最大值。
初始解的选取:两阶段法
在上面的例子中,我们要解决的是约束为 Ax≤b 的问题,此时通过添加松弛变量变成等号之后,取初始可行解为 x=0,松弛变量对应取 b 即可。
但如果我们要解决的问题形如 maxz=cTxs.t.Ax=bx≥0,即约束为 Ax=b。同样加入 x,变成 Ax+x=b,x,x≥0。再取 x=0,x=b,显然它是一个初始可行解。但因为 x 是我们添加的变量,我们要求它能够全部出基(取0),才与原问题等价。解决办法如下:
- 考虑一个新的线性规划:minΣi=1mxis.t.Ax+x=bx,x≥0,对这个问题来说, x=0,x=b 显然是一个初始可行解。如果优化目标的最优解不是0,那么原问题中的 x 不能全部出基,原问题无可行解;否则我们就得到了原问题的初始可行解,也就能够以此为起点求原问题的最优解。
所以线性规划的可行解和最优解求解难度相同。
4. 线性规划对偶理论
引入对偶问题
最小上界角度
- 考虑LP问题 maxz=4x1+x2+3x3s.t.x1+4x2≤13x1−x2+x3≤3x1,x2,x3≥0。显然,每个可行解都能给出最优目标函数值的一个下界。比如带入 x=(1,0,0)T 得到 z∗=4,带入 (0,0,3)T 则得到 z∗=9,所以最优目标一定大于等于 9。所以我们考虑一个问题:怎么判断一个可行解是不是最优解?如果能得到一个上界,我的可行解恰好等于或非常接近这个上界,我们就可以判断这个可行解是不是最优的,或者与最优解有多接近。因此,我们希望能够找到一个最小的上界。
- 对于本问题来说,显然,第二行乘以3加上第一行,可以得到一个很简单的上界:10x1+x2+3x3≤10,所以10是一个上界。
- 我们希望取得一个最小的上界,可以这么考虑:首先,假设第一行系数是 y1,第二行 y2,为了让结果是上界,我们有 y1+3y2≥4,4y1−y2≥1,y2≥3。又要使得结果最小,所以取 min y1+3y2。系数只能是大于等于0的(否则不等号都变了),所以 y1,y2≥0。至此,我们得到了一个新的问题:minz=y1+3y2s.t.y1+3y2≥44y1−y2≥1y2≥3y1,y2≥0。我们称这个问题是原LP问题的对偶问题。
材料定价角度
- 考虑LP问题 maxz=4x1+3x2s.t.2x1+3x2≤245x1+2x2≤26x1,x2≥0。我们可以理解为单件产品1的利润为 4 ,生产时需要2件材料A,5件材料B;单件产品2的利润为 3 ,生产时需要3件材料A,2件材料B;同时,我们一共有24个材料A,26个材料B,思考分别生产多少件产品1、产品2能使得利润最大化。
- 此时有一名客户,不需要我们的产品,只买我们的原材料。那么材料A、B怎么定价?设分别定价为 y1,y2。首先要保证我们的利润不会减少,即原本那么多材料要卖出更高的价格,有 2y1+5y2≥4,3y1+2y2≥3。在此基础上也不能漫天要价,所以考虑总价最小 min 24y1+26y2。综上所述得到问题 minz=24y1+26y2s.t.2y1+5y2≥43y1+2y2≥3y1,y2≥0。这是第二种得到对偶问题的角度。
对偶问题
综上所述,一般情况下,一个LP问题(P)和其对偶问题(Q)有如下对应形式:
(P) maxcTxs.t.Ax≤bx≥0 (Q)minbTys.t.ATy≥cy≥0
所以原问题有几个变量,对偶问题就有几个约束;同理原问题有几个约束,对偶问题就有几个变量。
约束的不等号和对偶问题的 ≥0要求是一一对应的。如果原问题是一个最大化问题,我们有以下结论:
- 原问题 aiTx≤bi,对偶问题 yi≥0
- 原问题 aiTx≥bi,对偶问题 yi≤0
- 原问题转换为 −aiTx≤−bi,对应一个 yi≥0,由对偶问题定义得原问题的 yi=−yi≥0。
- 原问题 aiTx=bi,对偶问题 yi 无限制
- 等号不会存在变号的情况,所以 yi 无限制。
- 原问题 xj≥0,对偶问题 AjTy≥cj
- 原问题 xj≤0,对偶问题 AjTy≤cj
- 原问题 xj 无限制,对偶问题 AjTy=cj
D是P的对偶问题,则P也是D的对偶。
弱对偶,强队偶和互补松弛
考虑 (P) maxcTxs.t.Ax≤bx≥0 (Q)minyTbs.t.yTA≥cTy≥0
弱对偶定理
设 x 和 y 分别是P和D的可行解,有 cTx≤yTb。
证明:因为 Ax≤b,所以 yTAx≤yTb,所以 cTx≤yTAx≤yTb.
我们有如下结论:
- 若P和D都有有限可行解,P问题的任一可行解目标函数值都小于等于D问题任一可行解的目标函数值。
- 设x和y分别是P和D问题的可行解,若两者目标函数值相等,则它们分别是各自问题的最优解。
- 若P有无限最优解,则D不可行;若D有无限最优解,则P不可行。
注意也有可能两个问题都不可行。
强对偶定理
**若P(D)有有限最优解,则D(P)也有有限最优解,且目标函数值相等。**证明如下:
-
给P引入松弛变量有:maxcTxs.t.Ax+Ix=bx,x≥0 不妨设 A=(A,I),设P有有限最优解: x∗=(xBT,xNT)T,在 A 中对应列 (AB,AN).
如果我们能找到对应D的优先最优解,则定理得证。
-
考虑初始单纯形表:xB∗cTA0I0b;则最后的单纯形表为:xB∗cT−cBTAB−1AAB−1A−cBTAB−1AB−1−cBTAB−1bAB−1b。
-
因为 x∗ 是最优解,所以检验数小于等于0。所以 cT−cBTAB−1A≤0−cBTAB−1≤0cBTAB−1b=cTx∗。所以 cBTAB−1A≥cTcBTAB−1≥0cBTAB−1b=cTx∗.
-
令 y∗T=cBTAB−1,易知 y∗ 就是原问题对偶问题的最优解,并且 y∗Tb=cTx∗。
互补松弛定理
若 x∗,y∗ 分别是P、D的可行解,则:x∗,y∗ 最优 ⇔ (y∗TA−cT)x∗=0y∗T(Ax∗−b)=0 。证明如下:
在前面的弱对偶定理部分我们有:cTx≤yTAx≤yTb 。因为对最优解有 y∗Tb=cTx∗ ,所以 cTx∗=y∗TAx∗=y∗Tb 。得证。
可以看出,如果某个约束没有满足,对偶问题的对应分量只能为0。
对偶单纯形法
最优解有两个条件:首先最优解是可行解;其次,检验数 ≤0 保证它是最优解。为讨论方便,我们接下来的引入部分都是考虑最大化问题,最小化问题反号即可。
我们原先用单纯形表 xB0IcNT−cBTAB−1ANAB−1AN−cBTAB−1bAB−1b ,实际上是在保证可行(AB−1b≥0)的基础上做Local Search(更换一个基变量),使得检验数 $ \le 0$ 逐步被满足。当检验数 ≤0时,对偶问题可行,所以原来的单纯形法是在保证原问题可行的基础上,找对偶问题的可行解,如果构造成功,那么两个都是最优解。
那么相应的,我们可以想象对偶单纯形法:在保证对偶问题可行(检验数 ≤0)的基础上,逐步迭代找原问题的可行解(AB−1b≥0),使得目标函数值相同。如果构造成功,那么两个都是最优解。
例如,对于如下LP问题P,有对偶问题D:
(P) max−5x1−5x2+9x3s.t.−x1−2x2+4x3≤1−x1−x2+6x3≤2x≥0 (D)miny1+2y2s.t.−y1−y2≥−5−2y1−y2≥−54y1+6y2≥9y≥0
把问题D转化为最大化形式,并加入松弛变量,转化为:max−y1−2y2s.t.y1+y2+y3≤52y1+y2+y4≤5−4y1−6y2+y5≤−9y≥0
选取基变量为 y3,y4,y5,有初始单纯形表:y3y4y5−112−4−211−6010000100001055−9。
只有 −9<0,所以 y5 出基。考虑让 y1 还是 y2 入基:如果让 y2 入基,y1 的检验数就会大于0,所以应该让 y1 入基(判断方法:−4−1<−6−2,选前者)。得到:y3y4y10001−1/2−1/2−23/201000010−1/41/41/2−1/49/411/41/29/4。
因为所有的AB−1b≥0,此时已经得到目标函数最优值 −9/4,y=(9/4,0,11/4,1/2,0)T。所以最小化时最优值为 9/4,也就是原问题的最优值。
综上所述,对偶单纯形法的步骤总结如下:
- 首先通过变换,得到初始对偶单纯形表,保证对偶可行(检验数 σ≤0);
- 检查可行性AB−1b≥0。如果全部符合,已经得到最优解;否则在AB−1b<0中找到AB−1b绝对值最大一行的对应分量,出基;之后在aij 小于0的变量中选择 σj/aij 最小的分量 xi 入基。通过线性变换,入基变量对应行的系数调整为1,其他基变量行和目标函数行(检验数)调整为0,完成一次迭代。
- 重复第二步。