线 性 规 划 算 法 详 解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线性规划算法详解
线性规划
首先什么是线性规划,大致的定义我总结为在线性的目标和约束中,找出一个最优解。
举个例子:
M1和M2两种原料用于生产内外墙涂料,M1日最大可用量24吨,M2日最大可用量为6吨,外墙涂料每吨需要6吨M1,1吨M2,内墙涂料每吨需要4吨M12,吨M2,外墙涂料每吨利润5个单位,内墙涂料每吨利润4个单位。且市场需求调查数据得出,内墙日需求量不超过外墙的日需求量+1吨,内墙最大日需求量为2吨
怎样在这样的各个线性的条件中,得到最优的内外墙生产吨数,就是我们线性规划算法要做的事情。
设外墙生产x1吨,内墙生产x2吨,设利润为z,要得到z的最大化,也就是最优解,上述条件罗列为公式可得出
6x1+4x2=24
x1+2x2=6
-x1+x2=1
z=5x1+4x2
如何从这个公式中求出最优解?有以下两大方法
我们将上述约束条件画图,y轴为x2,x轴为x1,得出如下:圈红色的部分就是所有的可行解,表示这个区间内都的x1x2能满
足约束条件
对于我们的z函数,其实表示的是一条截距为z斜率为-(5-4)的线性直线,我们要求z最大化的最优解,就是在所有的可行区域内找到可以满足z曲线截距最大的点。
最后我们发现,可行区域内能让z函数达到最大截距的点就是我圈出来的那个角点,z再增大的话,就超出可行区域了,所以不满足要求,所以最终得出最优解为x1=3,x2=1.5
这就是图解法的做法,一个定理就是,线性规划的最优解总是发生在约束几何平面的角点上,例如上面圈出来的点,先当做是个定理,我也不知道怎么证明这个定理。
以上就是线性规划的图解法,优点是简单明了,缺点就是当参数超过3个时,我们很难直观画出一个jihe几何平面来找角点,所以我们需要下面的另一种解法。
单纯形法
当超过3个参数时,单纯形法就派上用场了,单纯形法首先要做的就是把方程化为标准形式:
所有的变量都是非负数
所有的约束都是等式(非负限制除外),且具有非负的右端项像上述的方程,如果化为标准形式,将会是如下
6x1+4x2+s1=24
x1+2x2+s2=6
-x1+x2+s3=1
x2+s4=2
z=5x1+4x2+0s1+0s2+0s3+0s4
新加入的s1-4表示的是松弛变量(非负),根据大于号小于号来决定他们的正负号
对于标准化形式,我们设有n个参数,设列举出的约束方程个数m,当m=n时,方程组就只有唯一的解,当mn时,说明有无穷个可行解,也就是解是一个区域。
例如y=x+1单独这个约束方程,那么可行解就是这条直线上的所有点,这个就是m=1,n=2的情况,如果再加上一个方程使得m=2,例如y=-x,则是唯一的解了,解为(-0.5,0.5)
由上面的定理,最优可行解必然出现在几何空间上的角点
几何角点的代数定义
对于一个m*n的方程组,我们另n-m个变量为0,再去在m个方程中求出其余的m个变量的值,如果有可行解,则这m个变量得出的点就是这个超几何平面的角点。
例如y=x+1,xy都非负,这里m=1我们就有两种角点情况,一种是x=0的角点,一种是y=0的角点,画图上便可只管看出。对于超3维的几何面也是如此类推,虽然我不知道如何直观证明,但这就是个定理。
所以我们线性规划最终zu做的事就是,找出适合的角点,并代入最优的z方程,哪个得出的z最优,哪个角点就是我们的最优解!
但当参数十分多时,角点的数量就十分庞大,所以我们需要一个
智能的搜索过程,来寻找出最优角点的位置。
进基离基
我们每一次的寻找角点称之为迭代,每一次我们都从原点,也就是非松弛变量全为0的时候开始
我们称令(n-m)个变量为0的这些变量为非基变量,令其余的m个变量为基变量。
从原点开始,我们计算完z值后,就要选择下一个角点来计算z,那么就需要迭代,选择一个基变量进行离基操作,并选择一个非基变量代替它,进行进基操作,从而得到下一个角点来计算z。
对于如何选择进基变量和离基变量,我们遵照如下条件
最优条件确定进基变量,在z方程上,选择一个能让z最可能往最优方向发展的变量进基,例如max z=3x1+5x2,x2的系数更高,x2非基(即非0)的话更能使z趋于最大化。
可行性条件确定离基变量,找出约束最小的那个进行离基,因为超过最小约束表明有约束不满足了,所以不能再往外扩展了。(具体操作是进行最小非负比计算,后面会继续讲)
通过这两个条件,我们就可以不用暴力穷举出所有的角点进行z 计算,大大减少了计算量,最后直到无最优条件可选了,再迭代时z 反而会适得其反时,最优解已经得到了,求解完成。
高斯-若尔当行运算
上面讲述的只是单纯形法的思路,具体的计算步骤就是高斯-若尔当行计算
回到上面的原料公式:
6x1+4x2+s1=24
x1+2x2+s2=6
-x1+x2+s3=1
x2+s4=2
z=5x1+4x2+0s1+0s2+0s3+0s4
由于最初我们从原点开始,所以基变量是s1-4,我们把基变量写在左侧则为
s1=24-6x1-4x2
s2=6-x1-2x2
s3=1-x2+x1
s4=2-x2
右边的系数为非基变量,左边为基变量,因为非基变量为0,所以左边的基变量的解值就是右边的常系数,也就是截距x1的系数为5 最能达到z最大化 ?x1在s1的方程中系数为-6,s1行的解值-进基变量系数的非负比最小(24-6 这里为了明显显示基变量,所以把一些参数挪到了右边,挪到左边过来就是6而不是-6,这个比值代表了新的角点的截距),所以选择x1进基,s1出基假设我们错误的选择了s2离基,那么xi新角点上,x1的值就是6,而x1等于6超过了约束,因为24-6*60,而s1是非负的,所以必须选择最小非负比进行离基。
以s1离基,x1进基其实就是把右边的变量挪到左边以达到左边