组合优化 学习笔记

第一部分:定义优化问题:考虑一个点A(x1,x2...xn),它在n维空间内。
有若干个限制gi(A)bi
我们需要最小化f(A)f是一个函数。
f(A)=aTx+ba是常数),就把f称为关于A的仿射(affine)函数(例子:2x1+x2+x3+4),当b=0就把f称为线性(linear)函数0
gi(A)全部都是仿射函数,那么就把这个系统称作线性规划(linear program)。
线性规划可以最大化f(A),把xi取反即可。
这个系统也可以包含大于号和等于号。
例子:x1x33
x2+x42
x1+x4=4
x1...x40
minx12x2+x4
优化问题有可能有多阶段:
考虑如下问题:某公司在接下来n个月内每个月需要提供ai升油。
公司有一个油箱,最多能储存x升油,公司第一个月有y升油
每个月的油价为bi,求最小代价。
假设第i个月剩余油量为ti,每个月买了ci升油
有关系式ti+1=tiai+ci,tn+cnant1=y
注意不是ti+1=tiai+1+ci+1,tn+cnan,因为此时a1没有被考虑到。
根据题意能够列出关系式0tix,ci0
最小化i=1ncibi
如果我们要最小化cibi,那么由于max(cibi)是非线性的,不能使用原方法。
可以引入辅助变量M,加入n条限制Mcibi,最小化M
M在最优解中一定等于max(cibi),因为如果M>max(cibi),我们一定可以减小M
同理假设我们要最小化|ab|,那么可以拆成max(ab,ba),然后使用上面的方法即可。

第二部分:整数规划
当点必须是整点,那么这个问题就整数规划问题。
普通线性规划问题有快速算法,但是整数规划问题是NP的。
定义混合整数规划:在混合整数规划中,变量既可以是实数,也可以是整数。
整数规划的第一个例子是01背包问题:
假设每个物品的重量是ci,价值是wi,总重量限制是a
我们显然可以列出限制0xi1,i=1ncixia
最大化i=1nxiwi
有4种整数规划建模的常用方法:
第一种:权值拆点
使用拆点法,假如某个变量x的取值范围为1k,那么可以拆出限制fx,k表示x的权值是否为k
比如数独问题中,假设一些格子的权值已经被给定,求这个系统是否合法。
可以对于每个格子(i,j)拆出9个点fi,j,kfi,j,k=1表示第i个格子取k
显然kfi,j,k=1
并且假设格子(a,b)的权值必须要为c,那么fa,b,c=1
我们要考虑每行,每列,每个方格内每种数必须能且只能出现1次的限制。
所以对于第i行,对于所有权值kjfi,j,k=1
对于每列,每个方格同理。
第二种:用0/1变量
假如有规定:对于限制αixβi至少要满足k
用变量ci表示第i个限制是否被满足。那么cik
对于每个限制,加入新的限制αixβici
容易发现这也是整数规划。
这样当ci=0这条限制就相当于没有,ci=1就相当于αixβi
特别的,如果我们要表示x,y最多只能选1个,那么我们可以加入限制x+y1
第三种:使用和为1
例子:在背包问题中,假如我们选择的物品的重量限制为若干个整数(比如只能为20,200,2000),可以用01变量。
考虑g1,g2,g3表示当前物品的重量为20,200,2000,显然g1+g2+g3=1,0gi1
并且加入限制i=1nxiwi=g120+g2200+g32000即可。
第四种:拆物品
假设我们第一个物品的价值是10,但是当选的物品6个时价值是5
可以拆出一个新的物品,价值是5,第一个物品限选5个。
新的物品不一定需要在第一个物品选了5个时被选择,但是由于第一个物品的价值更高,肯定先选第一个物品。

