(同步个人博客 http://sxysxy.org/blogs/78 到csdn)
本文相关资料可以到 https://github.com/sxysxy/math/tree/master/simplex 下载)
线性规划(Linear Programming, LP),是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法。研究线性约束条件下线性目标函数的极值问题的数学理论和方法。英文缩写LP。它是运筹学的一个重要分支,广泛应用于军事作战、经济分析、经营管理和工程技术等方面。为合理地利用有限的人力、物力、财力等资源作出的最优决策,提供科学的依据。(来自百度百科)
在一般的线性规划问题中,我们希望优化一个满足一组线性不等式约束的线性函数。一直一组实数 ,对应的一组变量。定义关于这些变量的一个线性函数:
那么等式 和不等式 以及 都称为”线性约束”。并且不久之后我们即将看到,我们可以把两种不等式的约束形式统一为 这种形式,然而之后在运行解决线性规划的单纯形法时又会将它变成等价的 形式。
如果我们已知n个实数与m个实数,以及n*m个实数,我们希望找到n个实数
最大化
满足约束
或者将分别将和和表示成向量b, c, x,构造m行n列矩阵。那么标准型也可以写作:
最大化
满足约束
注意到,标准型里面目标函数的目标是最大化,所有变量都具有非负约束,除了非负约束外的约束都是具有 <= 符号的非严格不等式。对于不满足标准型形式的线性规划,我们可以想办法将它转化为标准型:
取负即可。也就是最小化 等价于最大化
对于不具有非负约束的变量,把每次出现的地方都替换为适当的
大于等于约束两边同时取负即可。即 等价于
等式约束拆成两个不等式约束。对于 等价于 且
为了利用单纯形算法高效地求解线性规划,我们更喜欢把其中的除非负约束外的约束转换成等式约束。
对于一个约束 引入一个松弛变量s,约束即可写作:
。
一般地,为了方便常会用 作为第i个约束条件的松弛变量。因此第i约束条件就可以写作:
最小化
满足约束条件
最大化
满足约束条件
拆开等式约束:
最大化
满足约束条件
替换为 ,添加对的非负约束,得到
最大化
满足约束条件
除了非负约束外,有3个约束条件,于是增加松弛变量
最大化
满足约束条件
思考:如果原先有一个等式约束,直接把它写到松弛型里面,与将它转变成标准型,再变成松弛型(这样就比前者多了一个约束条件),问题是否等价?(提示:考虑后者引入的松弛变量s1 = s2 = 0)
作业:请自行练习描述线性规划问题的方法
单纯形算法是求解线性规划的经典算法,它再最坏情况瞎执行时间并不是多项式级别的,但是在实际的应用中,它总是相当快速。
个人理解:
单纯形法接受一个松弛型的输入,每轮迭代尝试将松弛型L转变为一个等价的松弛型L’,直到转变成一种”易于求解的松弛型”,得到结果。这就类似化三角法求行列式值。
什么是”易于求解的松弛型”呢?如果目标函数具有
这样的形式,由于变量具有非负约束,因此z的最大值即为常数C。如果我们能把一般的松弛型转变为这样”易于求解的松弛型”的松弛型即可得解。
考虑下面这个松弛型:
最大化
满足约束条件
术语:我们把松弛型约束条件等号左边的变量称为基本变量,右边的称为非基本变量。
我们会选取目标函数里面某个系数为正的非基本变量,并尽可能增大的取值且不违反任何约束条件。由于的增大可能会导致其它变量值缩小,但是其它变量也存在非负约束,这样就约束了的取值的上界,我们选出对约束最紧的变量,令 与 互换(代入法)得到一个新的等价的松弛型。具体对于我们这个例子就是:
首先看变量,对它约束最紧的是第三个约束,约束了。是约束了。于是互换 与,把放到 的位置,得到
。
将约束条件不等式右边的所有用这个式子替换掉,即可得到
最大化
满足约束条件
这样的一次操作叫做转动(pivot)
(结合例子请思考:选择约束最紧的变量做互换的原因。提示:如果换的不是最紧的约束看看会违反什么性质)
然后选择变量或者,不选是因为增大会导致目标z减小。
如果选择,同样的方法,互换与可以得到新的但等价的约束系统:
最大化
满足约束条件
接下来也只剩下这个变量可选了,与互换,得到
最大化
满足约束条件
此时目标函数右边变量系数全部为负数,且变量具有非负约束,显然这时候能得到的z的最大值为28。当且仅当。带入解得。除去附加的松弛变量,最终这个线性规划最优解为
思考:每次转动操作交换的两个变量对单纯形法的运行时间有着怎样的影响?如何选择可以使单纯形法尽快结束?(提示:每次pivot尽可能让目标函数增大得多)
如需参考,见https://github.com/sxysxy/math/blob/master/simplex/simplex.c,有详细注释。
伪代码:
simplex:
检查是否无解
loop:
找出目标函数中前面系数为正数的一个变量x
如果找不到x
返回目标函数的常数项(已找到目标函数最大值)
找到对x的增长约束最紧的变量y
如果找不到y
返回Inf
互换变量x,y(pivot(x,y),操作后问题与原来等价)
pivot请自行实现
作业:
非标准型转换为标准型魔法码(github上给出的参考代码要求输入的是标准型)
输出目标函数达到最大值时自变量的取值
思考:会不会存在一种情况:虽然一个线性规划问题有解,但是单纯形算法仍会无休止迭代下去。
思考:如果判断出这样一种无解的情况:
周五(2016.12.16)在魔法裙里面讲了一波,收获颇为丰富,并且也搞明白了一些之前没明白的问题,并且补充了本文的内容)
《算法导论》第三版
互联网上相关资料
内容如有错误欢迎指出!请联系<[email protected]>
QaQ 鶸渣一枚