线性规划
定义
一般存在两种形式:标准型和松弛形。
标准型形如:
松弛形是由标准型转化而来的,当然也可以转化回标准型。
具体地,对于每条不等式添加辅助变量 \(x_{i + n}\),将不等式写成等式的形式:
一般地,对于 \(a = b\) 限制,我们将其看作 \(a \le b, -a \le -b\) 转化为标准型。
全幺模矩阵
以下三个条件同时满足的矩阵 \(A\) 我们称之为全幺模矩阵:
- 矩阵中只存在 \(-1, 0, 1\) 这三种数字。
- 矩阵中同一列中至多两个位置非 \(0\)。
- 能将行分为两个集合,满足 \(\forall i, j, k, A_{i, k} \ne 0, A_{j, k} \ne 0\) 若 \(A_{i, k} = A_{j, k}\) 那么 \(i, j\) 划分在不同集合,否则划分在相同集合。(这一条限制没有那么重要,下文可能将不存在该限制的矩阵也称之为全幺模矩阵)
引理
我们不加证明地给出(利用下文的单纯性法不难证明):
若标准型线性规划中 \(a\) 构成的矩阵为全幺模矩阵,那么该线性规划的最优解变量取到的一定为整数。
基本的例子
最短路
定义 \(d_i\) 为起点 \(s\) 到 \(i\) 的最短路。
最大流
定义 \(f_{u, v}\) 为 \(u \rightarrow v\) 的流量函数,为了方便我们加入边 \(t \rightarrow s\) 流量为 \(\infty\),同时要求源汇点流量守恒:
单纯性法
解决一般线性规划问题方法。
引理一
- 标准型线性规划的可行域为 \(n\) 维空间中的凸多边形
考虑使用归纳法,以三维空间中为例,多维空间中类似:
一条限制本质上是规定解在一个平面的一侧,也即将可行域削去一部分,易知不断消去凸多边形的一部分后还是凸多边形。
引理二
- 线性规划的解关于可行域的函数为单峰函数(可能有平台)
反证法,以二维线性规划为例:
假设存在两个峰 \((x_1, y_1, z_1), (x_2, y_2, z_2)\) 那么存在 \((x, y)\) 在两峰连线投影的平面上(可行域为凸多边形),满足该点在两峰连接直线上对应点为 \((x, y, z)\) 原本的函数值为 \(z'\) 有 \(z' < z\)。
又因为目标函数为线性函数,直线上的点位置线性变化,则有函数值也应该线性变化,所以应该有 \(z = z'\) 矛盾。
引理三
- 线性规划的最优解在可行域的边界上取到
反证法,以二维线性规划为例:
因为不在可行域的边界上,那么对于任意一个变量都可以自由加减。
若目标函数中存在系数 \(> 0\) 的变量,那么直接将其变大,矛盾;否则最优解唯一,全为 \(0\),处在边界上。
由引理二,不难得到一个初步的想法:不断调整解使得答案变大,迭代到不存在更优解为止。
那么存在两个问题:
- 如何找到一组初始解。
- 如何进行调整,并且判断不存在更优解。
为了方便起见,我们仅解决松弛形线性规划。
对于问题 \(1\) 若满足 \(\forall i \in [1, m], b_i \ge 0\) 那么可以直接令:\(x_i = 0(i \in [1, n]), x_{i + n} = b_i(i \in [1, m])\) 即可得到初始解。
若不满足 \(b\) 非负,暂时先不考虑,先解决 \(b\) 非负的情况。
在解决问题 \(2\) 之前,先引入一些定义:
一些定义
在松弛形当中,\(x_{1 \sim n}\) 出现在所有式子当中(包含目标函数),\(x_{n + 1 \sim n + m}\) 仅出现在一个式子当中,我们将所有限制变形为:
那么在所有等式当中 \(x_{n + 1 \sim n + m}\) 只出现在等式左侧且只出现一次并且不在目标函数当中,\(x_{1 \sim n}\) 只出现在等式右侧以及目标函数当中我们称 \(x_{n + 1 \sim n + m}\) 为基变量,\(x_{1 \sim n}\) 为非基变量。
同时因为 \(x_{1 \sim n}, x_{n + 1 \sim n + m}\) 的地位实际上是 等价 的,因此我们可以选择第 \(o\) 个式子,非基变量 \(x_e\) 满足 \(a_{o, e} \ne 0\) 将 \(x_e\) 看作基变量,\(x_{o + n}\) 看作非基变量,再将其他等式和目标函数中的 \(x_e\) 用等式右侧表示,这样就完成了基变量和非基变量的互换,我们称这个操作为转轴 \(pivot(o, e)\)。
同时,在转轴过程中本质上是将 \(x_e\) 卡到了上限,也就是达到了可行域边界上,这也是为什么这个过程叫做转轴的原因(从一个边界转到另一个边界)。
有了转轴操作和引理三,我们可以自然地联想到:
- 使用转轴操作进行调整,直到不存在方法继续转轴调整停止
此时我们发现,只需要找到 \(c_e > 0\) 的变量 \(x_e\),然后找到满足 \(a_{o, e} > 0\) 的 \(o\) 那么转轴 \(pivot(o, e)\) 则有:
因为一开始保证了 \(b_o > 0\) 所以将其带入目标函数时常数变大。
同时由于上述的策略,可知 \(\forall i, c_i \le 0\) 时达到最优,答案即为常数部分。
但这里存在两个问题:
- 可能 \(\forall o, a_{o, e} \le 0\)
- 转轴时将上式带入其他式子后我们无法保证其他式子常数项继续非负(上式常数项显然仍非负)。
对于问题 \(1\),可知此时 \(x_e\) 可取 \(+\infty\) 因此可以直接判断原问题无界。
对于问题二,我们发现只需 \(\forall i\) 满足:
移项(由之前的限制 \(a_{o, e} > 0\) 得 \(a_{i, e} > 0\) 否则一定可行)可得:
那么只需挑选 \(\frac{b_i}{a_{i, e}}\) 最小的 \(o \leftarrow i\) 即可。
回到一开始不保证 \(b_i\) 非负的限制,此时我们发现我们必须将原线性规划转化成另一个线性规划满足该线性规划 \(b_i\) 非负才能进行。
根据上面挑选最小的思路,我们直接考虑引入辅助线性规划:
那么如果 \(x_0 = 0\) 那么此时的一组解带入原问题也满足,否则显然原线性规划无解。
类似地,我们找到 \(b_i < 0\) 且最小的 \(b_o\),执行 \(pivot(o, 0)\) 此时所有 \(b_i \ge 0\) 即可进行之前所述说的流程。
执行完毕以后,我们需要把原线性规划转化为该线性规划,由于此时满足 \(x_0 = 0\),分以下两种情况讨论:
- 若 \(x_0\) 为非基变量,那么直接忽略 \(x_0\) 的限制(将 \(x_0\) 前系数置为 \(0\))即可。
- 否则,寻找合适的非基变量 \(e\) 进行转轴操作转化为 \(1\)。注意到此时最优解必然满足非基变量为 \(0\) 又 \(x_0 = 0\) 可得 \(b_i = 0\) 因此随意找一个 \(a \ne 0\) 的非基变量转轴即可(若不存在则可直接忽略该式)。
同时,由于转轴过程中目标函数也会改变,因此可以维护一个辅助数组以维护目标函数的变化。
事实上,单纯性算法单次 \(pivot\) 复杂度 \(\mathcal{O(nm)}\) 但总调用次数却是指数级的。
但在一般随机数据下表现优秀,调用次数可以达到低于 \(n + m\) 级别,因此通常可以跑 \(n, m = 3e2\) 左右的数据,更大范围也可以大胆尝试。
实现时不需要真的加入基变量,因为所有变量互相等价且基变量系数恒定,因此只需记录非基变量的系数即可。
若要输出方案,则还需记录基变量对应的原变量编号。
对偶原理
将线性规划描述成矩阵的形式:
两者最优解的答案相同。
此原理在线性规划当中十分通用。
互松弛定理
给出原线性规划和对偶线性规划最优解之间的关系。
- 若 \(x, y\) 分别为原问题及其对偶问题的可行解,那么 \(x, y\) 同为最优解 当且仅当:
- \(\forall 1 \le i \le n:x_i = 0\) 或 \(\sum\limits_{j = 1} ^ m a_{j, i} \times y_j = c_i\)
- \(\forall 1 \le i \le m:y_i = 0\) 或 \(\sum\limits_{j = 1} ^ n a_{i, n} \times x_j = b_i\)
通常在求解出对偶线性规划的最优解后通过限制导出原问题最优解的方案。
举例
最大流最小割
最小割可描述为:
最大流的对偶问题为:
令 \(h_u \leftarrow k_u - h_u\) 得:
此处不加证明地给出上述线性规划的最优解与最小割线性规划最优解相等。
二分图最大权匹配与最小标顶和
易得二分图最大权匹配线性规划:
易知该矩阵为全幺模矩阵,因此实数线性规划与整数线性规划结果相同。
其对偶问题:
即为二分图最小标顶和。
应用
一般线性规划
例1. precious stones(TCO08 round2 1000)
简化题意:有 \(n\) 个石头,第 \(i\) 个石头对 \(A\) 来说价值为 \(A_i\) 对 \(B\) 来说价值为 \(B_i\),现在需要将所有石头分给两个人(石头可以切割)。对于任意一个石头,每个人的收益为所得石头所占原石头的比例乘该石头价值。在两人收益相同的情况下最大化收益。
\(n \le 50, 0 \le A_i, B_i \le 100\)
令 \(A\) 获得第 \(i\) 个石头的 \(p_i\),那么该问题可以被描述为如下线性规划:
对于限制三,因为等价于 \(V_a \le V_b, -V_a \le -V_b\) 第二个式子常数项为负数,需要初始化,较为麻烦。
但仔细观察可以发现,因为要最大化 \(V_a\) 同时等式两侧线性变化,因此可以将限制放缩为 \(V_a \le V_b\) 这样就不需要初始化了。
一般地,需要初始化的题目往往能发掘性质使其不需要初始化。
例2. Flight Distance
简化题意:给出一张无向图 \(G = (V, E), |V| = n, |E| = m\) 边 \((u, v)\) 权值为 \(w_{u, v}\)。定义一次操作为:\(w_{u, v} \leftarrow w_{u, v} \pm \Delta w\) 花费为 \(\Delta w\),可以进行任意多次操作,满足操作完毕之后任意一条边 \((u, v)\) 满足 \(u \rightarrow v, v \rightarrow u\) 的最短路即为该边,最小化操作花费。答案以分数形式输出。
\(n \le 10, w_{u, v} \le 20\)
在将问题转化为线性规划中发现主要存在如下两个问题:
- 边的增量不好表示为负,因为线性规划要求所有变量非负。
- 不好限制最短路的条件。
问题 \(1\) 较为好解决,我们设置两个变化量 \(t_{u, v} ^ +, t_{u, v} ^ -\) 将每条边的边权描述为:\(w_{u, v} + t_{u, v} ^ + - t_{u, v} ^ -\) 即可。
问题 \(2\) 最暴力的方式可以将 \(u, v\) 间所有路径拿出来,那么限制次数上界为 \(\sum\limits_{i = 1} ^ n \dbinom{n}{i} \times i \le \left(\sum\limits_i ^ n \dbinom{n}{i}\right) \times n \le n \times 2 ^ n\) 不能接受。
考虑直接描述 \(u, v\) 之间的最短路,令其为 \(d_{u, v}\),那么原问题可以描述为以下线性规划:
更进一步地,第三条限制可以被描述为:
虽然两者限制次数理论上界均为 \(n ^ 3\) 但后者跑不满该上界,实际效率下更为优秀,可以通过本题。
同时,将该问题描述为标准型后,常数项并不非负。注意到目标函数系数非负,于是直接取对偶问题即可不需初始化。
线性规划的转化(组合意义)
线性规划转化为半平面交
通常用于只存在两个变量或两个限制条件(对偶后两个变量)的线性规划,此时一条限制为确定一个半平面,通过半平面交可得可行域对应凸多边形,同时目标函数只有两维可以直接在可行域上二分 / 三分。
例3. Equations
简化题意:给定三个长度为 \(n\) 的序列 \(a, b, c\) 以及 \(m\) 次询问,每次询问给定参数 \(s, t\),求一组非负实数 \(x\),满足:
的同时最大化 \(\sum\limits_{i = 1} ^ n c_i \times x_i\)。
\(n \le 10 ^ 5, m \le 10 ^ 4, 1 \le a_i, b_i, c_i, s, t \le 10 ^ 4\)
每次查询可以描述为如下线性规划:
注意到 \(a, b, c \ge 0\) 那么不妨将原限制放缩为:
只存在且仅存在两条限制,那么其对偶问题将只存在两个变量,即:
注意到一条限制本质上是一个半平面,那么该线性规划的可行域即为 \(n\) 个半平面的交,且该半平面交与询问无关,可以提前预处理。
根据之前单纯性算法中提到的引理,最优解必定在半平面交的边界上且目标函数为单峰函数。
因此可以三分求解,当然也可以直接二分凸包上的直线,复杂度 \(\mathcal{O((n + m) \log n)}\)。
线性规划转化为二分图最大权匹配
这类问题通常体现为线性规划的形式满足二分图最大权匹配的组合意义。
例4. [SHOI2004]最小生成树
简化题意:给定一张带权无向图,操作同例题 2,满足操作完成后指定的生成树为最小生成树,最小化花费。
\(n \le 50, m \le 1500, 1 \le w \le 1000\)
首先不妨做出题目所给的生成树,那么此时我们发现树边不会变大,非树边不会变小。
那么假设生成树上第 \(i\) 条边初始权为 \(a_i\) 那么其操作后应为:\(a_i - x_i\)
假设非生成树上第 \(i\) 条边初始权为 \(b_i\) 那么其操作后应为:\(b_i + y_i\)
使得该生成树为最小生成树的一个必要条件为:
- 对于任意的非树边 \((u, v)\) 其边权不小于生成树上 \(u, v\) 简单路径上的边对应边权。
同时也易证得该条件为充分条件,那么原问题可以被描述为如下线性规划:
令非树边构成集合为 \(Q\),树上 \(u, v\) 简单路径的边构成集合 \(path_{u, v}\),第 \(i\) 条非树边连接的两个点分别为 \(e_{i_u}, e_{i_v}\)。
整理限制得:
即为二分图最小标顶和问题,对偶后转化为求解二分图最大权匹配问题。
若使用 \(\tt zkw\) 费用流,复杂度 \(\mathcal{O(n ^ 2m ^ 2)}\);若使用 \(\tt KM\) 算法,复杂度 \(\mathcal{O(m ^ 3)}\) 效率差别不大。
当然,你也可以使用树链剖分 + 前后缀优化建图配合费用流,复杂度 \(\mathcal{O(nm ^ 2 \log n)}\) 意义不大。
上述三种做法均可以通过本题。
线性规划转化为网络流问题
这类问题的一般模型为限制矩阵为全幺模矩阵,利用网络流流量平衡的特殊性质进行建图。
例5. [NOI2008] 志愿者招募
简化题意:有 \(n\) 中志愿者,有 \(m\) 天需要志愿者工作,第 \(i\) 种志愿者在 \([s_i, t_i]\) 这个时间段工作,聘请一个这样的志愿者花费为 \(c_i\)。要求第 \(i\) 天至少存在 \(d_i\) 个志愿者,最小化招募的花费。
\(1 \le n \le 10 ^ 3, 1 \le m \le 10 ^ 4\)
假设第 \(i\) 种志愿者招募 \(x_i\) 个,容易得到原问题的线性规划问题:
但这个限制矩阵并不是全幺模矩阵,考虑将其转化为全幺模矩阵。
首先为了方便先将标准型转化为松弛形:
注意到每一列的非 \(0\) 位 均 在一个区间内出现,不妨考虑将式子差分。
即将第 \(i\) 条式子替换为第 \(i\) 条式子减去第 \(i - 1\) 条式子所得的式子。
为了保证统一性,我们在式子的末尾添加等式 \(0 = 0\) 同样进行差分。
那么 \(x_i(1 \le i \le n)\) 就会在第 \(s_i\) 条式子中以系数 \(+1\) 出现,在 \(t_i + 1\) 条式子中以系数 \(-1\) 出现。
\(x_{i + n}(1 \le i \le m)\) 就会在第 \(i\) 条式子中以系数 \(-1\) 出现,在第 \(i + 1\) 条式子中以系数 \(+1\) 出现。
此时限制矩阵即为全幺模矩阵。
因为每条式子需要保证左侧为 \(0\),可以看作一个点的流量平衡方程,于是对第 \(i\) 条式子建点 \(i\)。
将系数为 \(-1\) 的量看作流出边,系数为 \(+1\) 的量为流入边(包括常量)。
为限制变量在不同式子中取值相同,要求所有变量恰好在一个式子中以系数 \(+1\) 出现,另一个式子中以系数 \(-1\) 出现(符合全幺模矩阵的性质)。此时我们从系数为 \(-1\) 的式子向系数为 \(+1\) 的式子连流量为变量上界,费用为目标函数系数的边。
对于常量而言,若系数为 \(+1\) 那么从 \(S\) 向该式连费用为 \(0\) 流量为常量大小的边,否则从该式向 \(T\) 连费用为 \(0\) 流量为其绝对值的边。
那么我们只需保证常量流量流量流满的情况下最优化解即可,具体情况视题目而定。
具体的,在本题中的连边如下:
-
从 \(s \rightarrow i\) 连流量为 \(d_{i - 1}\) 费用为 \(0\) 的边,从 \(i \rightarrow T\) 连流量为 \(d_i\) 费用为 \(0\) 的边。
-
从 \(i + 1 \rightarrow i\) 连流量为 \(\infty\) 费用为 \(0\) 的边。
-
从 \(t_i + 1 \rightarrow s_i\) 连流量为 \(\infty\) 费用为 \(c_i\) 的边。
因为 \(s\) 点流出的只有常量流量,因此跑最小费用最大流即可。
例6. Chefbook
简化题意:给定一张 \(n\) 个点 \(m\) 条边的带权有向图。可以执行如下两种操作:
- 将一个点 \(u\) 的所有出边权值加上 \(p_u\),其中 \(p_u\) 可以为任意正实数
- 将一个点 \(u\) 的所有入边权值减去 \(q_u\),其中 \(q_u\) 可以为任意正实数
要求操作完毕后 \(\forall (u, v) \in E, s_{u, v} \le w'_{u, v} \le t_{u, v}\),最大化:\(\sum\limits_{(u, v) \in E} w'_{u, v}\) 并 输出方案
\(n \le 10 ^ 2, m \le n ^ 2\)
易得线性规划形式:
方便起见,直接忽略常量 \(w\) 的影响:
注意到每条式子 仅出现且恰好出现 系数 \(+1, -1\) 两个变量,不妨将其对偶:
此时情况与上一题一致,直接做类似的即可。
但原题需要输出方案,这里我们只能得到对偶问题的方案,需要近一步获得原问题的方案。
考虑一开始提到的互松弛定理,得到原方案和对偶方案的关系。
则有(对 \(g\) 类似):
-
若 \(f_{u, v} = 0\) 那么原线性规划只需满足:\(-p_u + q_v \le s_{u, v}\)
-
若 \(f_{u, v} > 0\) 那么原线性规划必须满足:\(-p_u + q_v = s_{u, v}\)
此时对原线性规划只存在限制而不存在目标函数,注意到每条限制只涉及两个数于是使用差分约束即可。