线性规划与单纯形法

单纯形法——线性规划的经典算法

极点定理:

可行区域非空的任意线性规划问题有最优解,而且,最优解总是能够在其可行区域的一个极点上找到

这个定理告诉我们,在解一个线性规划问题时,起码在可行区域有界的情况下,我们只需考虑有限数量的点,而可以忽略其他所有点。
大体来说,我们可以这样求解问题:在每个极点上计算目标函数的值,然后选出具有最佳值的那个点。但要实现这个方法还有两个主要障碍:
①需要一种方法来生成可行区域的所有极点
②随着问题规模的增长,极点的数量是呈指数级增长的。对于大多数具有一定应用价值的线性规划来说,对极点采用穷举法来计算就不现实了。

幸运的是,有一种算法在一般情况下只需要检测可行区域极点中的一小部分就能中找到最优点。这个著名的算法被称为单纯形法

1.单纯形法概述

这个算法的思想可以用几何术语描述如下:

先在可行区域中找到一个极点,然后检查一下是不是在邻接极点处可以让目标函数取值更加。如果不是,则当前顶点就是最优点,然后算法停止;如果是,转而处理那个能让目标函数取值更佳的邻接顶点。有限步以后,该算法要么发现了一个取得最优解的极点,要么证明了最优解不存在。

我们现在的目标是要把单纯形法的几何描述“翻译”成更具算法精确性的代数语言,在将单纯形法应用于线性规划问题之前,先要将其转化为一种称为标准形式的特定形式。标准形式要满足下列要求:

  • 它必须是一个最大化问题
  • 所有的约束都必须用线性方程的形式表示
  • 所以的变量都必须要求是非负的

因此,具有m个约束和n个变量的标准形式的通用线性规划问题是:
在这里插入图片描述
任何线性规划问题都能转化为等价的标准形式问题:
(1)如果需要对目标函数最小化,我们可以把它替换成等价的最大化问题,只要把同一目标函数的所有系数Cj替换成-Cj即可
(2)如果问题的约束是用不等式给出的,我们可以用一个等价的等式来替换它,方法是在等式中加入一个所谓的松弛变量,这个变量表明原不等式两边应该相差多少,如:
x + y <=4 ---------> x+y+v=4 v>=0
(3)最后,在大多数线性规划问题中,变量一开始就要定义成非负的,因为它们往往代表现实世界的某些物理量。如果在问题的初始定义时没有这种约束,那么没有受非负约束的变量xj应该被替换成两个新的非负变量的差:xj = xj1 - xj2(xj1>=0 xj2>=0)

标准形式的主要优势在于,它可以让我们用一种简单的机制来确定可行区域的极点

对于包含m个等式的n元方程组(n>=m)的一般情况,我们需要把n-m个变量设成0,来得到一个包含m个等式的m元方程组,如果得到的方程组具有唯一解,我们就得到了一个基本解,在解方程组前被设为0的坐标称为非基本的,而解方程得到的坐标值称为基本的。

二维向量空间的一个基是由任何两个不互为比例的向量组成的,一旦选定了一个基,任何向量都可以用基向量倍数之和来唯一表示。(基本和非基本变量分别指出,在选择基时,哪些给定向量应该是基的一部分,哪些不是)
如果一个基本解的所有坐标值都非负,该基本解被称为基本可行解。基本可行解的重要性在于它们和可行区域极点之间的一一对应的关系

2.单纯形表

就像上面提到的,随着目标函数变大,单纯形法不断处理一系列邻接的极点(基本可行解)。每个这样的点都可以用一张单纯形表来表示。这张表根据极点来存储基本可行解的信息。例如下面的标准形式的线性规划问题(我们记为X题,下同):
在这里插入图片描述
如果将x和y取0的时候得到极点(0,0, 4,6)则其单纯形表是这样的:
在这里插入图片描述
单纯形表的最后一行被称为
目标行
。一开始,它在前n列填入目标函数的系数,只是符号取反并在最后一列填入目标函数在初始点的值,在后续迭代中,目标行以同样方式跟随其他行进行变换。单纯形法用目标行来检查当前表是不是代表了一个最优解;如果目标行的所有单元格都非负,则它代表了一个最优解,如若不然,那么任何一个为负的单元格都意味着,在下一张表中一个非基本变量应该变成基本变量。

例如,根据这个标准,X题所代表的基本可行解(0,0,4,6)并不是最优的。x列的负值指出,我们通过增加基本可行解(0,0,4,6)中x坐标的值来增加目标函数z = 3x + 5y + 0u +0v的取值。的确,因为在目标函数中x的系数为正,x的值越大,该函数的值也越大。当然,由于x变大了,作为“补偿”,我们需要调整基本变量u和v的值,使得新的点仍然位于可行区域。为了实现这个目的,必须满足u和v为非负,此时x的最大取值为4,这是我们发现新的解(4,0,0,2)变成了可行区域中紧邻(0,0,4,6)的另一个极点,而z=12
同样,目标行中y列的负值指出,我们还可以通过增加初始基本可行解(0,0,4,6)中的y坐标值来增加目标函数的取值,**这时y最大值应该取2,这是我们发现新的解(0,2,2,0)变成了另一个紧邻(0,0,4,6)的极点。**得到总结:

将一个非最优值的基本表中的非基本变量逐个的变成基本变量(取能取到的最大值)即得到它的所有紧邻极点

如果目标行中有若干负的单元格,一个常用规则是选出其中最小的,也就是绝对值最大的负数。之所以采用这个规则是因为观察发现,这样做的话,变量值每个单位的改变能够让目标函数获得最大的增长。新的基本变量称为输出变量,它所在的列称为主元列

现在我们来说明如何选择分离变量,即将基本变量变为非基本变量。 根据观察结果,我们可以得到在单纯形表中选择分离变量的一个规则:

对于主元列上的每个正单元格,将其所在行的最后一个单元格除以主元列的单元格,求得一个所谓的θ比率。θ比率最小的行指出了哪个是分离变量,如果θ比例相同,则任选其一。

求出的θ最小的行称为主元行。记住,如果主元列没有正单元格,则不必计算θ比率,这意味着该问题是无界的,算法也就可以终止了。

最后,为了将当前表变化变化为下一张表格(主元化),我们还需要执行以下步骤:
(1)将主元行中所有的单元格除以主元(主元位于主元行和主元列的相交单元格)求得rownew
(2)用下面算式的计算结果来替换包括目标行在内的每一行:
row - c*rownew
c是各行主元列的单元格

单纯形法小结:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值