线性规划学习笔记

线性规划基本概念

我们生活中的资源大部分是有限的,而我们又希望能让利益最大化(比如背包问题)。此时,如果我们可以把目标描述为一个依附于某些变量的线性函数,而限制又可以转化成这些变量之间的等式与不等式关系,那么这就是一个线性规划问题,我们可以用线性规划相关知识求解。

形式化地讲,我们已知一组实数 \(a_1, a_2, \dots, a_n\) 和一组变量 \(x_1, x_2, \dots, x_n\),那么我们现在定义这些变量上的一个线性函数 \(f\)\(f(x_1, x_2, \dots, x_n) = \displaystyle\sum_{j = 1}^n a_j x_j\)

现在再给出一个实数 \(b\),如果 \(f(x_1, x_2, \dots, x_n) = b\),那么我们就称这是一个线性等式;如果 \(f(x_1, x_2, \dots, x_n) \leq b\)\(f(x_1, x_2, \dots, x_n) \geq b\),那么就称这是一个线性不等式。我们称满足所有线性等式和线性不等式的一组 \(x_1, x_2, \dots, x_n\) 为一组可行解,记为 \(\overline x\)

于是,线性规划要做的,就是在若干个线性等式和线性不等式的约束下,求出另外一个线性等式的最大(小)值。此时,我们就称这个线性等式为目标函数,显然,将一组可行解带入目标函数可以得到一个值,这个值就叫做目标值,记为 \(z\),而我们所求的最大(小)值就叫做最优目标值

线性规划也可以从几何的角度来理解。根据我们对于斜率优化的理解,所有可行解表示在 \(n\) 维空间中,应该是一个凸包的形式(具体证明在讲了标准型与松弛型后再来证明),这个区域就叫做可行区域。而每一个限制表示在 \(n\) 维空间中的一个 一次函数。那么我们要求的目标函数的最大值也可以理解为这条直线切凸包的最大值。

这里我们再来定义两个线性规划等价的概念。对于两个要使得目标函数最大化的线性规划 \(L\)\(L'\),如果对于 \(L\) 的每一个目标值为 \(z\) 的可行解 \(\overline x\),都存在一个与之对应 \(L'\) 的目标值为 \(z\) 的可行解 \(\overline x'\),且对于 \(L'\) 的每一个目标值为 \(z\) 的可行解 \(\overline x'\),都存在一个与之对应 \(L\) 的目标值为 \(z\) 的可行解 \(\overline x\)(也就是它们的值域是完全一样的),那么我们就称 \(L\)\(L'\) 等价。

此外,如果 \(L\)\(L'\) 是两个要使得目标函数最小化的线性规划,那么等价的定义要稍加变化,那就是它们的值完全对称,才称 \(L\)\(L'\) 是等价的。其实这也只是一个人为的变化。因为我们大部分时候想要利益最大化。

从这里可以看出线性规划和斜率是很有关系的,掌握好线性规划,就可以搞懂一些复杂的与斜率有关的 DP 优化(比如 WQS 二分、\(\text{Slope Trick}\))。

标准型与松弛型

此处我们介绍两种描述线性规划的常用模型:标准型和松弛型。

标准型

定义

在标准形中,我们已知 \(n\) 个实数 \(c_1, c_2, \dots, c_n\)\(m\) 个实数 \(b_1, b_2, b_m\),以及 \(m \times n\) 个实数 \(a_{i, j}\),我们希望找到 \(n\) 个实数 \(x_1, x_2, \dots, x_n\),在满足:

\[\begin{cases} \displaystyle\sum_{j = 1}^n a_{i, j} x_j \leq b_i & i = 1, 2, \dots, m\\ x_j \geq 0 & j = 1, 2, \dots, m \end{cases} \]

的约束条件的情况下,最大化

\[\displaystyle\sum_{j = 1}^n c_j x_j \]