第三部分:最短路与整数规划。
引入割的概念(这个概念在OI中通常会在网络流中遇到)
定义F(S):{(u,v):uvE,uS,vS}为集合S的割集。
上文中所提到的S必须包含源点,且不包含汇点。
有定理:如果SE的子集,并且每一个割集都至少包含S的一条边,那么S会包含st的一条路径。
使用反证法证明,假设通过S无法到达t,设A为通过这些边所能到达的集合。
考虑某点tt不属于A而且与A的某个点x相邻。
设某割集只包含A,那么根据割和连通性的定义,其不包含S的任何一条边,矛盾。
事实上每条路径都与所有割相交。
因为假设存在一个割与路径不相交,考虑这条路径sa1a2...ant
根据割的定义s,a1...t在同一个集合内,然而割的定义是s,t在不同集合,矛盾。
于是可以考虑建模:设Si是这张图的某个割,G为这些割构成的集合
将每条边(ui,vi,wi)作为一个变量xi
那么jSixj1,iG
同时有限制xi0
要最小化iEwixi
注意当xi>1,可以把xi变为1,此时wixi更小而且还满足要求。所以此模型自动满足xi1

第四部分:线性规划无解性的判断
为了判断线性规划(非标准型)的无解性,我们首先需要把带不等号的线性规划转换成标准等式型(Standard Equality Forms)。
可以使用如下2种方法:
1.考虑限制a1x1+....+anxnb,加入松弛变量g变成a1x1+....+anxng=b
g0是显然成立的。
2.如果线性规划对于某变量x没有大于等于0的限制,可以新增两个变量y,z,让x=yz
y,z0
转化后的线性规划是等价(equivalent)的,这说明如果某个线性规划无解,那么另一个线性规划也无解。
而且如果每个变量在所有等式中恰好总共出现2次,那么可以使用费用流求解。
通过某个线性规划的解可以构建另一个线性规划的解。
设转化后的线性规划是Ax=b,x0,maxcx,无解分为以下两种情况:
1.Ax=b,x0不可能成立(infeasible)
判断它的充要条件是:存在一个向量d使得dTA0但是dTb<0
原因是dTA是对A的每行的等式进行若干次加减法操作所得到的一个新的和x1...xn相关的等式。
假设它是a1x1+....+anxndTA0就是a1...an>0
由于a1...an0x1...xn0,所以a1x1+....+anxn>0必须成立
但是在此情况下a1x1+....+anxn0,矛盾。所以不可能有解。
2.Ax=b,x0,maxcx不存在最优解(Unbounded)
注意:在应用这个定理时,我们要先证明线性规划有解。
判断它的充要条件是:存在向量d使得dTA=0dTc>0
并且Ax=b,x0需要存在解x¯
原因:考虑反证法,假设最优解是x¯
dTA=0的意义是:x¯+kdk是任意正常数)一定满足A(x¯+d)=b
而且由于dTc>0(x¯+kd)Tc>x¯,与最优解是x¯矛盾。
上面我们只证明了这两个定理的充分性,关于必要性的证明需要用到一些对偶的知识

第五部分:寻找线性规划的任意解
我们可以找到A的一组基(Basis)。
基是U={1...m}的一个大小为n的子集,该集合在矩阵中的列线性无关。
定义Ae:只考虑ae对应的列的矩阵,be:只考虑be对应的列的矩阵
例子:考虑线性规划
x1+2x2x3+x4x5=2
0x1+1x2+0x3+x4x5=1
0x1+0x2+x3+x4x5=1
e={1,2,3}就是一组基,因为[1,0,0],[2,1,0],[1,0,1]线性无关
定义线性规划在某组基e下的标准形式A¯x=b¯,x0,maxc¯
1.A¯e=I
2.对于所有je,定义转化后的cc¯,c¯j=0
转化后的线性规划最优解和原线性规划相等,并且一样有解。
如果我们令基外的x元素都为0,那么A¯ex=b
因为A¯e=I,我们容易得到一组解
称其为基础解。
考虑如何转化成标准形式:
第一步考虑方程Ax=b,将A转化为A¯使得A¯e=I,这可以通过将方程两边乘以(Ae)1得到
这也说明由于(Ae)1唯一,且基所对应的列线性无关,所以方程A¯ex=I的解唯一,一组基对应的基础解也是唯一的。
第二部我们可以找到一个向量yy是常数),
根据1显然有yTAx=yTbcx=(cyTA)x+yTb
(cyTA)e=0(yTA)e=ce
解得y=ce(Ae)1
yTb作为新的目标函数的常数,(cyTA)x作为新的目标函数要最大化的对象即可。

