线性规划

资料

2016-国家队论文

性质

线性规划的形式为 (松弛型)

\[\begin{matrix}\text{最大/小化} &&&&\sum\limits_{j=1}^nc_jx_j \\\text{满足约束} &&&&\sum\limits_{j=1}^{n+m}a_{i,j}x_j=b_i &&&,i\in[1..m] \\&&&& x_j\geqslant 0 &&&,j\in[1..n]\end{matrix} \]

也可以用矩阵表示

\[\begin{matrix} \text{最大/小化} &&&&c^Tx \\ \text{满足约束} &&&&Ax= b \\ &&&& x\geqslant 0 \end{matrix}\]

求解

单纯形法

前提

我们可以不加证明的给出

  1. 每个约束所形成的都是凸形区域
  2. 多个凸形区域求交也是凸形区域
    所以我们可以知道,线性规划的局部最优解有且仅有一个,也就是全局最优解。所以我们可以贪心的求最值。

算法描述

在这里,我们重新表示松弛型。

\[\begin{matrix} \text{最大化} &&&&\sum\limits_{j=1}^nc_jx_j \\ \text{满足约束} &&&&x_{i+n}=b_i-\sum\limits_{j=1}^na_{i,j}x_j &&&,i\in[1..m] \\ &&&& x_j\geqslant 0 &&&,j\in[1..n+m] \end{matrix}\]

我们定义:

  • 基变量:等式左边的变量
  • 非基变量:等式右边的变量
    此时我们可以获得一个可行解 ( \(b>0\) ): 所有基变量为 \(b\) 的值,非基变量全为 \(0\)
    并且目标函数一定可以使用非基变量表示。

单纯形法有三个主要操作: pivotsimplex,以及 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\) 时,找到一组初始解。

具体来说,我们引入一个辅助线性规划

\[\begin{matrix}\text{最大化} &&&&-x_0 \\\text{满足约束} &&&&x_{i+n}=b_i-\sum\limits_{j=1}^na_{i,j}x_j+x_0 &&&,i\in[1..m] \\&&&& x_j\geqslant 0 &&&,j\in[1..n+m]\end{matrix} \]

如果原线性规划的一个可行解为 \((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\) 个约束就变为

\[\begin{matrix} x_0 = -b_l+\sum_{j=1}^na_{l,j}x_j+x_{n+l} &,-b_l\leqslant0 \end{matrix}\]

约束 \(i\neq l\) 变为

\[x_{n+i} = b_i-b_l+\sum_{j=1}^n(a_{l,j}-a_{i,j})x_j+x_{n+l} \]

此时 \(b_l\leqslant b_i \rightarrow b_i-b_l \geqslant0\),即求出了一组可行解。
再将 \(x_0\) 换为非基变量,即可求出最优解。

伪代码

\[\begin{align} &initialization(A,\ b,\ c)\\ &while\ \exists e\ that\ c_e\ >\ 0\ do\\ &\ \ \ \ find\ the\ index\ l\ that\ A_{le}\ >\ 0\ and\ minimizes\ \frac{b_l}{A_{le}}\\ &\ \ \ \ if\ \forall l,\ A_{le}\ \leqslant\ 0\ then\\ &\ \ \ \ \ \ \ \ return\ Unbounded\\ &\ \ \ \ else\ \\ &\ \ \ \ \ \ \ \ pivot(A,\ b,\ c,\ l,\ e)\\ &\ \ \ \ end\ if\\ &endwhile\\ \end{align}\]

时间复杂度

一次 pivot\(\mathcal O(nm)\) 的,但是操作次数不是多项式的。

但是线性规划是有多项式算法的,如 椭球算法/内点算法
不过单纯形法的运行效率在实际应用中比较高,故大概率是够用了...吗

posted @ 2024-08-06 20:55  CloudDreamLaker  阅读(77)  评论(0)    收藏  举报