线性规划

不知道自己在干什么。

标准型

线性规划的标准形式通常写成:

\[\begin{cases} \max \mathbf{c}^{T} \mathbf{x} \\ A\mathbf{x} \le \mathbf{b} \\ \mathbf{x} \ge 0 \end{cases} \]

如果有变量 \(y\) 没有 \(>0\) 的限制则将其拆成 \(x_1 - x_2\) 就可以了。

对偶

标准型的对偶:

\[\begin{cases} \min \mathbf{b}^{T} \mathbf{y} \\ A^{T}\mathbf{y} \ge \mathbf{c} \\ \mathbf{y} \ge 0 \end{cases} \]

\(A\)\(B\) 的对偶,则 \(B\)\(A\) 的对偶。

原问题和对偶问题中变量和限制关系一一对应。

例子

线性规划 \(\max\{ \mathbf{c}^{T} \mathbf{x}:A\mathbf{x} = \mathbf{b} ,\mathbf{x} \ge 0\}\) 的对偶是 \(\min\{ \mathbf{b}^{T} \mathbf{y}:A^T\mathbf{y} \ge \mathbf{c}\}\)

这告诉我们某些取等的限制对偶之后就是没有限制。

弱对偶定理

对于原始问题的任意可行解 \(\mathbf{x}\) 和对偶问题的任意可行解 \(\mathbf{y}\),目标函数值始终满足:

\[\mathbf{c}^T \mathbf{x} \le \mathbf{b}^T \mathbf{y} \]

证明:

\[\mathbf{c}^T \mathbf{x} \le \mathbf{y}^T A \mathbf{x} \le \mathbf{y}^T \mathbf{b} = \mathbf{b}^T \mathbf{y} \]

这意味着任意一组对偶问题的可行解都是原始问题的上界。

如果原始问题的解无界(解是正无穷),那么对偶问题无解,反之亦然。

强对偶定理

如果原始问题和对偶问题中任意一个存在有限的最优解,那么另一个也必然存在有限的最优解,并且它们相等:

\[\mathbf{c}^T \mathbf{x} = \mathbf{b}^T \mathbf{y} \]

不会证明。

全幺模矩阵

一个矩阵的任意子式的值都是 \(-1,0,1\),那么就叫他全幺模矩阵。

如果线性规划的限制是全幺模矩阵,并且其他的参数都是整数,那么一定存在整数最优解。

常见的网络流等线性规划问题的约束都是全幺模矩阵。

几何意义

没学会,看不懂。

其他意义

AI 给我讲了很多东西,可惜我水平不足,没有看懂。

互补松弛定理

假设 \(\mathbf{x}\) 是原始问题的可行解,\(\mathbf{y}\) 是对偶问题的可行解。它们是最优解的充要条件是,对于所有的变量,以下等式成立:

\[\mathbf{x}^T (A^T \mathbf{y} - \mathbf{c}) = \mathbf{y}^T (\mathbf{b} - A \mathbf{x}) = 0 \]

意思就是说。任意一个原问题中的变量/限制,和对偶问题中的限制/变量,肯定有一个是紧的。

证明:

\[\mathbf{b}^T \mathbf{y} - \mathbf{c}^T \mathbf{x} = \mathbf{x}^T (A^T \mathbf{y} - \mathbf{c}) - \mathbf{y}^T (A \mathbf{x}- \mathbf{b}) \]

根据强对偶定理,左式 \(=0\),因此右式也 \(=0\)。右式两项一非负一非正,因此都是 \(0\)

原始‑对偶方法

大概就是,先求出对偶问题的一个可行解,然后尝试找到满足互补松弛定理的原问题的解。如果找到就完成了,否则调整对偶问题的解。

现在有线性规划 \(P : \min\{\mathbf{c}^T \mathbf{x}: A\mathbf{x} = \mathbf{b} \ge 0,\mathbf{x}\ge 0\}\),它的对偶问题是 \(D: \max\{\mathbf{b}^T \mathbf{y}: A^T \mathbf{y} \le c\}\)

这里写成等式的形式是为了更加方便,和上面的形式并没有区别。

先随便找出一组 \(D\) 的可行解 \(y\),我们找到紧的限制构成的集合:

\[I = \{i:(A^T \mathbf{y} - c)_i = 0\} \]