第六部分 单纯形算法
单纯形算法可以在指数级时间内求解线性规划Ax=b,x0,maxcx+d
虽然最坏情况下是指数级时间,但是大部分情况下跑不满,在现实生活中够用。
线性规划的求解事实上存在多项式时间算法,在后面会提到
首先找到一组基和一组基础的解y
然后把线性规划转化成y下的标准形式
现在我们考虑在基中新增一个元素a(需要枚举),并且a不属于基内。
保持基外除了ya以外的元素都等于0
比如我们有解(2,3,0,0,0),新增a=3,那么y4=y5=0
假设ya=t0。那么有Aex+g=y,gi=tAa,i
新的方程Aex=yg
这就是把原线性规划转化为标准型的好处:
由于Ae=I,我们容易得到一组解x
由于ce=0,而且基外除了xa以外的元素都等于0,所以cx=t,我们可以快速求得目标函数值
f>0,我们可以通过增大t的方式寻找最优解
新的解xi=yitAa,i0告诉了我们t的范围,设0ts
假如这些限制并没有规定s的上界(比如我们有限制5+2t0,3+4t0),那么单纯形算法会报告线性规划没有最优解并且推出。
否则我们可以让t取到上界。
此时某个xi会变成0,在基内可以删除某个i
例子:考虑线性规划x1+x2+2x3+0x4=2
0x1+x2+x3+x4=5
max0x1+x2+3x3+0x4的一组基{1,4}和基础的解(2,0,0,5)
考虑加入2,令x2=t
那么有x1=2t,x4=5t。那么有t2
由于基外的元素(除了2)的x值都为0c1=c4=0{1,4}在基内)
cx=t,我们要最大化t。显然t=2最优。
此时x1=0,在基中删除1增加2
得到新的基础解(0,2,0,3)
对新的基求解线性规划的标准形式,并且重复以上过程,直到某次循环后cN0,或者算法报告线性规划没有最优解。
将得到的基础解乘以c数组再加上常数即可得到最优解。
假设线性规划运行过程中,我们每次得到的基础可行解的权值都是严格递增的。
由于相同基对应的基础可行解的权值是相同的,所以我们不会访问相同的基。
但是我们每次t的增量可能为0,所以如果不对线性规划的运行过程加以一定的限制,我们可能会访问相同的基。
但是在实现时遵循以下2个规则就不会死循环了:
1.如果对于多个元素加入当前的基都能比现在的解更优,则加入最小的那个。
2.如果对于多个元素可以从当前基删除(即该元素的x值等于0),那么删除最小的那个
对于该规则的证明超出了文章的范围
在实现时,需要不断移除线性相关的限制,使得所有限制线性无关。
通过单纯形算法,我们可以得知线性规划基本定理:一个线性规划或者无界,或者无解,或者存在最优解。

第7部分:2阶段单纯形算法
前面的算法首先要求出线性规划的某个基础可行解才能运行。
所以我们需要首先求出线性规划的
所以线性规划有如下性质:
1.如果线性规划有解,那么一定有基础可行解。
2.如果线性规划有最优解,那么一定有是基础可行解的最优解。

第8部分:线性规划和单纯形算法的几何意义
考虑线性规划的标准不等式形式A¯xb¯,x0,maxc¯x
某个限制给出了一个向量a和一个常数b,要求axb
解所存在的区域是若干个半超空间的交。
定义超空间的线段/直线:假设有两个点C,D,一个实数x
定义点之间的加法,数乘和向量的加法,数乘相同。都是坐标之间相加/坐标乘以一个数。
CD直线上的所有点E满足存在x使得E=Cx+D(1x)
CD所构成线段上的所有点E满足存在x使得E=Cx+D(1x),并且0x1
定义凸集:一个集合S使得S中任意两个点A,B的线段上的所有点都被S包含。
定义凸集的极值点:对于凸集的某点x,不存在凸集内两个不同的点AB使得xAB
凸集的性质:
1.若干个半超空间的交是凸集。
证明:考虑某个限制AxB,点x=c,d满足该限制。
那么考虑e=cy+d(1y),0y1
AcB,AdB
由于0y1,AcyBy,Ad(1y)B(1y)
那么有A(cy+d(1y))B,所以cy+d(1y)也满足该限制。证毕。
2.极值点一定是某线性规划的最优解。
证明:反证法
如果凸集的某点e存在凸集内两个不同的点c,d使得xcd
e=cy+d(1y),0y1
设目标函数为f(x)=gxf(e)=gcy+gd(1y)
f(c)=gc,f(d)=gd
如果gcgdgcgd),那么有gcy+gd(1y)gcy+gc(1y)=gc,所以此时取c或者d一定不会更劣。
3.定义
4.对于某在SEF的线性规划,其所有基础可行解就是该线性规划的极值点。
事实上在单纯形算法中,在某组基下求得就是若干个平面的交点
也就是说单纯形就是在这个凸集的顶点上进行的爬山算法。
如果线性规划只有2个变量要最优化,那么凸集在平面上就是凸包,可以使用二分求解线性规划的最大/小值。