如果你熟悉线性代数,那么你可以发现第一个约束很像一个矩阵乘法的式子。如果我们构造一个 \(m \times n\) 的矩阵 \(A = (a_{i, j})\),一个 \(m\) 维向量 \(b = (b_i)\),一个 \(n\) 维向量 \(c = (c_i)\) 和一个 \(n\) 维向量 \(x = (x_i)\),那么标准型又可以表示成在满足:

\[\begin{cases} Ax \leq b\\ x \geq 0 \end{cases} \]

的约束条件的情况下,最大化

\[c \cdot x \]

将一个线性规划问题转化成标准型

一个线性规划问题可能由于以下 \(4\) 种原因之一而不是标准型:

  • 目标函数可能要最小化,而不是最大化;

  • 可能有变量不具有非负限制,也就是说,这个变量可以是负实数;

  • 可能有的限制是等式,也就是说,限制条件中的小于等于号变成了等于号;

  • 可能这个限制是不等式,但是其中的不等号是大于等于号。

此时我们希望把这个线性规划 \(L\) 转化为一个标准型的线性规划 \(L'\),下面我们来看看如何转化。拿以下的这个线性规划举例子:

在满足:

\[\begin{cases} x_1 + x_2 = 7\\ x_1 - 2x_2 \leq 4\\ x_1 \geq 0 \end{cases} \]

的约束条件的情况下,最小化

\[-2x_1 + 3x_2 \]

我们发现这个线性规划符合上述所有不是标准型的描述,因此现在要依次变化这个线性规划。首先我们将目标函数取反,变成求 \(2x_1 - 3x_2\) 的最大值。这个很显然,因为它们的值域正好是对称的,符合等价的定义。于是现在这个线性规划就变成了:

在满足:

\[\begin{cases} x_1 + x_2 = 7\\ x_1 - 2x_2 \leq 4\\ x_1 \geq 0 \end{cases} \]

的约束条件的情况下,最大化

\[2x_1 - 3x_2 \]

接下来,假设某个 \(x_j\) 不具有非负限制,那么我们把每次 \(x_j\) 出现的地方,都替换成 \(x_j' - x_j''\),并将 \(x_j'\)\(x_j''\) 都增加非负限制。也就是说,将目标函数中的 \(c_j x_j\) 替换成 \(c_j x_j' - c_j x_j''\),将约束中所有 \(a_{i, j} x_j' - a_{i, j} x_j''\)。由于两个正实数作差可以得到任意一个负实数,那么我们将 \(x_j' - x_j''\) 看成一个整体,这和单个 \(x_j\) 是一样的。于是现在这个线性规划就又变成了:

在满足:

\[\begin{cases} x_1 + x_2' - x_2'' = 7\\ x_1 - 2x_2' + 2x_2'' \leq 4\\ x_1, x_2', x_2'' \geq 0 \end{cases} \]

的约束条件的情况下,最大化

\[2x_1 - 3x_2' + 3x_2'' \]

接下来,我们要将等式约束转化成不等式。假设有一个约束形如 \(f(x_1, x_2, \dots, x_n) = b\)。根据初中数学,如果 \(x \geq y\)\(x \leq y\),那么只有 \(x = y\) 满足条件,于是我们可以将限制拆成 \(f(x_1, x_2, \dots, x_n) \geq b\)\(f(x_1, x_2, \dots, x_n) \leq b\)。于是现在这个线性规划就又变成了:

在满足:

\[\begin{cases} x_1 + x_2' - x_2'' \geq 7\\ x_1 + x_2' - x_2'' \leq 7\\ x_1 - 2x_2' + 2x_2'' \leq 4\\ x_1, x_2', x_2'' \geq 0 \end{cases} \]

的约束条件的情况下,最大化

\[2x_1 - 3x_2' + 3x_2'' \]

最后,对于约束中所有不等号为大于等于的约束,我们在其两边同时乘以 \(-1\),这是一个等式的恒等变换,一定不改变解集,因此依然与原问题等价。最后的最后,再将 \(x_2', x_2''\) 替换成 \(x_2, x_3\),我们最终将原先这个特别不标准的线性规划转化成了:

在满足:

\[\begin{cases} -x_1 - x_2 + x_3 \leq 7\\ x_1 + x_2 - x_3 \leq 7\\ x_1 - 2x_2 + 2x_3 \leq 4\\ x_1, x_2, x_3 \geq 0 \end{cases} \]

的约束条件的情况下,最大化

\[2x_1 - 3x_2 + 3x_3 \]

这一标准型的线性规划问题。

松弛型

为了更高效地使用后面讲的算法来求解线性规划,我们可以将某些标准型中的不等式转化为等式。也就是将标准型中除开 \(x_1, x_2, \dots, x_n \geq 0\) 以外的所有限制转化成等式。此时我们就要用到松弛型。

定义

我们引入一个新的变量 \(s\),对于线性规划中的一个限制 \(\displaystyle\sum_{j = 1}^n a_{i, j} x_j \leq b_i\),我们将其重新改写成一个等式和一个不等式:

\[s = b_i - \displaystyle\sum_{j = 1}^n a_{i, j} x_j\\ s \geq 0 \]

其中我们称 \(s\) 为一个松弛变量,因为它衡量了 \(\displaystyle\sum_{j = 1}^n a_{i, j} x_j\) 与上界 \(b_i\) 的差距。

通过将每一个标准型中的约束转化成松弛变量的形式,我们得到了一个形式不同的线性规划问题。比如刚才标准型的线性规划问题,我们将其转化后,就变成了:

在满足:

\[\begin{cases} x_4 = 7 - x_1 - x_2 + x_3\\ x_5 = -7 + x_1 + x_2 - x_3\\ x_6 = 4 - x_1 + 2x_2 - 2x_3 \leq 4\\ x_1, x_2, x_3, x_4, x_5, x_6 \geq 0 \end{cases} \]

的约束条件的情况下,最大化

\[2x_1 - 3x_2 + 3x_3 \]

此时我们称等式左边的变量为基本变量,而等式右边的则称为非基本变量

我们将目标函数与入约束条件拼起来,再将非负限制去掉,我们就得到了一个松弛型的线性规划问题。

凸性证明

我们在前面说到,所有可行解表示在 \(n\) 维空间中,应该是一个凸包的形式,下面我们来严谨论证一下它是凸的。

首先,一个凸集的严谨定义是,如果对于一个集合 \(C\),从中随便找两个点 \(X_1\)\(X_2\),它们之间的点都在集合 \(C\) 中,那么 \(C\) 就是一个凸集,这非常显然,如果 \(X_1\)\(X_2\) 之间的连线上有点不在 \(C\) 中,那么这个位置一定凹下去了。

我们设 \(X_1 = (x_{1, i})\)\(X_2 = (x_{2, i})\),那么根据标准型线性规划问题的式子:

\[\begin{cases} \displaystyle\sum_{j = 1}^n a_{i, j} x_{1, j} \leq b_i\\ \displaystyle\sum_{j = 1}^n a_{i, j} x_{2, j} \leq b_i \end{cases} \]

(我们此处不需要考虑非负限制,因为如果两个点的各个坐标都非负,那么它们连线上的所有点各个坐标都为非负值)

现在我们写出经过 \(X_1\)\(X_2\) 的线段的方程。根据高中数学平面向量基本定理的知识,我们知道 \(X_1\)\(X_2\) 连成的线段上的点 \(X = (x_i)\) 可以表示为 \(kX_1 + (1 - k) X_2(k \in [0, 1])\)

我们将 \(x\) 带入约束中,大力推式子:

\[\begin{aligned} \displaystyle\sum_{j = 1}^n a_{i, j} x_j &= \sum_{j = 1}^n a_{i, j} (k x_{1, j} + (1 - k) x_{2, j}) \\&= k\sum_{j = 1}^n a_{i, j} x_{1, j} + (1 - k)\sum_{j = 1}^n a_{i, j} x_{2, j} \\&\leq \sum_{j = 1}^n a_{i, j} x_{1, j} + \end{aligned} \]

常见的线性规划问题

单纯形法

参考资料

posted @ 2025-07-12 14:33  Orange_new  阅读(65)  评论(0)    收藏  举报