根据互补松弛条件,如果找到 \(P\) 的一组可行解 \(x\) 满足 \(x_i > 0\) 仅在 \(i \in I\) 时成立,那么我们就找到了一组最优解。因此我们考虑问题 \(RP:\min\{\mathbf{1}^T \mathbf{s}: A\mathbf{x} + \mathbf{s} = \mathbf{b},\mathbf{x}\ge 0,\mathbf{s} \ge 0,\forall i \notin I,x_i = 0\}\)

这里我们引入了一组松弛变量 \(s\),可以找到合法的 \(x\) 当且仅当 \(s\) 取到全 \(0\)

写出他的对偶问题 \(DRP: \max\{\mathbf{b}^T \mathbf{y}:\forall i \in I, \sum\limits_{j}A_{j,i}y_j \le 0 ,\forall i, y_i \le 1\}\)

假设我们求解出了 \(DRP\) 的一组解 \(y^{\prime}\),显然如果算法没有终止,那么 \(\mathbf{b}^T\mathbf{y^{\prime}} > 0\)

我们尝试令新的 \(y\)\(y + \varepsilon y^{\prime}\),根据 \(DRP\) 的限制,\(\varepsilon\) 一定可以取到一个正的值使得对偶问题的限制仍然满足,这样就让答案变大了。这个值可以简单计算出来。如果 \(\varepsilon\) 没有上界那么对偶问题无界,原问题无解。\(I\) 对应变化,就这样求解下去。

随着算法的进行,\(RP\) 的最小值一定是单调递减的。因为 \(I\) 中会逐渐加入新的元素,而被踢出的元素,即 \(\sum\limits_{j}A_{j,i}y_j < 0\)\(i\),根据互补松弛定理,\(x_i\) 一定是 \(0\),因此没有影响。并且 \(RP\) 问题的答案只由 \(I\) 决定。因此算法只会迭代 \(2^n\) 次。

至于怎么求 \(RP\) 或者 \(DRP\) 的答案……具体问题具体分析吧,\(RP\) 问题看起来已经很简化了。

其实这个东西用处并不大,大部分时候只需要考虑何时/如何满足互补松弛条件就可以了。

原始-对偶的应用

Dijkstra

Dijkstra 其实就是流量为 \(1\) 的费用流。

费用流

我们写出费用流的线性规划形式:

\[\begin{cases} \min \sum_{(u,v) \in E} c_{uv} f_{uv} \\ \sum_{v} f_{vu} - \sum_{v} f_{uv} = b_u \quad \forall u \in V \\ f_{uv} \le U_{uv} \quad \forall (u,v) \in E \\ f_{uv} \ge 0 \quad \forall (u,v) \in E \\ \end{cases} \]

对偶得到:

\[\begin{cases} \max \sum_{u \in V} b_u p_u - \sum_{(u,v) \in E} U_{uv} \gamma_{uv} \\ p_v - p_u - \gamma_{uv} \le c_{uv} \quad \forall (u,v) \in E \\ \gamma_{uv} \ge 0 \quad \forall (u,v) \in E \end{cases} \]

定义一条边的折合费用为 \(c^p_{uv} = c_{uv} - p_v + p_u\),则有限制 \(\gamma_{uv} \ge -c^p_{uv}\)

\(U\) 全部为正,也就是说,\(p\) 确定之后,\(\gamma_{uv} = \max(0, -c^p_{uv})\)

另外,建出的反边 \(c^p_{vu} = -c^p_{uv}\)

考虑互补松弛条件:

  • \(c^p_{uv} > 0\)\(\gamma_{uv}\) 一定为 \(0\),也就是 \(\gamma_{uv} \ge -c^p_{uv}\) 一定无法取等,这意味着对应的 \(f_{uv} = 0\)
  • 如果 \(\gamma_{uv} > 0\),则必定有 \(f_{uv} = U_{uv}\),也就是说如果 \(c^p_{uv} < 0\) 边必然满流。

有了这些结论我们就可以知道:在残量网络中,一组流量是最优的(最小费用),当且仅当存在一组节点势 \(p\),使得残量网络中的所有边(包含正向和反向)满足 \(c^p \ge 0\)

费用流的原始-对偶算法就是在不断增加流量的同时更新节点势 \(p\),使其一直保持 \(c^p \ge 0\)

初始的时候如果全是正权就可以把势能设为全 \(0\),有负权则必须跑一边 SPFA 求出 \(d_x\) 作为势能。