第9部分 最短路算法
考虑前面提到的最短路的整数规划。
定义线性规划的整数松弛:去掉权值必须是整数的条件。
去掉后的最优解可能会更小(或者相等)。
将该线性规划进行对偶可以得到:iSjyjwi,iE
\yi0,iG
maxiGyi
设变量hi=wiiSjyj,如果解是合法的,那么hi0
初始y数组为0hi=wi
Dijkstra算法的过程如下:维护一个集合P,初始P只包含源点。当P包含汇点时过程结束。
定义F(S):{(u,v):uvE,uS,vS}为集合S的割集。
每次考虑F(P),不断增大yP使得解仍然合法。
考虑F(P)中的某条边i,如果yP增加了q,那么hi也会减少q
所以yP的最大增加量为min(hi),iF(P),让yP等于这个值v,并且让所有iF(P)h值都减少v,让答案增加v
容易发现在这个过程中hi0是恒成立的。
如果某个hi=0,由于割的性质,边i恰好有一个节点x包含在P
设另一个节点为y,我们把y加入集合P中。
每次过程至少会有一个hi变为0并且被加入P,所以这个过程不会死循环。
这样子我们得到了最短路的下界。
考虑证明我们得到了最短路。

第10部分:弱对偶原理
弱对偶原理可以帮助解决包含小于号,等于号,大于号的线性规划。
假设有两个线性规划Ax+s=b,maxcTx,并且线性规划有解。
xi小于或者大于0或者没有限制。
ATy+w=cminbTy
yi小于或者大于0或者没有限制。
S1为满足sg0g构成的集合,S2为满足sg0g所构成的集合,S3为满足sg=0g构成的集合。
C1为满足xg0g构成的集合,C2为满足xg0g所构成的集合,C3为满足xg没有限制的g构成的集合。
x¯,y¯是第一个,第二个线性规划的特解。
那么cTx¯=x¯Tc
=x¯T(ATy¯+w)=(x¯T)ATy¯+(x¯)Tw
=Ax¯yT+wx¯T=(bs)y¯T+wx¯T=b(y¯)Ts(y¯)T+w(x¯)T
=bTy¯sTy¯+wTx¯
假设sTy0,wTx0,那么cTx¯bTy¯
所以对于gS1,yg0,对于gS2,yg0,对于gS1,yg没有限制
这就是线性规划的互补松弛定理。
对于gC1,wg0,对于gC2,wg0,对于gC3,wg=0
并且有第一个线性规划的任意解的目标函数小于第二个线性规划的任意解的目标函数。
一个线性规划的对偶的对偶还是原线性规划。

