线性规划

线性规划

一般形式:给定一堆实数变量 \(x_n\),有若干个是等式或者不等式的线性限制,有一个线性函数作为目标函数,要求最大/小化目标函数的值。

称两个同为最大化的线性规划是等价的,当且仅当,对于前者的一个可行解及其值 \(v\),后者存在一个可行解,值也为 \(v\)。反之亦然。

称一个最大化一个最小化的是等价的,当且仅当,对于前者的一个可行解及其值 \(v\),后者存在一个可行解,值为 \(-v\)。反之亦然。

标准型:

最大化,限制都是小于等于,并且每个变量都有非负限制。

若为最小化,先添加负号。若有相等限制,转成两个不等限制。若有大于等于限制,加负号。若有变量 \(x_i\) 没有非负限制,令 \(x_i=x_i'-x_i''\),并且令 \(x_i',x_i''\ge 0\)

写出来就是

\[\begin{aligned} \text{maximize} &\sum_{i=1}^nc_ix_i\\ \sum_{i=1}^na_{ji}x_i&\le b_j\\ x_i&\ge 0 \end{aligned} \]

如果我们记 \(x,b,c\) 是列向量,\(A\)\(m\times n\) 的系数矩阵,那么可以写成

\[\begin{aligned} \text{maximize} \ \ c^Tx\\ Ax\le b\\ x\ge 0 \end{aligned} \]

松弛型:

最大化,限制都是等于,每个变量有非负限制。

我们以标准型为基础。对于小于等于的限制 \(\sum b_ix_i\le c_i\),我们添加松弛变量 \(s_j=c_i-\sum b_ix_i,s_j\ge 0\)

一些例子

最大流问题:

\[\begin{aligned} \text{maximize} &\sum_v f(s,v)\\ f(u,v)&\le c(u,v)\\ f(u,v)&=-f(v,u)\\ \sum_v f(u,v)&=0,u\neq s,t \end{aligned} \]

费用流问题:

\[\begin{aligned} \text{minimize} \sum_{(u,v)}&f(u,v)w(u,v)\\ f(u,v)&\le c(u,v)\\ f(u,v)&=-f(v,u)\\ \sum_v f(u,v)&=0,u\neq s,t\\ \sum_v f(s,v)&=d \end{aligned} \]

单纯形算法

TODO。

对偶

对于一个标准型,我们定义它的对偶线性规划问题为

\[\begin{aligned} \text{minimize} &\sum_{i=1}^mb_iy_i\\ \sum_{i=1}^ma_{ij}x_i&\ge c_j\\ y_i&\ge 0 \end{aligned} \]

或者,写成

\[\begin{aligned} \text{minimize} \ \ b^Ty\\ A^Ty\ge c\\ y\ge 0 \end{aligned} \]

我们先证明,对偶问题的任意一个可行解 \(y\) 得到的值大于等于原问题的任意一个可行解 \(x\)

\[\begin{aligned} \sum_{i=1}^n c_ix_i&\le \sum_{i=1}^n(\sum_{j=1}^m a_{ji}y_j)x_i\\ &=\sum_{i=1}^n\sum_{j=1}^m a_{ji}x_iy_j\\ &=\sum_{j=1}^m\sum_{i=1}^n a_{ji}x_iy_j\\ &=\sum_{j=1}^m(\sum_{i=1}^n a_{ji}x_i)y_j\\ &\le \sum_{j=1}^mb_jy_j \end{aligned} \]

那么接下来我们只要找到一组得到的值相等的 \(x,y\) 即可。

这个过程可以通过单纯形算法的过程证明,我们略过。

我们现在可以通过机械的方式,把系数写成矩阵再转置,以此来构造对偶问题。但这样往往会破坏对偶后的问题的一些形式,所以我们这里从另外一个角度,介绍一种对偶的方法。

我们针对一般形式入手,不妨假设求的是最大,最小是同理的。

先把每个不等式转化成小于等于的形式,等式把所有项移到左侧,然后给每个式子设一个元 \(\lambda_i\),对于不等式,要求 \(\lambda_i \le0\),对于等式,没有额外要求。

然后把 \(\lambda_i\) 和对应的式子的左侧相乘,加到目标函数 \(f(x_j)\) 上,把 \(x_j\) 当成主元整理,然后要求每个 \(x_j\) 前的系数 \(=0\)。我们就完成了对偶,对偶后的目标函数是把加完后的函数中 \(x_j\) 及系数去掉之后的结果。

为什么是对的呢?你考虑我们相当于是给每个小于等于的式子乘了一个非正数,把式子变成了大于等于,然后你想象把这一堆不等式加到 \(f(x_j)=f(x_j)\) 这个等式上,你就得到了 \(f(x_j)\le\dots\)。然后你再令系数都是 0,就得到了目标函数。本质上是对不等式加加减减凑出来目标函数的系数。

posted @ 2024-01-24 17:06  PYD1  阅读(41)  评论(0)    收藏  举报