线性规划
资料
性质
线性规划的形式为 (松弛型)
也可以用矩阵表示
求解
单纯形法
前提
我们可以不加证明的给出
- 每个约束所形成的都是凸形区域
- 多个凸形区域求交也是凸形区域
所以我们可以知道,线性规划的局部最优解有且仅有一个,也就是全局最优解。所以我们可以贪心的求最值。
算法描述
在这里,我们重新表示松弛型。
我们定义:
- 基变量:等式左边的变量
- 非基变量:等式右边的变量
此时我们可以获得一个可行解 ( \(b>0\) ): 所有基变量为 \(b\) 的值,非基变量全为 \(0\)
并且目标函数一定可以使用非基变量表示。
单纯形法有三个主要操作: pivot、simplex,以及 initialization
转轴 (pivot)
在一个等式中,我们选择基变量 ( \(x_B\) )和一个非基变量( \(x_N\) ),将其地位互换。
具体来说,最开始有
\[x_{B}=b_i-\sum\limits_{j=1}^na_{i,j}x_j \]那么,做完转轴操作
\[x_N=\frac{b_i-\sum\limits_{j\neq N}a_{i,j}x_j-x_B}{a_{i,N}} \]此时,将 \(x_N\) 代换入其它等式即可。
simplex
在每次操作时,我们先在目标函数中找到一个系数 \(\geqslant 0\) 的非基变量 \(x_e\)。
然后我们再在约束中找到使 \(a_{l,e} \geqslant 0\) 并且最小化 \(\dfrac{b_l}{a_{l,e}}\) 的 \(l\),执行 pivot 即可。
终止贪心的标志是 \(\forall j\in[1..n], c_j\leqslant0\)
initialization
initialization 的作用是在 \(\exists i\in[1..m], b_i\leqslant 0\) 时,找到一组初始解。
具体来说,我们引入一个辅助线性规划
如果原线性规划的一个可行解为 \((x^{'}_1,x^{'}_2,\dots,x^{'}_{n+m})\),那么辅助线性规划也有一个可行解: \((0,x^{'}_1,x^{'}_2,\dots,x^{'}_{n+m})\) ,并且也一定是辅助线性规划的最优解。
而辅助线性规划的解是容易构造的。
\(x_0\) 的系数在每一个约束中都是 \(+1\),我们找到最小的 \(b_l\leqslant 0\),将 \(x_0\) 在这个约束中换为基变量 (pivot操作 ),第 \(l\) 个约束就变为
约束 \(i\neq l\) 变为
此时 \(b_l\leqslant b_i \rightarrow b_i-b_l \geqslant0\),即求出了一组可行解。
再将 \(x_0\) 换为非基变量,即可求出最优解。
伪代码
时间复杂度
一次 pivot 是 \(\mathcal O(nm)\) 的,但是操作次数不是多项式的。
但是线性规划是有多项式算法的,如
椭球算法/内点算法
不过单纯形法的运行效率在实际应用中比较高,故大概率是够用了...吗

浙公网安备 33010602011771号