每一轮根据前面的条件我们只能够选择 \(c^p_{uv} = 0\) 的边增广,并且新产生的反向边 \(c^p_{vu}\) 同样 \(= 0\),不违反互补松弛条件。但是不一定有这样的增广路径,这就需要我们更新势能使得他有一条增广路径。直接以 \(c^p\) 为边权跑最短路,令 \(p_i = p_i + d_i\),令 \(c^{p^{\prime}}\) 为新的折合费用即可。新的边权仍然满足 \(>0\)

\[c^{p^{\prime}}_{uv} = c_{uv} + p^{\prime}_u - p^{\prime}_v = c_{uv} + p_u + d(u) - (p_v + d(v)) = c^p_{uv} + d(u) - d(v) \ge 0 \]

感觉这像是凑出来的,但是为了维持 \(c^p_{uv} \ge 0\),我们必须这样改变势能。设 \(p_i\) 的变化量为 \(\Delta_i\),有有限制 \(c^p_{uv} + \Delta_u - \Delta_v \ge 0\),也就是 \(\Delta_v \le c^p_{uv} + \Delta_u\),这就是最短路的限制。

一些例子

P3337 [ZJOI2013] 防守战线

\(p_i\)\([1,i]\) 中的塔的数量,那么写出线性规划:

\[\min \sum_i{p_i(C_i - C_{i-1})} \\ p_{i+1} - p_i \ge 0 \\ p_{R_i} - p_{L_{i-1}} \ge D_i \]

整理一下可以写成:

\[\min \sum_i{p_i(C_i - C_{i-1})} + \sum_i \infty \max(0,p_{i} - p_{i+1}) + \sum_i \infty \max(0,D_i - p_{R_i} + p_{L_{i-1}}) \]

也就是说我们不用对偶这个线性规划把它写成费用流形式,可以直接改写成费用流的对偶形式,这样更方便一点。

P3980 [NOI2008] 志愿者招募

\[\min \sum_i{p_ic_i} \\ \sum_{l_j \le i \le r_j} p_j \ge a_i \\ p_i \ge 0 \]

对偶得到:

\[\max \sum_i q_i a_i \\ \sum_{l_j \le i \le r_j} q_i \le c_j \\ q_i \ge 0 \]

\(q\) 做前缀和,和上一个题一样了。

其实就是说原形式就可以直接费用流。

Codechef CHEFBOOK

题意:有一个 \(n\) 个点 \(m\) 条边的有向图,每条边有初始权值 \(w_i\) 和目标权值 \([L_i,R_i]\)。要给每个点钦定两个非负权值 \(a_i,b_i\) 使得每条边的新权值 \(w^{\prime}_{x,y} = w_{x,y} + a_x - b_y\) 落在目标范围内,在满足这个限制的情况下使得所有边的新权值和最大。

\(out_i,in_i\) 分别为点 \(i\) 的出度,入度。

写出线性规划:

\[\max \sum a_i out_i - b_i in_i \\ L_{x,y}- w_{x,y} \le a_x - b_y \le R_{x,y} - w_{x,y}\\ a_i,b_i \ge 0 \]

直接得到原线性规划就是:

\[\max a_i out_i - b_i in_i + \sum \infty \max(0,L_{x,y} - w_{x,y} - a_x + b_y) + \infty \max(0,a_x - b_y - R_{x,y} + w_{x,y}) \]

就是一张二分图。本题要求构造方案,直接跑原始对偶得到的势能数组就是费用流的对偶问题,也就是原问题的答案。原因前面已经说明。

P6631 [ZJOI2020] 序列

\(S\) 是所有可以修改的集合构成的集族。

那么原问题可以写成:

\[\min \sum_{T\in S} x_T\\ \sum_{T \ni i}x_T = a_i\\ x_T \ge 0 \]

对偶之后得到:

\[\max \sum_{i} a_ib_i\\ \forall T,\sum_{i\in T}b_i \le 1 \]

我们假设 \(b_i\) 可以全部取整数(我也没搞明白为什么,不过我也没找到什么全部取整数的证明,限制矩阵并不是全幺模的)。发现 \(b_i \in \{-1,0,1\}\)(取 \(>1\) 不符合条件,取 \(<-1\) 不优),直接 DP,记录此时三种操作对应 \(\sum b_i\) 后缀最小的 \(T\) 就可以了。时间复杂度 \(O(n)\)

参考资料

posted @ 2026-07-04 10:34  KIreteria  阅读(18)  评论(0)    收藏  举报