第11部分:强对偶原理
事实上原线性规划的最优解(假设这两个线性规划都存在解)和对偶线性规划的最优解是相同的。
证明:假设某线性规划在SEF下,运行了2阶段单纯形算法。
如果某线性规划不是SEF,那么可以使用前文提到的方法转化成SEF。
考虑原线性规划max{cTx:Ax=b,x0},它的对偶是min{bTy:ATyc}
假设某组基B是最优解x对应的基。
考虑把原线性规划重写成关于B的标准形式max{(cTyTA)x+yTb:xB+xNANAB1=bAB1,x0}
并且我们知道由于B是最优的解的基,所以cTyTA,所以yT是对偶线性规划的合法解。
并且(cTyTA)B=0xN=0,所以(cTyTA)x+yTb=yTb
而且yTb是对偶线性规划解yT的目标函数,与原线性规划的目标函数相等。
所以根据弱对偶定理,y也是线性规划的最优解,所以原线性规划的最优解等于对偶线性规划的最优解。
通过这些分析,我们可以证明如下2个定理:
1.如果原线性规划无界,那么对偶线性规划无解。
(同理有如果对偶线性规划无界,那么原线性规划无解)
考虑这个东西的逆否命题:如果对偶线性规划有解,那么原线性规划有界。
由于对偶线性规划的任何解都大于等于原线性规划的任何解,原线性规划的解的目标函数有上界。
注意如果原线性规划无解,那么对偶线性规划也可能无解
(例子有:线性规划max{(1,2)x:x1x2=1,x1+x2=2}
2.如果两个线性规划都有解,那么都有最优解。
考虑原线性规划的某一个解的目标函数的值p,那么对偶线性规划的所有解的目标函数都大于p,所以对偶线性规划的最优解有下界p,所以不是无界的,根据线性规划基本定理,对偶线性规划有最优解。同理原线性规划也有最优解。

第11部分:判断线性规划最优性的条件
我们可以使用互补松弛定理判定线性规划与对偶的某组解x¯,y¯的最优性。
当前面线性规划的cTx¯=bTy¯,我们知道sTy¯+wTx¯=0
由于我们假设sTy¯0,wTx¯0,那么有sTy¯=wTx¯=0
所以对于gS1S2,y¯g=0或者sg=0,对于gS3,由于sg=0,所以y¯g无限制。
对于gC1C2,wg=0或者x¯g=0,对于gC3,由于wg=0,所以x¯g无限制。
换句话说,在某线性规划中,其每个变量x¯g要么等于0,要么其对偶线性规划的对应限制能取等。
(对于对偶线性规划的每个变量y¯g同理)
它的几何意义:如下只考虑在SEF下的线性规划max{cTx:Axb}
(对偶min{bTy:ATy=c,y0}
定义对于某线性规划的某解x,如果某个限制αxβ满足αx=β,那么称其为紧限制。
考虑我们有紧限制α1xβ1...αkxβk
那么x是最优解的充要条件是存在λ0c=i=1kαiλi
证明:首先考虑互补松弛定理:当某个y¯是最优解
那么对于第i个限制,AiTx=b或者yi=0
先证明当存在λ0c=i=1kαiλi那么x是最优解。
考虑min{bTy:ATy=c,y0}的最优解y,当$$
特别的,当没有紧限制时,当且仅当c=0x是最优解。

第12部分:整数规划
整数规划是经典NP问题。所以人类对于整数规划的认知还非常有限。
和线性规划不同,整数规划可能有解并且有界,但是并没有最优解。
定义若干个点ai的凸包:最小的点集使得该点集是凸的,并且这个点集包含a中的所有点。
可以证明如果整数规划中限制和目标函数的系数都是分数,那么凸包一定存在。
更准确的,凸包内的点由如下方法确定:我们考虑数组λ
i=1nλi=1,那么凸包中的每个点y都满足存在λy=i=1nλiai
记点集S的凸包是conv(S)
凸包有如下性质:
1.对于某线性规划max{cTx:Axb},考虑Q是其中整数点构成的集合
那么conv(Q)是个多面体Axb,并且A,b内的所有元素都是有理数。
2.考虑某整数规划P1max{cTx:Axb},考虑QAxb中整数点构成的集合
考虑另一个线性规划P2max{cTx:Axb},该线性规划并不需要x是整数。
那么对于P1,如果它无解/无界,那么P2也无解/无界。
P1的最优解也是P2的最优解。并且对于所有P2的最优解,如果它是极值点,那么也是P1的最优解。
对于以上两个定理的证明超出了本文的范围。

第13部分:切平面算法
对于整数规划,我们可以使用指数级算法切平面算法解决。
定义线性规划的松弛:假如我们有线性规划P1:maxcTx:xS1,P2:maxcTx:xS2,并且S1S2的子集
那么我们有:
1.如果P2无解,那么P1无解。因为假如P2无解,那么S2是空集,那么由于S1S2的子集,所以S1也是空集,所以P1无解。
2.如果P2的最优解也符合P1的条件,那么这个解是P1的最优解。
因为假设这个解不是P1的最优解,考虑P1的最优解,由于S1S2的子集,这个解也是P2的解,而且比P2的最优解更优,矛盾。
3.P2的最优解是P1最优解的上界。
因为假设P1存在一个解使得其目标函数比P2的最优解高,由于S1S2的子集,所以这个解也是P2的解,而且比P2的最优解更优,矛盾。
定义对于某组最优解的切平面αxb:最优解x¯不满足αx¯b,并且每个线性规划的整数解x都满足αxb
切平面算法的过程是:(假设线性规划已经被化为SEF)
我们首先将整数规划进行整数松弛,然后找到线性规划的最优解对应的基B,把线性规划重写成这组基的标准型:假设为xB+A¯NxN=b¯
如果b¯都是整数,那么算法完成。因为我们的线性规划是整数规划的松弛,并且xB=b¯,xN=0是整数解,符合整数规划的x都要是整数的限制,所以根据前面的分析x是最优解。
对于每个满足bi不是整数的限制i,设第i行的限制是xj+A¯i,kxk=bi
考虑切平面xj+Ai,kxkbi
由于xN=0,所以xj=bixj+Ai,kxk=bi
所以如果这个限制是切平面,那么bi必定不是整数。
假设bi不是整数(由于x不全是整数i一定存在)
然后考虑对于原线性规划的每组整数解x¯一定满足x¯j+Ai,kxk=bi
由于x¯0,对于所以xkAi,kxk¯Ai,kxk¯
所以x¯j+Ai,kx¯k=bi,由于x是整数,x¯j+Ai,kx¯kbi,所以原线性规划的整数解一定满足限制xj+Ai,kxkbi
所以如果bi不是整数,那么xj+Ai,kxkbi必定为切平面
加入该限制,把整数规划重新转化为SEF然后继续进行切平面算法,直到最优解为整数为止。
可以证明:存在一种寻找切平面的方法使得上述算法一定会结束。但是证明它超出了本文的范围。

第14部分:非线性规划

第15部分:线性规划的内点法
在此部分我们介绍一种线性规划的快速算法:内点法
定义线性规划的内点:如果某个点是内点,则对于某线性规划的可行域S,存在实数r>0,使得这个点为中心半径为r的超球被包含在S内。
考虑在SEF下的线性规划{maxcTx:Ax=b,x0},假设矩阵A满秩,否则我们可以移除A的若干行。
它的对偶线性规划:{minbTy:ATys=c,s0}s是松弛变量)
根据弱对偶定理,对于原线性规划的任意解x¯和对偶线性规划的任意解y¯cTxbTy
考虑我们通过某种方法得到了原线性规划,对偶线性规划和松弛变量s的可行解x¯,y¯,s¯,且x¯,y¯是原/对偶线性规划可行域的内点,我们想要求出更优的解。
bTycTx=0时,x,y都是原/对偶线性规划的最优解,所以我们考虑缩小bTycTx
我们知道bTycTx=(Axy)cTx=xTATyxTc=xT(ATyc)=xTs
考虑求出一个方向dx,dy,ds,使得对于某个实数αx+dx,y+dy,s+ds是可行解,并且cT(x¯+αdx),bT(y¯+αdy)的差更小
所以A(x¯+dx)=b,AT(y¯+dy)(s+ds)=c
由于Ax¯=b,ATy¯s=c,所以Adx=0,ATdyds=0
我们想让(x¯+dx)(s¯+ds)尽量小,所以考虑让它等于0
所以对于所有ix¯is¯i+x¯idsi+s¯idxi+dxidsi=0
dxidsi的二次项很难处理,所以去掉,我们得到了x¯is¯i+x¯idsi=0
可以证明当矩阵A满秩,ds,dx,dy都有唯一解。
原因:

第16部分:线性规划无解/无界性判断的证明
先考虑

posted @   celerity1  阅读(157)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示