线性规划
posted on 20 Feb 2019 under category 算法珠玑
在旋转的过程中,可能会存在保持目标值不变的情况,这种现象称为退化。
如何避免退化?一个方法就是使用Bland规则:
在选择替入变量和替出变量的时候,我们总是选择满足条件的下标最小值。
另一个方法是加入随机扰动
最坏情况下是非多项式的,而是指数复杂度,即$O(2^n-1)$,但是绝大多数情况下或者说实际运行过程中是多项式时间($O(kMN)$, $k: 算法中翻转的次数, M: 约束条件数,N:变量个数$)
整體而言, 單形法的表現相當不錯。 對於一個有n個變數及m個約束的線性規劃問題,平均起來, 單形法只需要移動經過大約$m^{0.9522} × n^{0.3109}$這麼多個頂點, 便能求得最佳解。 但是 G. Minty 和 V. Klee 兩位學者在1971年提出實例來驗證單形法在最差情況下的表現非常不好, 對於一個n維空間裡的特殊線性規劃問題, 單形法要移動經過 $2^n −1$個頂點才能到達最佳解。 因為$2^n$這個數目隨著n的增長而做 指數式成長, 所以成長速度相當快, 要用單形法來解決超大型的線性規劃確實有值得憂慮之處
给定一个线性规划L,就只有如下三种情形:
是线性规划的第一个多项式时间算法,但是实际中运行缓慢。(《算法导论》)
也是多项式时间算法。与单纯形法相比,这类算法在可行区域的内部移动。对大规模的输入,内点算法的性能与单纯形法相当,有时甚至更快。(《算法导论》)
$O(n^2m) 其中m\gg n$
$m$是变量数,$n$是约束数
可以证明(《算法导论》练习34. 5-3),整数规划是一个NP问题,没有多项式时间算法能解决整数规划。
Branch and Bound Algorithm (B&B)是整数规划的精确算法。
时间复杂度 $O(2^n)$
空间复杂度 $O(2^n)$
0-1整数规划一般解法为隐枚举法。
原则:
凸函数的定义:
$f(\theta x+(1-\theta)y)\le \theta f(x) + (1-\theta)f(y)$
注意图片中的函数如果倒过来就不是凸函数了,凸函数上每个点都比这个点的切线上的点大。
对多元函数,如果他是凸函数,则其Hessian矩阵为半正定矩阵。如果Hessian矩阵是正定的,则函数是严格凸函数。
参考资料:
https://www.hrwhisper.me/introduction-to-simplex-algorithm/