原始对偶方法、整数规划
原始对偶方法
原始对偶方法的基本思路是利用前面讲过的互补松弛定理。
互补松弛定理:若 x∗,y∗分别是P、D的可行解,则:x∗,y∗最优 ⇔(y∗TA−cT)x∗=0y∗T(Ax∗−b)=0。
所以,我们从D的一个可行解 y出发,尝试寻找P的可行解 x,使得 x、y能够满足互补松弛条件。如果能够找到这样的 x,则 x、y就分别是P、D的最优解;如果找不到这样的 x,说明 y还不是最优解,我们需要调整使之成为最优解。这个思路就是原始对偶方法。
判断最优解
考虑 (P) mins.t.cTxAx=bx≥0 (D)maxs.t.yTbyTA≤cT
引入一个允许指标集 J={ j ∣ yTAj=cj },由互补松弛条件可以看出,对于 j∈/J,xj=0。
设 y是D的一个可行解,则我们需要设法找到一个满足互补松弛条件的 x,也就是满足 ⎩⎨⎧Ax=b(ATy−c)Tx=0x≥0。如果能找到这样的 x,我们就找到了P和D的解。
为了找到这个 x,我们E利用类似于两阶段法的思想:构造一个限制优化问题(RP):mins.t. i=1∑mxˉij∈J∑aijxj+xˉi=bixj≥0, j∈Jxˉi≥0, i=1,…,m。如果RP的目标函数值可以取0,那么我们就找到了满足互补松弛条件的 x。
考虑原问题和其对偶问题取最优解时,目标函数值相同,我们写出RP的对偶问题(DRP):maxs.t.y~Tby~TAj≤0, j∈Jy~i≤1, i=1,…,m。设 y~是其最优解。
若此时 y~Tb=0,则 y就是D的最优解。否则,y~Tb>0,y还不是D的最优解,我们需要改进 y。
改进解
我们取 y^=y+θy~。其中 θ是改进的步长, θ>0。y~是改进的方向。
首先考虑为什么这样结果是更好的:y^Tb=yTb+θy~Tb。
- 因为 θ>0,y~Tb>0,所以 y^Tb>yTb,D的目标函数值的确得到了改进。
然后考虑改进后能否满足D的条件:y^TAj=yTAj+θy~TAj。
-
对于 j∈J,有 yTAj=cj,又有 y~TAj≤0,所以满足 y^TAj≤cj。
-
对于 j∈/J,有 yTAj<cj,因为此时是严格小于的关系,所以我们可以取到合适的 θ,使得 $\hat{y}^TA_j $仍然满足 ≤cj的条件。
为了取到合适的 θ,需要考虑 θ的取值范围。由上面关于满足D条件的讨论,容易想到取 θ=min {y~TAjcj−yTAj}>0,其中,需要满足 j∈J, y~TAj>0。这样就会让 j∈J中的一些限制变紧,其它限制则不会超过,仍然保证D可行。注意如果 θ可以无限增大,说明对偶问题没有有限最优解,那么原问题无可行解。
由此我们将 y调整为 y^,得到新的允许指标集 J和 DRP,进入下一轮迭代调整,直到DRP的目标函数值取到0,此时 y就是D的最优解。
在最短路问题的应用
考虑有向图:
,s 为起点,t 为终点,求 s 到 t 的最短路径。
得到点边关联矩阵A= stuve110−10e2100−1e3001−1e40−110e50−101。我们可以利用矩阵 A把 s 到 t 的最短路问题表示成线性规划问题。
设一条 s 到 t 的路径边集为 P,定义向量 f=(f1,…,fm)T,其中 fi={0,ei∈/P1,ei∈P。因为路径满足 s 的出度为1,t 的入度为1,其他途径点的入度等于出度,易知 f满足 Af=(1,−1,0,…,0)T,其中1对应 s,-1对应 t。最短路是一条费用最小的s-t路 P。
因此我们可以写出如下初始线性规划(最短路的流模型): mins.t.e∈E∑cefeAf=(1,−1,0,…,0)Tf≥0
可以想到,实际最短路问题中我们所求的最优解 f分量只有0和1两种取值,但在我们以往介绍的LP问题中,也可能产生小数解,会不会对此产生影响?实际上,在本问题中,求得的最优解一定是满足条件的。具体的证明会放在下一节整数规划中详细解释。
根据关联矩阵的性质,把矩阵 A的每一行加起来会得到零向量,所以 A中的行向量线性相关。不妨去掉 t 所在的一行,得到新的 Aˉ以及最短路问题,并且能直接写出它的D形式与DRP形式:
(P) mins.t.e∈E∑cefeAˉf=(1,0,…,0)Tf≥0
⇉ (D) maxs.t.ysyi−yj≤cij, (i,j)∈Eyt=0
⇉ (DRP) maxs.t.y~sy~i−y~j≤0, (i,j)∈Jy~i≤1 ,i∈Vy~t=0
其中,允许指标集 J={ (i,j) ∣ yi−yj=cij },D有一个明显的初始可行解 y=0。
DRP问题的解是可以直接看出来的。
- 首先如果一条边在最短路径当中,则它对应的边 fe=1,则在D中对应的限制要取等号,yi−yj=cij,所以该边 (i,j)∈J。
- 其次,要让 y~s取最大值,如果没有 y~t=0的条件影响,y~s最优解显然可以取到1。只有通过不断更新,增加J中的边,直到某条边 (i,t)∈J时,t进入指标集中的边形成的连通块,y~s必须取0,此时我们也就找到了 s 到 t 的最短路。
对于改进解的过程,我们有:y^i=yi+θy~i,θ=min {y~i−y~jcij−(yi−yj)}>0,其中 (i,j)∈/J,y~i−y~j>0。
显然此时有y~i−y~j=1,所以 θ=min {cij−(yi−yj)}。所以 y^s=ys+θ。
对于允许指标集 J,若 (i,j)∈J,有 yi−yj=cij。则 y^i−y^j=yi−yj+θ(y~i−y~j)=cij。(i,j)一旦进入J,就不会再出来。说明该算法能够在O(M)步内终止。
所以,原始对偶方法就是在不断扩展可到达 t 的顶点集,直到 s 进入该集合。
最短路问题例子
我们以下面的求 s 到 t 的最短路例子来演示原始对偶方法的应用。
⇉ (D) maxs.t.ysyi−yj≤cij,yt=0(i,j)∈E
- D的初始可行解 y=0。此时 J=∅,y~=(1,1,1,1,1)T。取改进解,θ=ce7=2。
- 改进后 y=(2,2,2,2,2)T。此时 J={e7},y~=(1,1,1,0,1)T。取改进解,θ=ce6=2。
- 改进后 y=(4,4,4,2,4)T。此时 J={e7,e6},y~=(1,1,1,0,0)T。取改进解,θ=ce5=ce4−2=1。
- 改进后 y=(5,5,5,2,4)T。此时 J={e7,e6,e5,e4},y~=(1,0,0,0,0)T。取改进解,θ=ce2=1。
- 改进后 y=(6,5,5,2,4)T。此时 J={e7,e6,e5,e4,e2},y~=(0,0,0,0,0)T。
所以最短路径长度 ys=6,路径为 e2=>e5=>e6=>e7。
整数规划
先从最简单的线性整数规划开始。
线性整数规划其实就是线性规划加上解必须为整数的限制,其基本形式为 xmaxs.t.cTxAx≤bx∈N 。我们之前见过的很多算法问题都能写成线性整数规划的形式,特别是能写成整数规划的一种特殊形式:0-1 规划。
设共有 n件物品,vi表示第 i件物品的价值,wi表示第 i件物品的重量,c表示背包的最大承重,xi∈{0,1}表示是否选择第 i件物品。那么 0-1 背包问题可以写为 xmaxs.t.i=1∑nvixii=1∑nwixi≤cxi∈{0,1}
设共有 n个点,点集为 V,(i,j)∈E表示从第 i个点连到第 j个点的一条有向边(一条无向边就相当于两条有向边),wi,j表示边权,xi,j∈{0,1}表示这一条边是否在最小生成树内。那么最小生成树问题可以写为 xmins.t.(i,j)∈E∑wi,jxi,j(i,j)∈E∑xi,j=n−1i∈S,j∈S∑xi,j≥1xi,j∈{0,1}∀S⫋V
第一项限制保证了生成树中有且仅有 n−1条边,第二项限制保证了生成树的连通性。因为树是无向图,所以每条边都会被算两次,最后答案除以 2 即可。
虽然这个表述使用了指数级的限制,但我们知道,最小生成树是有多项式算法的。也可以用椭球法在多项式时间内解最小生成树问题。
设共有 n个物品,wi表示第 i个物品的重量,c表示每个箱子的承重,xi,j∈{0,1}表示是否将第 i个物品放入第 j个箱子,yi表示是否使用第 i个箱子。那么装箱问题可以写为 x,ymins.t.i=1∑nyii=1∑nwixi,j≤cyjj=1∑nxi,j=1xi,j∈{0,1}yi,j∈{0,1}∀j∈{1,2,…,n}∀i∈{1,2,…,n}
第一项限制保证了每个箱子装的物品不会超过承重,第二项限制保证了每个物品一定会被装入箱子,且每个物品只装入一个箱子。
设图的点集为 V,边集为 E。设 (i,j)∈E表示从第 i个点连到第 j个点的一条有向边,xi,j表示这条边是否为匹配边。那么一般无向图的最大匹配问题可以写为 xmaxs.t.(i,j)∈E∑xi,j(i,j)∈E∑xi,j≤1(i,j)∈E∑xi,j≤1xi,j∈{0,1}∀i∈V∀j∈V
- 旅行商问题:
- 满足每个点都有一个入度和一个出度∑ixij=∑jxij=1
- 增加辅助变量ui保证所有点[0,n]都在0号点的同一个环上,需要满足ui−uj+n∗xij≤n−1,1≤i=j≤n,考虑如果存在一个不包含0号点的环,那么沿着这个环一圈加起来,左侧ui全部消掉,不等式不成立,对于全部都在0号点环上的情况,沿着0号点出发依次给ui赋值1,2,3...即可构造出可行解,因此这个约束与要求是等价的。
幺模矩阵
- 若一个方阵的行列式值为±1,那么称其为幺模矩阵
- 若矩阵A的任何一个非奇异子方阵都是幺模矩阵,那么称矩阵A是全幺模矩阵,对于整数向量b,Ax=b的基本可行解都是整数解
- 全幺模矩阵:
- 若A是全幺模矩阵,则AT,[A,I]也是全幺模矩阵,A−1是整数矩阵
- 如果取到了含有I的列那么按列展开求行列式可得子方阵一定是幺模矩阵
- 判定条件(充分不必要)
- 如果A的元素为0,±1,且每列中非零元素至多有两个使得A的行可以分成两个子集I和J满足:如果一列中两个非零元素符号相同,则所在行分别属于I和J,如果符号不同,则所在行同时属于I或J,则A是全幺模矩阵
- 如果A的元素为0,±1,且每列中至多含有一个非零元素,那么A是全幺模矩阵
- 常见的全幺模矩阵:有向图的关联矩阵
Gomory 割平面法
Gomory 割平面法:在解空间中增添约束去掉分数解空间,不断逼近整数解空间。
考虑一个线性规划问题,假设我们使用单纯形表求解后获得的不是整数解,我们选择一个非整数的变量 xi,根据单纯形表有 xi+j=m+1∑nai,jˉxj=biˉ①
既然 xi不是整数,说明 biˉ一定不是整数,当然 ai,jˉ也可能不是整数。
将式 ① 调整一下,变为 xi+j=m+1∑n⌊ai,jˉ⌋xj≤biˉ②
显然,式 ① 的解一定是式 ② 的解。
再次调整式 ②,变为 xi+j=m+1∑n⌊ai,jˉ⌋xj≤⌊biˉ⌋③
容易看出,式 ② 的整数解一定符合式 ③,而原来用单纯形表求出的非整数解就不符合式 ③ 了(因为原来求出的非整数解中,有 xi=biˉ>⌊biˉ⌋以及 xj=0)。我们只要把式 ③ 加入原来的线性规划问题,分数解空间会减小,但是整数解空间不变,对新的限制问题进行求解直至求出整数最优解。
来举个例子,考虑以下线性整数规划问题 xmaxs.t.3x1+2x22x1+3x2+x3=142x1+x2+x4=9x≥0
用单纯形表解该问题,结果为 x2x1001010−1/41/2−1/4−5/4−1/23/4−59/45/213/4
选择 x2,加入限制:x2−x4≤2,即 x2−x4+x5=2。
用单纯形表求解加入限制后的问题,结果为 x3x1x2001000010100−111−1−1/2−2−1/21−29/217/22
选择 x1,加入限制:x1+x4−x5≤3,即 x1+x4−x5+x6=3.
用单纯形表求解加入限制后的问题,结果为 x3x1x5x2001000000101000−1110−100010−1−4−1−22−143411
所以原问题的最优解为 x1=4,x2=1,目标函数值为 14。
分枝定界法
思想和最优性剪枝或者 min-max 搜索树差不多,在解空间中不断分为两支分别求解,通过上下界进行剪枝优化。
先解原问题,得到整数规划最优解的上界。假设最优解中 N<xi<N+1不是整数,就会有两种可能:xi≤N或 xi≥N+1,对两种情况分别进行搜索。
如果在某一枝内算出了一个整数解,我们就得到了原整数规划最优解的下界;如果另一枝内线性规划问题的解还没有这个下界来得优,那么那一枝就不考虑了。一个子树的最优解不会比根节点的最优解(可能是分数)更差。
试一试 Gomory 单纯形法的例子。将原问题松弛为线性规划问题后,得到的最优解为 x2=5/2,x1=13/4,目标函数值为 59/4。
先探索 x2≤2的情况,用单纯形表求解得 x3x1x2001000010100−111−1−1/2−2−1/21−29/217/22
探索 x1≤3的情况,用单纯形表求解得 x3x4x2x100001000100100000100−20010−3−2−201−132123
得到候选的解 x1=3,x2=2,目标函数值为 13。
接下来探索 x1≥4,用单纯形表解得 x1x3x2x5010000001000100−20−210−1−1−421−144311
得到候选的解 x1=4,x2=1,目标函数值为 14。
注意到原问题目标函数值的上界为 59/4,而 14<59/4<15,所以目标函数值的整数上界为 14,x1=4,x2=1必然为整数最优解. 所以原问题的最优解为 x1=4,x2=1,目标函数值为 14。