目录
资料
性质
线性规划的形式为 (松弛型)
\[\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}\]求解
单纯形法
前提
我们可以不加证明的给出
- 每个约束所形成的都是凸形区域
- 多个凸形区域求交也是凸形区域
所以我们可以知道,线性规划的局部最优解有且仅有一个,也就是全局最优解。所以我们可以贪心的求最值。
算法描述
在这里,我们重新表示松弛型。
\[\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\)
并且目标函数一定可以使用非基变量表示。
单纯形法有三个主要操作: 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\) 时,找到一组初始解。
具体来说,我们引入一个辅助线性规划
\[\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\) 个约束就变为
约束 \(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)\) 的,但是操作次数不是多项式的。
标签:matrix,..,线性规划,text,sum,&&&& From: https://www.cnblogs.com/CloudDreamLake/p/18345906/linear-programming但是线性规划是有多项式算法的,如
椭球算法
/内点算法
不过单纯形法的运行效率在实际应用中比较高,故大概率是够用了...吗