组合优化 学习笔记
第一部分:定义优化问题:考虑一个点,它在维空间内。
有若干个限制
我们需要最小化,是一个函数。
当(是常数),就把称为关于的仿射(affine)函数(例子:),当就把称为线性(linear)函数0
当全部都是仿射函数,那么就把这个系统称作线性规划(linear program)。
线性规划可以最大化,把取反即可。
这个系统也可以包含大于号和等于号。
例子:
优化问题有可能有多阶段:
考虑如下问题:某公司在接下来个月内每个月需要提供升油。
公司有一个油箱,最多能储存升油,公司第一个月有升油
每个月的油价为,求最小代价。
假设第个月剩余油量为,每个月买了升油
有关系式,
注意不是,因为此时没有被考虑到。
根据题意能够列出关系式
最小化
如果我们要最小化,那么由于是非线性的,不能使用原方法。
可以引入辅助变量,加入条限制,最小化
在最优解中一定等于,因为如果,我们一定可以减小。
同理假设我们要最小化,那么可以拆成,然后使用上面的方法即可。
第二部分:整数规划
当点必须是整点,那么这个问题就整数规划问题。
普通线性规划问题有快速算法,但是整数规划问题是NP的。
定义混合整数规划:在混合整数规划中,变量既可以是实数,也可以是整数。
整数规划的第一个例子是01背包问题:
假设每个物品的重量是,价值是,总重量限制是
我们显然可以列出限制
最大化。
有4种整数规划建模的常用方法:
第一种:权值拆点
使用拆点法,假如某个变量的取值范围为,那么可以拆出限制表示的权值是否为
比如数独问题中,假设一些格子的权值已经被给定,求这个系统是否合法。
可以对于每个格子拆出个点,表示第个格子取。
显然。
并且假设格子的权值必须要为,那么
我们要考虑每行,每列,每个方格内每种数必须能且只能出现次的限制。
所以对于第行,对于所有权值,
对于每列,每个方格同理。
第二种:用0/1变量
假如有规定:对于限制至少要满足个
用变量表示第个限制是否被满足。那么
对于每个限制,加入新的限制
容易发现这也是整数规划。
这样当这条限制就相当于没有,就相当于
特别的,如果我们要表示最多只能选个,那么我们可以加入限制
第三种:使用和为
例子:在背包问题中,假如我们选择的物品的重量限制为若干个整数(比如只能为20,200,2000),可以用变量。
考虑表示当前物品的重量为,显然
并且加入限制即可。
第四种:拆物品
假设我们第一个物品的价值是,但是当选的物品个时价值是
可以拆出一个新的物品,价值是,第一个物品限选个。
新的物品不一定需要在第一个物品选了个时被选择,但是由于第一个物品的价值更高,肯定先选第一个物品。
第三部分:最短路与整数规划。
引入割的概念(这个概念在OI中通常会在网络流中遇到)
定义为集合的割集。
上文中所提到的必须包含源点,且不包含汇点。
有定理:如果是的子集,并且每一个割集都至少包含的一条边,那么会包含到的一条路径。
使用反证法证明,假设通过无法到达,设为通过这些边所能到达的集合。
考虑某点,不属于而且与的某个点相邻。
设某割集只包含,那么根据割和连通性的定义,其不包含的任何一条边,矛盾。
事实上每条路径都与所有割相交。
因为假设存在一个割与路径不相交,考虑这条路径
根据割的定义在同一个集合内,然而割的定义是在不同集合,矛盾。
于是可以考虑建模:设是这张图的某个割,为这些割构成的集合
将每条边作为一个变量。
那么
同时有限制
要最小化
注意当,可以把变为,此时更小而且还满足要求。所以此模型自动满足
第四部分:线性规划无解性的判断
为了判断线性规划(非标准型)的无解性,我们首先需要把带不等号的线性规划转换成标准等式型(Standard Equality Forms)。
可以使用如下2种方法:
1.考虑限制,加入松弛变量变成
是显然成立的。
2.如果线性规划对于某变量没有大于等于的限制,可以新增两个变量,让
转化后的线性规划是等价(equivalent)的,这说明如果某个线性规划无解,那么另一个线性规划也无解。
而且如果每个变量在所有等式中恰好总共出现次,那么可以使用费用流求解。
通过某个线性规划的解可以构建另一个线性规划的解。
设转化后的线性规划是,无解分为以下两种情况:
1.不可能成立(infeasible)
判断它的充要条件是:存在一个向量使得但是
原因是是对的每行的等式进行若干次加减法操作所得到的一个新的和相关的等式。
假设它是,就是
由于,,所以必须成立
但是在此情况下,矛盾。所以不可能有解。
2.不存在最优解(Unbounded)
注意:在应用这个定理时,我们要先证明线性规划有解。
判断它的充要条件是:存在向量使得,
并且需要存在解
原因:考虑反证法,假设最优解是
的意义是:(是任意正常数)一定满足
而且由于,,与最优解是矛盾。
上面我们只证明了这两个定理的充分性,关于必要性的证明需要用到一些对偶的知识
第五部分:寻找线性规划的任意解
我们可以找到的一组基(Basis)。
基是的一个大小为的子集,该集合在矩阵中的列线性无关。
定义:只考虑中对应的列的矩阵,:只考虑中对应的列的矩阵
例子:考虑线性规划
就是一组基,因为线性无关
定义线性规划在某组基下的标准形式:
1.
2.对于所有,定义转化后的是。
转化后的线性规划最优解和原线性规划相等,并且一样有解。
如果我们令基外的元素都为,那么
因为,我们容易得到一组解
称其为基础解。
考虑如何转化成标准形式:
第一步考虑方程,将转化为使得,这可以通过将方程两边乘以得到
这也说明由于唯一,且基所对应的列线性无关,所以方程的解唯一,一组基对应的基础解也是唯一的。
第二部我们可以找到一个向量(是常数),
根据1显然有,
令,
解得
让作为新的目标函数的常数,作为新的目标函数要最大化的对象即可。
第六部分 单纯形算法
单纯形算法可以在指数级时间内求解线性规划。
虽然最坏情况下是指数级时间,但是大部分情况下跑不满,在现实生活中够用。
线性规划的求解事实上存在多项式时间算法,在后面会提到
首先找到一组基和一组基础的解。
然后把线性规划转化成下的标准形式
现在我们考虑在基中新增一个元素(需要枚举),并且不属于基内。
保持基外除了以外的元素都等于。
比如我们有解,新增,那么
假设。那么有
新的方程。
这就是把原线性规划转化为标准型的好处:
由于,我们容易得到一组解
由于,而且基外除了以外的元素都等于,所以,我们可以快速求得目标函数值
当,我们可以通过增大的方式寻找最优解
新的解告诉了我们的范围,设
假如这些限制并没有规定的上界(比如我们有限制),那么单纯形算法会报告线性规划没有最优解并且推出。
否则我们可以让取到上界。
此时某个会变成,在基内可以删除某个。
例子:考虑线性规划
的一组基和基础的解
考虑加入,令
那么有。那么有
由于基外的元素(除了)的值都为,(在基内)
,我们要最大化。显然最优。
此时,在基中删除增加。
得到新的基础解。
对新的基求解线性规划的标准形式,并且重复以上过程,直到某次循环后,或者算法报告线性规划没有最优解。
将得到的基础解乘以数组再加上常数即可得到最优解。
假设线性规划运行过程中,我们每次得到的基础可行解的权值都是严格递增的。
由于相同基对应的基础可行解的权值是相同的,所以我们不会访问相同的基。
但是我们每次的增量可能为,所以如果不对线性规划的运行过程加以一定的限制,我们可能会访问相同的基。
但是在实现时遵循以下2个规则就不会死循环了:
1.如果对于多个元素加入当前的基都能比现在的解更优,则加入最小的那个。
2.如果对于多个元素可以从当前基删除(即该元素的值等于),那么删除最小的那个
对于该规则的证明超出了文章的范围
在实现时,需要不断移除线性相关的限制,使得所有限制线性无关。
通过单纯形算法,我们可以得知线性规划基本定理:一个线性规划或者无界,或者无解,或者存在最优解。
第7部分:2阶段单纯形算法
前面的算法首先要求出线性规划的某个基础可行解才能运行。
所以我们需要首先求出线性规划的
所以线性规划有如下性质:
1.如果线性规划有解,那么一定有基础可行解。
2.如果线性规划有最优解,那么一定有是基础可行解的最优解。
第8部分:线性规划和单纯形算法的几何意义
考虑线性规划的标准不等式形式:
某个限制给出了一个向量和一个常数,要求
解所存在的区域是若干个半超空间的交。
定义超空间的线段/直线:假设有两个点,一个实数
定义点之间的加法,数乘和向量的加法,数乘相同。都是坐标之间相加/坐标乘以一个数。
直线上的所有点满足存在使得
所构成线段上的所有点满足存在使得,并且
定义凸集:一个集合使得中任意两个点的线段上的所有点都被包含。
定义凸集的极值点:对于凸集的某点,不存在凸集内两个不同的点使得在上
凸集的性质:
1.若干个半超空间的交是凸集。
证明:考虑某个限制,点满足该限制。
那么考虑
有
由于
那么有,所以也满足该限制。证毕。
2.极值点一定是某线性规划的最优解。
证明:反证法
如果凸集的某点存在凸集内两个不同的点使得在上
设目标函数为,
如果(),那么有,所以此时取或者一定不会更劣。
3.定义
4.对于某在SEF的线性规划,其所有基础可行解就是该线性规划的极值点。
事实上在单纯形算法中,在某组基下求得就是若干个平面的交点
也就是说单纯形就是在这个凸集的顶点上进行的爬山算法。
如果线性规划只有个变量要最优化,那么凸集在平面上就是凸包,可以使用二分求解线性规划的最大/小值。
第9部分 最短路算法
考虑前面提到的最短路的整数规划。
定义线性规划的整数松弛:去掉权值必须是整数的条件。
去掉后的最优解可能会更小(或者相等)。
将该线性规划进行对偶可以得到:
设变量,如果解是合法的,那么
初始数组为,
Dijkstra算法的过程如下:维护一个集合,初始只包含源点。当包含汇点时过程结束。
定义为集合的割集。
每次考虑,不断增大使得解仍然合法。
考虑中的某条边,如果增加了,那么也会减少。
所以的最大增加量为,让等于这个值,并且让所有的值都减少,让答案增加
容易发现在这个过程中是恒成立的。
如果某个,由于割的性质,边恰好有一个节点包含在中
设另一个节点为,我们把加入集合中。
每次过程至少会有一个变为并且被加入,所以这个过程不会死循环。
这样子我们得到了最短路的下界。
考虑证明我们得到了最短路。
第10部分:弱对偶原理
弱对偶原理可以帮助解决包含小于号,等于号,大于号的线性规划。
假设有两个线性规划,并且线性规划有解。
小于或者大于或者没有限制。
,
小于或者大于或者没有限制。
设为满足的构成的集合,为满足的所构成的集合,为满足的构成的集合。
设为满足的构成的集合,为满足的所构成的集合,为满足没有限制的构成的集合。
设是第一个,第二个线性规划的特解。
那么
假设,那么
所以对于,对于,对于没有限制
这就是线性规划的互补松弛定理。
对于,对于,对于
并且有第一个线性规划的任意解的目标函数小于第二个线性规划的任意解的目标函数。
一个线性规划的对偶的对偶还是原线性规划。
第11部分:强对偶原理
事实上原线性规划的最优解(假设这两个线性规划都存在解)和对偶线性规划的最优解是相同的。
证明:假设某线性规划在SEF下,运行了2阶段单纯形算法。
如果某线性规划不是SEF,那么可以使用前文提到的方法转化成SEF。
考虑原线性规划,它的对偶是
假设某组基是最优解对应的基。
考虑把原线性规划重写成关于的标准形式
并且我们知道由于是最优的解的基,所以,所以是对偶线性规划的合法解。
并且,,所以
而且是对偶线性规划解的目标函数,与原线性规划的目标函数相等。
所以根据弱对偶定理,也是线性规划的最优解,所以原线性规划的最优解等于对偶线性规划的最优解。
通过这些分析,我们可以证明如下2个定理:
1.如果原线性规划无界,那么对偶线性规划无解。
(同理有如果对偶线性规划无界,那么原线性规划无解)
考虑这个东西的逆否命题:如果对偶线性规划有解,那么原线性规划有界。
由于对偶线性规划的任何解都大于等于原线性规划的任何解,原线性规划的解的目标函数有上界。
注意如果原线性规划无解,那么对偶线性规划也可能无解
(例子有:线性规划)
2.如果两个线性规划都有解,那么都有最优解。
考虑原线性规划的某一个解的目标函数的值,那么对偶线性规划的所有解的目标函数都大于,所以对偶线性规划的最优解有下界,所以不是无界的,根据线性规划基本定理,对偶线性规划有最优解。同理原线性规划也有最优解。
第11部分:判断线性规划最优性的条件
我们可以使用互补松弛定理判定线性规划与对偶的某组解的最优性。
当前面线性规划的,我们知道
由于我们假设,那么有
所以对于或者,对于,由于,所以无限制。
对于或者,对于,由于,所以无限制。
换句话说,在某线性规划中,其每个变量要么等于,要么其对偶线性规划的对应限制能取等。
(对于对偶线性规划的每个变量同理)
它的几何意义:如下只考虑在SEF下的线性规划
(对偶)
定义对于某线性规划的某解,如果某个限制满足,那么称其为紧限制。
考虑我们有紧限制。
那么是最优解的充要条件是存在,
证明:首先考虑互补松弛定理:当某个是最优解
那么对于第个限制,或者
先证明当存在,那么是最优解。
考虑的最优解,当$$
特别的,当没有紧限制时,当且仅当时是最优解。
第12部分:整数规划
整数规划是经典NP问题。所以人类对于整数规划的认知还非常有限。
和线性规划不同,整数规划可能有解并且有界,但是并没有最优解。
定义若干个点的凸包:最小的点集使得该点集是凸的,并且这个点集包含中的所有点。
可以证明如果整数规划中限制和目标函数的系数都是分数,那么凸包一定存在。
更准确的,凸包内的点由如下方法确定:我们考虑数组。
,那么凸包中的每个点都满足存在,
记点集的凸包是
凸包有如下性质:
1.对于某线性规划,考虑是其中整数点构成的集合
那么是个多面体,并且内的所有元素都是有理数。
2.考虑某整数规划P1,考虑是中整数点构成的集合
考虑另一个线性规划P2,该线性规划并不需要是整数。
那么对于P1,如果它无解/无界,那么也无解/无界。
P1的最优解也是P2的最优解。并且对于所有P2的最优解,如果它是极值点,那么也是P1的最优解。
对于以上两个定理的证明超出了本文的范围。
第13部分:切平面算法
对于整数规划,我们可以使用指数级算法切平面算法解决。
定义线性规划的松弛:假如我们有线性规划P1:,P2:,并且是的子集
那么我们有:
1.如果P2无解,那么P1无解。因为假如P2无解,那么是空集,那么由于是的子集,所以也是空集,所以P1无解。
2.如果P2的最优解也符合P1的条件,那么这个解是P1的最优解。
因为假设这个解不是P1的最优解,考虑P1的最优解,由于是的子集,这个解也是P2的解,而且比P2的最优解更优,矛盾。
3.P2的最优解是P1最优解的上界。
因为假设P1存在一个解使得其目标函数比P2的最优解高,由于是的子集,所以这个解也是P2的解,而且比P2的最优解更优,矛盾。
定义对于某组最优解的切平面:最优解不满足,并且每个线性规划的整数解都满足。
切平面算法的过程是:(假设线性规划已经被化为SEF)
我们首先将整数规划进行整数松弛,然后找到线性规划的最优解对应的基,把线性规划重写成这组基的标准型:假设为
如果都是整数,那么算法完成。因为我们的线性规划是整数规划的松弛,并且是整数解,符合整数规划的都要是整数的限制,所以根据前面的分析是最优解。
对于每个满足不是整数的限制,设第行的限制是
考虑切平面
由于,所以,
所以如果这个限制是切平面,那么必定不是整数。
假设不是整数(由于不全是整数一定存在)
然后考虑对于原线性规划的每组整数解一定满足
由于,对于所以,
所以,由于是整数,,所以原线性规划的整数解一定满足限制。
所以如果不是整数,那么必定为切平面
加入该限制,把整数规划重新转化为SEF然后继续进行切平面算法,直到最优解为整数为止。
可以证明:存在一种寻找切平面的方法使得上述算法一定会结束。但是证明它超出了本文的范围。
第14部分:非线性规划
第15部分:线性规划的内点法
在此部分我们介绍一种线性规划的快速算法:内点法
定义线性规划的内点:如果某个点是内点,则对于某线性规划的可行域,存在实数,使得这个点为中心半径为的超球被包含在内。
考虑在SEF下的线性规划,假设矩阵满秩,否则我们可以移除的若干行。
它的对偶线性规划:(是松弛变量)
根据弱对偶定理,对于原线性规划的任意解和对偶线性规划的任意解,
考虑我们通过某种方法得到了原线性规划,对偶线性规划和松弛变量的可行解,且是原/对偶线性规划可行域的内点,我们想要求出更优的解。
当时,都是原/对偶线性规划的最优解,所以我们考虑缩小。
我们知道
考虑求出一个方向,使得对于某个实数,是可行解,并且的差更小
所以
由于,所以
我们想让尽量小,所以考虑让它等于
所以对于所有,
的二次项很难处理,所以去掉,我们得到了
可以证明当矩阵满秩,都有唯一解。
原因:
第16部分:线性规划无解/无界性判断的证明
先考虑
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具