线性规划笔记之单纯形法推导
线性规划
假设一些食材的属性如下表所示:
名称 | 价格(元/斤) | 维生素指数/斤 | 美味指数/斤 | 肥胖指数/斤 |
---|---|---|---|---|
猪肉 | 30 | 0 | 15 | 8 |
鸡肉 | 20 | 0 | 12 | 3 |
青菜 | 5 | 10 | 5 | 0 |
面条 | 2 | 1 | 1 | 5 |
番茄 | 10 | 8 | 3 | 4 |
青椒 | 8 | 14 | -2 | 0 |
假设分别购买这些食材, , , , , 斤, 则总开销为:。现在需要在满足维生素指数不小于100,美味指数不低于100,肥胖指数不超过30,以及总重不超过10斤的情况下组合出最省钱的菜单。则问题转化为:
subject to
我们把这类目标函数以及约束条件均为线性关系式的简单组合优化问题成为线性规划。对于这类问题在高中应该还是接触得比较多的,当初老师应该都教过用作图法来求解,比如:
根据约束画出可行域(图中阴影部分),然后沿着等值线法向量(梯度方向)移动等值线达到极限位置(继续移动会出现空集),就可以最终取得最大或最小值。而这类问题的最优解往往都落于多边形可行域的顶点上。
单纯线性法
自1947 年,面对美国制定空军军事规划时提出的问题,丹齐克( Dantzig)首次提出了单纯形法来解决这类极值问题的求解后,应用最广的线性规划通用解法就是单纯线性法,其基本思想时从一个基本可行解出发,不断移动到下一个能使目标函数值朝优化目标改善的基本可行解上,最终达到最优的基本可行解。因为基本可行解的个数有限,所以经过有限次转换必能得出问题的最优解。如果问题无最优解,我们也可以用单纯形法来判别。
算法原理推导
对于一个线性规划问题(以下所有加粗字母表示矩阵或向量名):
可通过引入新的变量,将其转换为松弛形式:
比如对于问题:
可转化为:
其矩阵形式:
即:
其中,被称为非基变量,, 被称为基变量。这些变量前面对应的系数矩阵可分别记为非基矩阵,和基矩阵。
假设一开始非基变量,则由(2)可得我们的初始的基本可行解为:
则此时的目标函数值:
其上与分别为中与基变量和非基变量对应的分向量。接下来要讨论如何从起始的基本可行解出发,找到下一个能使目标函数值改善的基本可行解。
由式(2)可得:
将(3)代入(1)中得目标函数在某一可行解处的值为:
上式中,代表非基变量的下标集合,。我们可以看到只要选取合适的变量,就可使上述函数值减小。前面提到,在设置初始基本可行解时,我们令所有非基变量;现在我们可以将其中的某一个非基变量增大为正值其余保持为零,则函数值就会相应下降,而且越大,函数值也会下降越快:
此时:
由于要求永远不小于0,因此由(6)可计算出的取值范围为:
即将取到所有 的最小值的时候,函数值会下降最快。此时将对应的基变量x_Bi变为非基变量并赋值0。并用对应的来替换。经过上述的替换后,目标函数值减少了。我们只需不断重复上述过程直到所有的为非正数,也即此时取正增大任意一个非基变量都不能使函数值减少,说明已经找到了极小点。
例子
举个栗子:
引入松弛变量,:
进行第一次迭代:
令,由(3):
由(1)计算出此时的函数值:
接下来通过对所有非基变量计算判别数来检查是否已经抵达最优解,根据(4):
则此时最大非负判别数为3,对应第一组非基变量,,为进基变量。根据(7):
则, 那么中第一个分量为离基变量。
用替换进行第二次迭代:
此时函数值:
判别数:
,进基变量
,离基变量为中第二个分量
用替换进行第三次迭代:
此时函数值:
判别数:
此时所有判别数均不为正,因此得到目标函数的最优解,最优函数值
单纯形法实际上运行的效率不高。许多数学家在随后提出性能更佳的算法,如改进单纯形法、对偶单纯形法等。在此文中暂时不作讨论。