线性规划学习笔记
线性规划学习笔记
1 线性规划
定义
定义 1.1 已知一组实数 ,以及一组变量 ,在这些变量的一个线性函数定义为 。
等式 ,不等式 , 统称为线性约束。
称满足所有限制条件的解 为可行解,使目标函数达到最优的可行解为最优解,所有可行解构成的区域为解空间。
线性规划的性质
定义 1.2 标准型
标准型线性规划要求满足如下形式:
最大化 ,满足约束 ,。
所有线性规划问题都可以用标准型描述。
对于无限制的变量 ,可以拆成两个变量 ,使得 。
标准型可以用矩阵表示。
为了方便地求解线性规划,需要所有约束都是等式。
定义 1.3 松弛型
松弛型线性规划要求满足如下形式
最大化 ,满足约束 ,。
标准型转化为松弛型是容易的。
由于每一个线性不等式的解空间都是一个凸型区域,所以整个解空间也是一个凸型区域。
所以只有一个局部最优解,因此使用一个类似爬山的算法就不用担心停滞在局部最优解。
所以就引出了单纯形法。
2 单纯形
算法描述
其核心是转轴操作,即变量的代换。
首先有一些定义:
基变量: 在松弛型等式左侧的所有变量。
非基变量: 在松弛型等式右侧的所有变量。
单纯形算法有两个主要的操作:转轴操作以及 simplex 操作。
而转轴操作的作用是选择一个基变量 以及一个非基变量 ,将其互换(称这个非基变量为 换入变量,基变量为 换出变量)。
具体地,一开始有 ,那么 。
当然,在选择 的时候要保证 。
simplex 操作是单纯形法的主过程,从一个基本解出发,经过一系列转轴操作达到最优解。通过选择特定的换入变量以及换出变量,可以使得每次转移操作都能使目标函数增大,直到达到最优解。
即进行一次转轴后,我们也同步的将新的等式带入其他等式,然后带入我们最大化的式子,常数项显然就是我们当前维护的松弛型线性规划基本解对应的答案。
如目标函数有正的系数,那么就意味着目标函数有可能可以被进一步增大,所以我们就持续进行转轴操作直到所有系数为负。
而 转轴 操作对换入和换出变量的选取,每次选择一个在目标函数中系数为正的增大,令其为换入变量,然后考虑增大他,但增大往往有限制,我们在这些限制中选一个最紧的限制,令其基变量为换出变量,然后进行代换。
如果我们无法找到约束条件,说明这个线性规划是无界的。
关于初始化,有时候我们可能无法通过将所有非基变量赋为 达到寻找初始解的目的。
我们可以通过引入一个辅助线性规划:
最大化
满足约束 ,。
容易发现,这个线性规划的最优解中 ,而达到之后,这一定构成原线性规划的可行解。
我们不能通过全部赋为 得到可行解,说明 中存在负数。我们找到最小的一个 ,对第 个约束做转轴。
之后,第 个约束变为 ,显然满足 。
其余约束变为 。显然 。
操作之后,辅助线性规划就有一个将非基变量赋为 的基本解,然后对其 simplex 即可。
单纯形法的时间复杂度
不是多项式算法,但很快,不说了。
但一般线性规划问题可以在多项式复杂度解决。
3 对偶问题
论文的引入中给出了一个有意思的现象,我们尝试去用我们限制中的不等式去拟合我们的目标式子,然后可以将最小化转化为最大化的线性规划问题。
举个论文中的例子:
考虑下面的线性规划:
最小化
满足约束:
这个可以变换成如下样子:
然后我们的目标就是在满足相关限制的情况下最大化 ,惊喜地发现这也是个线性规划问题:
最大化
满足约束
我们称初始的线性规划为 原问题,新得到的线性规划为 对偶问题。我们对对偶问题再对偶一次其实就是原问题。也就是说一个最大问题可以对偶成最小问题,最小问题也可以对偶成最大问题。
下面给出形式化定义:
**定义6.1 ** 对偶问题
给定一个原始线性规划:
最小化
满足约束 ,。
定义它的对偶线性规划为:
最大化
满足约束 ,。
结合引子中的例子,这是容易理解的。
线性规划对偶性
哦,这一段论文阐述了这个对偶过程正确性。我知道它很正确啦!
互松弛定理: 若 分别是原问题及对偶问题的可行解,那么 都是最优解 当且仅当 下列两个条件被同时满足:
- 对于所有 满足 或 。
- 对于所有 满足 或 。
一些经典问题的对偶
网络流最大流
这个可以由线性规划对偶直接得到。
定理:网络流最大流等于最小割。
二分图最大权匹配问题
我确实会推导力!
定理 在一张带权二分图中,最大权匹配等于最小顶标和。
定理 二分图中,最大匹配数等于最小点覆盖数。
一般来说,我们倾向于将最小顶标和转化为最大权匹配。
例题
「SHOI2004」最小生成树
一条非树边的权值必须大于与其形成圈的树边的权值,以此形成做限制形成对偶。
这实际上就是一个二分图最小顶标和问题,可以转化成二分图最大权匹配。
Orz the MST
这个与上道题很像,可以直接一样列出线性规划,然后就可以写出对偶式子,根据对偶式子可以直接建出最大费用可行流的模型了。
数据范围有点大,大概要使用势能dij。
「ZJOI2013」防守战线
容易发现,这个题目直接就是一个线性规划的形式,对偶完之后好看了一些,直接可以拆点费用流处理。
「BZOJ1283」序列
感觉会是一个典题。
先写出一个线性规划的形式,然后就可以直接扫一遍贪心力!
为什么不对捏。哦,原始线性规划少条件了。
对偶完其实就和志愿者招募是一样的,你说的对,但我网络流建图不太会了。
去复习了一轮!
「ZJOI2020」序列
条件是恰好变成 。
先直接构造线性规划。首先会有 个变量。形成 个等于的限制,最小化变量和。
线性规划感觉还是用笔做着舒服。
对偶完只剩下 个变量,但这些变量的取值很抽象。
也不是那么抽象,因为一些特殊区间的限制,每个位置的取值变成了 ,因为不能更大,更小也没有意义。
考虑 套 ,维护三个最大后缀和,显然取值范围是 。于是就可以计算最大贡献。
线性规划是强大的。
「雅礼集训 2018 Day8」B
安装时间其实是这个有向无环图的一条最长路。这意味着所需时间其实很难描述。
这个最长路大概也可以用线性规划描述。就是按照边和每个软件包的结束时间描述,建立超源超汇即可表示答案。
于是我们就得到了一个有 个变量的线性规划。不妨将其对偶一下。对偶完有 个变量。
考虑二分那个单独存在的不等式的系数,那是不是可以构造费用流?
特别扭曲的形式。换个办法,我们二分最小的时间,计算最小的代价。
然后给线性规划对偶一下就可以容易地进行费用流的构建。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2022-06-25 Educational Codeforces Round 128 (Rated for Div. 2)
2022-06-25 Easy Sum