组合优化 学习笔记
第一部分:定义优化问题:考虑一个点\(A(x_1,x_2...x_n)\),它在\(n\)维空间内。
有若干个限制\(g_i(A)\leq b_i\)
我们需要最小化\(f(A)\),\(f\)是一个函数。
当\(f(A)=a^Tx+b\)(\(a\)是常数),就把\(f\)称为关于\(A\)的仿射(affine)函数(例子:\(2x_1+x_2+x_3+4\)),当\(b=0\)就把\(f\)称为线性(linear)函数0
当\(g_i(A)\)全部都是仿射函数,那么就把这个系统称作线性规划(linear program)。
否则是非线性规划。
线性规划可以最大化\(f(A)\),把\(x_i\)取反即可。
这个系统也可以包含等式。只需要依靠等式进行消元(但是这个方法有点复杂)即可把限制消的只剩\(g_i(A)\leq b_i\)
或者可以把\(f(x)=0\)拆成\(f(x)\geq 0,-f(x)\geq 0\)。
也可以包含大于等于号,只需要把大于等于号左边的东西移到右边就可以把大于号转化为小于等于。
(但是不能包含小于和大于号)
例子:\(x_1-x_3\leq 3\)
\(x_2+x_4\geq 2\)
\(x_1+x_4=4\)
\(x_1...x_4\geq 0\)
\(\min x_1-2x_2+x_4\)
\(x_4=4-x_1\),用\(4-x_1\)代替\(x_4\)得到:
\(x_1-x_3\leq 3\)
\(x_2-x_1\geq -2\)
\(x_1,x_2,x_3\geq 0\)
\(x_1\leq 4\)
\(\min x_1-2x_2+x_4\)
把大于号转化成小于号得到:
\(x_1-x_3\leq 3\)
\(x_1-x_2\leq 2\)
\(x_1,x_2,x_3\geq 0\)
\(x_1\leq 4\)
\(\min -2x_2+4\)
优化问题有可能有多阶段:
考虑如下问题:某公司在接下来\(n\)个月内每个月需要提供\(a_i\)升油。
公司有一个油箱,最多能储存\(x\)升油,公司第一个月有\(y\)升油
每个月的油价为\(b_i\),求最小代价。
假设第\(i\)个月剩余油量为\(t_i\),每个月买了\(c_i\)升油
有关系式\(t_{i+1}=t_i-a_i+c_i,t_n+c_n\geq a_n\),\(t_1=y\)
根据题意能够列出关系式\(0\leq t_i\leq x,c_i\geq 0\)
最小化\(\sum_{i=1}^n c_i*b_i\)
如果我们要最小化\(c_i*b_i\),那么由于\(\max(c_i*b_i)\)是非线性的,不能使用原方法。
可以引入辅助变量\(M\),加入\(n\)条限制\(M\geq c_i*b_i\),最小化\(M\)
\(M\)在最优解中一定等于\(\max(c_i*b_i)\),因为如果\(M>\max(c_i*b_i)\),我们一定可以减小\(M\)。
第二部分:整数规划
当点必须是整点,那么这个问题就整数规划问题。
普通线性规划问题有快速算法,但是整数规划问题是NP的
整数规划的第一个例子是01背包问题:
假设每个物品的重量是\(c_i\),价值是\(w_i\),总重量限制是\(a\)
我们显然可以列出限制\(0\leq x_i\leq 1,\sum_{i=1}^n c_i*x_i \leq a\)
最大化\(\sum_{i=1}^n x_i*w_i\)。
如果是多重背包,假设每个物品最多选\(b_i\)个,只需要把限制改成\(0\leq x_i\leq b_i\)即可。
如果有某物品的数量不能多于另一个物品\(y\)倍,可以加入限制\(x_i-y*x_j\leq 0\)
假如条件有or逻辑运算,比如第一种物品和第二种物品至少选\(d\)个或者第三种物品和第四种物品至少选\(e\)个
那么可以引入辅助变量\(f\)解决。
当\(f\)的取值仅为\(0,1\),它可以用来处理一些恰好只能选1个/二选一的问题。
\(0\leq f\leq 1\),加入两个限制\(x_1+x_2\geq d*f,x_3+x_4\geq (1-d)*f\)即可。
当\(d=1\)时就是满足第一个限制,当\(d=0\)时必须满足第二个限制(第一个限制随意)
当最小化目标包含绝对值,可以考虑拆成\(|x|=\max(x,-x)\)
假如我们需要最小化\(|x_1-x_2|+|x_3-x_4|\),拆成\(\max(x_1-x_2,x_2-x_1)+\max(x_3-x_4,x_4-x_3)\)
设变量\(e,f\),\(e\geq \max(x_1-x_2,x_2-x_1),f\geq \max(x_3-x_4,x_4-x_3)\)
就是\(e\geq x_1-x_2,e\geq x_2-x_1,f\geq x_3-x_4,f\geq x_4-x_3\),最小化\(e+f\)即可。
假设我们第一个物品的价值是\(10\),但是当选的物品\(\geq 6\)个时价值是\(5\)
可以拆出一个新的物品,价值是\(5\),第一个物品限选\(5\)个。
新的物品不一定需要在第一个物品选了\(5\)个时被选择,但是由于第一个物品的价值更高,肯定先选第一个物品。
假如我们选择的物品的重量限制为若干个整数(比如只能为20,200,2000),可以用\(01\)变量。
考虑\(g_1,g_2,g_3\)表示当前物品的重量为\(20,200,2000\),显然\(g_1+g_2+g_3=1,0\leq g_i\leq 1\)
\(\sum_{i=1}^n x_i*w_i=g_1*20+g_2*200+g_3*2000\)
第三部分:最短路/最大权匹配与整数规划。
首先考虑最大权完美匹配:
在OI中我们学过完美匹配的定义:从边集中选出若干条边,要求每个点恰好被一条边覆盖,求被选出的边(第\(i\)条边的权值是\(w_i\))的最大权值和。
考虑使用一个取值在\([0,1]\)的整数变量\(x_i\)代表边。\(S_i\)表示和第\(i\)个点相邻的边的集合。
我们要求每个点恰好被一条边覆盖,所以要求\(\sum_{j\in S_i}x_j=1\)。
我们需要最大化\(\sum_{i=1}^m x_i*w_i\)
然后考虑最短路。(假设图是联通的,且是无向图,没有负权边)
需要引入割的概念(这个概念在OI中通常会在网络流中遇到)
定义\(F(S):\{(u,v):uv\in E, u\in S, v\notin S\}\)为集合\(S\)的割集。
上文中所提到的\(S\)必须包含源点,且不包含汇点。
有定理:如果\(S\)是\(E\)的子集,并且每一个割集都至少包含\(S\)的一条边,那么\(S\)会包含\(s\)到\(t\)的一条路径。
使用反证法证明,假设通过\(S\)无法到达\(t\),设\(A\)为通过这些边所能到达的集合。
考虑某点\(t\),\(t\)不属于\(A\)而且与\(A\)的某个点\(x\)相邻。
设某割集只包含\(A\),那么根据割和连通性的定义,其不包含\(S\)的任何一条边,矛盾。
事实上每条路径都与所有割相交。
因为假设存在一个割与路径不相交,考虑这条路径\(s\to a_1\to a_2\to ...\to a_n\to t\)
根据割的定义\(s,a_1...t\)在同一个集合内,然而割的定义是\(s,t\)在不同集合,矛盾。
于是可以考虑建模:设\(S_i\)是这张图的某个割,\(G\)为这些割构成的集合
将每条边\((u_i,v_i,w_i)\)作为一个变量\(x_i\)。
那么\(\sum_{j \in S_i}x_j\geq 1,i\in G\)
同时有限制\(x_i\geq 0\)
要最小化\(\sum_{i\in E} w_i*x_i\)
注意当\(x_i>1\),可以把\(x_i\)变为\(1\),此时\(w_i*x_i\)更小而且还满足要求。所以此模型自动满足\(x_i\geq 1\)
第四部分:线性规划无解性的判断
为了判断线性规划(非标准型)的无解性,我们首先需要把带不等号的线性规划转换成标准等式型(Standard Equality Forms)。
可以使用如下2种方法:
1.考虑限制\(a_1x_1+....+a_nx_n\geq b\),加入松弛变量\(g\)变成\(a_1x_1+....+a_nx_n-g=b\)
\(g\geq 0\)是显然成立的。
2.如果线性规划对于某变量\(x\)没有大于等于\(0\)的限制,可以新增两个变量\(y,z\),让\(x=y-z\)
\(y,z\geq 0\)
转化后的线性规划是等价(equivalent)的,这说明如果某个线性规划无解,那么另一个线性规划也无解。
而且如果每个变量在所有等式中恰好总共出现\(2\)次,那么可以使用费用流求解。
通过某个线性规划的解可以构建另一个线性规划的解。
设转化后的线性规划是\(Ax=b,x\geq \mathbb{0},\max cx\),无解分为以下两种情况:
1.\(Ax=b,x\geq \mathbb{0}\)不可能成立(infeasible)
判断它的充要条件是:存在一个向量\(d\)使得\(d^TA\geq \mathbb{0}\)但是\(d^Tb<\mathbb{0}\)
原因是\(d^TA\)是对\(A\)的每行的等式进行若干次加减法操作所得到的一个新的和\(x_1...x_n\)相关的等式。
假设它是\(a_1x_1+....+a_nx_n\),\(d^TA\geq \mathbb{0}\)就是\(a_1...a_n>0\)
由于\(a_1...a_n\geq 0\),\(x_1...x_n\geq 0\),所以\(a_1x_1+....+a_nx_n>0\)必须成立
但是在此情况下\(a_1x_1+....+a_nx_n\leq 0\),矛盾。所以不可能有解。
2.\(Ax=b,x\geq \mathbb{0},\max cx\)不存在最优解(Unbounded)
判断它的充要条件是:存在向量\(d\)使得\(d^TA=0\),\(d^Tc>\mathbb{0}\)
并且\(Ax=b,x\geq \mathbb{0}\)需要存在解\(\overline{x}\)
原因:考虑反证法,假设最优解是\(\overline{x}\)
\(d^TA=0\)的意义是:\(\overline{x}+kd\)(\(k\)是任意正常数)一定满足\(A(\overline{x}+d)=b\)
而且由于\(d^Tc>0\),\((\overline{x}+kd)^Tc>\overline{x}\),与最优解是\(\overline{x}\)矛盾。
第五部分:寻找线性规划的任意解
我们可以找到\(A\)的一组基(Basis)。
基是\(U=\{1...m\}\)的一个大小为\(n\)的子集,该集合在矩阵中的列线性无关。
定义\(A_e\):只考虑\(a\)中\(e\)对应的列的矩阵,\(b_e\):只考虑\(b\)中\(e\)对应的列的矩阵
例子:考虑线性规划
\(x_1+2x_2-x_3+x_4-x_5=2\)
\(0x_1+1x_2+0x_3+x_4-x_5=1\)
\(0x_1+0x_2+x_3+x_4-x_5=1\)
\(e=\{1,2,3\}\)就是一组基,因为\([1,0,0],[2,1,0],[1,0,1]\)线性无关
定义线性规划在某组基\(e\)下的标准形式\(\overline{A}x=\overline{b},x\geq \mathbb{0},\max \overline{c}\):
1.\(\overline{A}_e=I\)
2.对于所有\(j\in e\),定义转化后的\(c\)是\(\overline{c},\overline{c}_j=0\)。
转化后的线性规划最优解和原线性规划相等,并且一样有解。
如果我们令基外的\(x\)元素都为\(0\),那么\(\overline{A}_ex=b\)
因为\(\overline{A}_e=I\),我们容易得到一组解
称其为基础解。
考虑如何转化成标准形式:
第一步考虑方程\(Ax=b\),将\(A\)转化为\(\overline{A}\)使得\(\overline{A}_e=I\),这可以通过将方程两边乘以\((A_e)^{-1}\)得到
这也说明由于\((A_e)^{-1}\)唯一,且基所对应的列线性无关,所以方程\(\overline{A}_ex=I\)的解唯一,一组基对应的基础解也是唯一的。
第二部我们可以找到一个向量\(y\)(\(y\)是常数),
根据1显然有\(y^TAx=y^Tb\),\(cx=(c-y^TA)x+y^Tb\)
令\((c-y^TA)_e=\mathbb{0}\),\((y^TA)_e=c_e\)
解得\(y=c_e(A_e)^{-1}\)
让\(y^Tb\)作为新的目标函数的常数,\((c-y^TA)x\)作为新的目标函数要最大化的对象即可。
可以举例,考虑线性规划
\(x_1+0x_2+x_3-x_4=1\)
\(0x_1+x_2+x_3+2x_4=2\)
\(\max 0x_1+0x_2+2x_3+4x_4\)
设基为\(\{2,3\}\)
先进行第一步转化后(乘以\(\begin{pmatrix}
0&1\\
1&1
\end{pmatrix}^{-1}\))变成:
\(-x_1+x_2+0x_3+3x_4=1\)
\(x_1+0x_2+x_3-x_4=1\)
\(\max 0x_1+0x_2+2x_3+4x_4\)
考虑向量\(y\),\(y\begin{pmatrix}
0&1\\
1&1
\end{pmatrix}=(1,2)\)
\(y=\begin{pmatrix}
0&1\\
1&1
\end{pmatrix}^{-1}(1,2)=(2,0)\)
最大化目标变成了\((c-y^TA)x+y^Tb=-2x_1+0x_2+0x_3+6x_4+2\)
第六部分 单纯形算法
单纯形算法可以在指数级时间内求解线性规划\(Ax=b,x\geq \mathbb{0},\max cx+d\)。
虽然最坏情况下是指数级时间,但是大部分情况下跑不满,在现实生活中够用。
线性规划的求解事实上存在多项式时间算法,但是超出了本文的范围。
首先找到一组基和一组基础的解\(y\)。
然后把线性规划转化成\(y\)下的标准形式
现在我们考虑在基中新增一个元素\(a\)(需要枚举),并且\(a\)不属于基内。
保持基外除了\(y_a\)以外的元素都等于\(0\)。
比如我们有解\((2,3,0,0,0)\),新增\(a=3\),那么\(y_4=y_5=0\)
假设\(y_a=t\geq 0\)。那么有\(A_ex+g=y,g_i=tA_{a,i}\)
新的方程\(A_ex=y-g\)。
这就是把原线性规划转化为标准型的好处:
由于\(A_e=I\),我们容易得到一组解\(x\)
由于\(c_e=0\),而且基外除了\(x_a\)以外的元素都等于\(0\),所以\(cx=t\),我们可以快速求得目标函数值
当\(f>0\),我们可以通过增大\(t\)的方式寻找最优解
新的解\(x_i=y_i-tA_{a,i}\geq 0\)告诉了我们\(t\)的范围,设\(0\geq t\geq s\)
假如这些限制并没有规定\(s\)的上界(比如我们有限制\(5+2t\geq 0,3+4t\geq 0\)),那么单纯形算法会报告线性规划没有最优解并且推出。
否则我们可以让\(t\)取到上界。
此时某个\(x_i\)会变成\(0\),在基内可以删除某个\(i\)。
例子:考虑线性规划\(x_1+x_2+2x_3+0x_4=2\)
\(0x_1+x_2+x_3+x_4=5\)
\(\max 0x_1+x_2+3x_3+0x_4\)的一组基\(\{1,4\}\)和基础的解\((2,0,0,5)\)
考虑加入\(2\),令\(x_2=t\)
那么有\(x_1=2-t,x_4=5-t\)。那么有\(t\leq 2\)
由于基外的元素(除了\(2\))的\(x\)值都为\(0\),\(c_1=c_4=0\)(\(\{1,4\}\)在基内)
\(cx=t\),我们要最大化\(t\)。显然\(t=2\)最优。
此时\(x_1=0\),在基中删除\(1\)增加\(2\)。
得到新的基础解\((0,2,0,3)\)。
对新的基求解线性规划的标准形式,并且重复以上过程,直到某次循环后\(t\)的上界为\(0\),或者算法报告线性规划没有最优解。
将得到的基础解乘以\(c\)数组再加上常数即可得到最优解。
有时线性规划可能会死循环,但是在实现时遵循以下2个规则就不会死循环了:
1.如果对于多个元素加入当前的基都能比现在的解更优,则加入最小的那个。
2.如果对于多个元素可以从当前基删除(即该元素的\(x\)值等于\(0\)),那么删除最小的那个
在实现时,需要不断移除线性相关的限制,使得所有限制线性无关。
第7部分:线性规划和单纯形算法的几何意义
考虑线性规划的标准不等式形式\(\overline{A}x\leq \overline{b},x\geq \mathbb{0},\max \overline{c}x\):
(如果不满足该形式,可以通过前面所提到的方法转化成该形式)
某个限制给出了一个向量\(a\)和一个常数\(b\),要求\(ax\leq b\)
这事实上是一个半超空间。
解所存在的区域是若干个半超空间的交。
定义超空间的线段/直线:假设有两个点\(C,D\),一个实数\(x\)
定义点之间的加法,数乘和向量的加法,数乘相同。都是坐标之间相加/坐标乘以一个数。
\(CD\)直线上的所有点\(E\)满足存在\(x\)使得\(E=Cx+D(1-x)\)
\(CD\)所构成线段上的所有点\(E\)满足存在\(x\)使得\(E=Cx+D(1-x)\),并且\(0\leq x\leq 1\)
定义凸集:一个集合\(S\)使得\(S\)中任意两个点\(A,B\)的线段上的所有点都被\(S\)包含。
定义凸集的极值点:对于凸集的某点\(x\),不存在凸集内两个不同的点\(AB\)使得\(x\)在\(AB\)上
凸集的性质:
1.若干个半超空间的交是凸集。
证明:考虑某个限制\(Ax\leq B\),点\(x=c,d\)满足该限制。
那么考虑\(e=cy+d(1-y),0\leq y\leq 1\)
有\(Ac\leq B,Ad\leq B\)
由于\(0\leq y\leq 1,Acy\leq By,Ad(1-y)\leq B(1-y)\)
那么有\(A(cy+d(1-y))\leq B\),所以\(cy+d(1-y)\)也满足该限制。证毕。
2.极值点一定是某线性规划的最优解。
证明:反证法
如果凸集的某点\(e\)存在凸集内两个不同的点\(c,d\)使得\(x\)在\(cd\)上
\(e=cy+d(1-y),0\leq y\leq 1\)
设目标函数为\(f(x)=gx\),\(f(e)=gcy+gd(1-y)\)
\(f(c)=gc,f(d)=gd\)
如果\(gc\geq gd\)(\(gc\leq gd\)),那么有\(gcy+gd(1-y)\leq gcy+gc(1-y)=gc\),所以此时取\(c\)或者\(d\)一定不会更劣。
事实上在单纯形算法中,在某组基下求得就是若干个平面的交点
也就是说单纯形就是在这个凸集的顶点上进行的爬山算法。
如果线性规划只有\(2\)个变量要最优化,那么凸集在平面上就是凸包,可以使用二分求解线性规划的最大/小值。
第8部分 线性规划的弱对偶
考虑某线性规划\(\overline{A}x\geq \overline{b},x\geq \mathbb{0},\min \overline{c}x\)
我们想要目标函数\(f(x)=\overline{c}x\)的一个下界。
设一个向量\(y\geq \mathbb{0}\)。由于不等式的性质那么有\(y^T\overline{A}x\geq y^T\overline{b}\)
所以有\(0\geq y^T\overline{b}-y^T\overline{A}x\)
\(f(x)=\overline{c}x\geq \overline{c}x+y^T\overline{b}-y^T\overline{A}x\)
\(=x(\overline{c}-y^T\overline{A})+y^T\overline{b}\)
假设\(\overline{c}-y^T\overline{A}\geq 0\),那么\(f(x)\geq y^T\overline{b}\)
如果我们最大化\(y^T\overline{b}\)(设结果为\(z\)),那么\(f(x)\geq z\)
所以我们得到了一个新的线性规划:
\(y^T\overline{A}\leq \overline{c}\)
\(y^T \geq \mathbb{0}\)
\(\max y^T\overline{b}\)
原线性规划的解一定大于等于新线性规划的解。
这就是线性规划的弱对偶。
通过线性规划的弱对偶,我们可以推出Dijkstra算法和KM算法。
第9部分 最短路算法
考虑前面提到的最短路的整数规划。
不证明假设如下结论:如果允许解是实数,那么最优解也是一样的。
将该线性规划进行对偶可以得到:\(\sum_{i \in S_j}y_j\leq w_i, i\in E\)
\(\y_i\geq 0,i\in G\)
\(\max \sum_{i\in G}y_i\)
设变量\(h_i=w_i-\sum_{i \in S_j}y_j\),如果解是合法的,那么\(h_i\geq 0\)
初始\(y\)数组为\(0\),\(h_i=w_i\)
Dijkstra算法的过程如下:维护一个集合\(P\),初始\(P\)只包含源点。当\(P\)包含汇点时过程结束。
定义\(F(S):\{(u,v):uv\in E, u\in S, v\notin S\}\)为集合\(S\)的割集。
每次考虑\(F(P)\),不断增大\(y_P\)使得解仍然合法。
考虑\(F(P)\)中的某条边\(i\),如果\(y_P\)增加了\(q\),那么\(h_i\)也会减少\(q\)。
所以\(y_P\)的最大增加量为\(\min(h_i),i\in F(P)\),让\(y_P\)等于这个值\(v\),并且让所有\(i\in F(P)\)的\(h\)值都减少\(v\),让答案增加\(v\)
容易发现在这个过程中\(h_i\geq 0\)是恒成立的。
如果某个\(h_i=0\),由于割的性质,边\(i\)恰好有一个节点\(x\)包含在\(P\)中
设另一个节点为\(y\),我们把\(y\)加入集合\(P\)中。
每次过程至少会有一个\(h_i\)变为\(0\)并且被加入\(P\),所以这个过程不会死循环。
这样子我们得到了最短路的下界。
考虑证明我们得到了最短路。