人生这条路很长,未来如星辰大海般璀璨,不必踟躇于过去的半亩方塘。
真正的优秀不是别人逼出来的,而是自己和自己死磕。 ------ Gaowaly
`

线性规划(LP)问题

 

约束最优化——线性规划(LP)问题

1 线性规划

        1.1 图解法(计算机不适用,便于理解)

        1.2 单纯形法

        1.3 计算几何的方法(待更新)

1 线性规划

约束优化问题:给定约束条件和目标函数,计算约束条件下目标函数的最大(最小)值。

目标函数和约束条件都是线性函数的情况,称为线性优化问题(LP问题)。此外,还有非线性优化问题。

 

线性规划问题有4个可能的情况:
1.唯一解:目标函数对应的直线与可行解空间相交于一点;
2.有无穷多个最小值解:目标函数所对应的直线与某个约束线精确垂直(图15-2(a)所示);
3.没有可行解:构建的线性规划问题的可行解域为空集,没有可行解(图15-2(b)所示);
4.无边界问题:可行解域是无界的(图15-2(c )所示)。

 



本文主要讨论有界线性规划问题求解(就是第1和第2种情况),对于无界线性规划问题,会在本文1.2.3 无界线性规划问题中简单提到。

1.1 图解法(计算机不适用,便于理解)

以下面的例子来讲。
约束条件如下:


目标函数为:

解:画图如下,图中对每个约束进行了编号,以便在以下的图解方法中识别它们。


让Z值不停地增大,直到再次增大Z值,使目标超出了可行区域为止。图15-1(b)显示了该变化过程,得到Z的最大值为1400。

优缺点:计算机不适用,且只能处理二维三维问题。但是便于理解,解释概念。

启示:由上述过程可以看到,最优解通常在两个约束线交汇的一个角点出现。这个点称为极点
因此,对于有界规划问题,最优解可以使用穷举法来比较每个可行极点的目标函数值来得到。

1.2 单纯形法

由图解法得到的启示,有界线性规划的极点都是出现在两个约束线交汇的角点。由此我们可以想办法计算每个可行的极点,然后取这些极点中最大的目标函数值,就得到线性规划问题的最优解。

为了更容易理解单纯形法,下面我结合一个例子,来讲解单纯形法的思路和实现过程。

对于有界线性规划问题,我们可以想办法计算每个约束线交汇的交点,然后取这些交点中最大的目标函数值,就得到线性规划问题的最优解。

首先我们引入松弛变量。引入松弛变量使所有约束方程从不等式变成等式。
举例来说,对于约束

可以定义一个松弛变量S1,将其加到约束条件的左边,得到如下关系:

分析一下松弛变量:

如果它是正数,表示我们在这个约束条件下还有些放松的余地,还有一些资源没有完全使用。

如果它是负数,表示我们己经超过了这个约束条件。如果它是零,表示我们刚好达到这个约束条件。

以这样一组不等式为例来说明:

目标函数为:


其可行解域如下图所示:

两个约束线的交点,称为极点。有些极点在可行解域外(如F),予以忽略;

有些在可行解域边界上,这样的就是可行极点(如ABDCE)。

只要我们计算出所有可行极点处的目标函数值,取其中最大的,就能得到线性规划问题的最优解。

如何得到各个极点的坐标?

对每个约束方程引入一个不同的松弛变量,最终约束优化问题变为下面的形式:

在上述方程组中,加上松弛变量,共有6个变量,但是只有4个方程。该方程组是欠定的。

未知数个数和方程个数之差(本例中为2)直接关系到如何识别可行极点。

由于本例中未知数个数和方程个数之差为2,因此必须固定其中2个变量,令其为0,然后通过解方程组计算其余变量的值。这样就能得到其中一个极点。
例如,上述方程组中,我们令x1和s4为0,于是得到方程组:

可以解出:得到x2=6,S1=11,S2=32和S3=9。对应了极点E点。
同样,令x1和x2为0,对应A点;x1和S2为0,对应B点;

S1和S2为0,对应C点;S1和S4为0,对应D点。
6个参数,两两参数为0,组合起来共有15种情况,对应15个点。

但其中只有ABCDE的5个点是可行极点,其余的都是无效的极点。
如果计算所有的极点,必然导致效率较低。那么,能否只计算那些可行的极点?
答案是,当然可以。

如何计算那些可行的极点?
总结一下上面的过程,先设置n-m个变量为0,然后求解剩下的m个变量m个等式的方程组。

这里,我们将取零值的变量一般称为非基本变量,其他m个变量称为基本变量。

如果所有的基本变量是非负的,那么这个结果称为基本可行解。最优解就是这些基本可行解中的一个。

单纯形法 就是,先找到求出一个基本可行解然后逐渐增加目标函数值求出其他基本可行解最终达到最优解同时算法终止

第一步,先找到一个基本可行解,令x1=x2=0,得到方程组:

 用高斯-约当法解方程组,得到解为:S1=77,S2=80,S3=9和S4=6。
目标函数可以表示为:

 目标函数值为:Z = 0。

第二步,移动到一个能使目标函数值增大的新可行解。很明显,增加当前非基本变量〔在这里是x1和x2)的值,Z值就会增大。

这里定义:把一个非基本变量变成基本(非零)变量,这个变量称为“进基变量〔entering rrariable)”。在处理过程中,如果一个基本变量变成非基本(零值)变量,该变量则称为“退基变poleaxing variable) "。

一般把最大负数值系数的变量选择为进基变量,因为这常常能使Z值的增加量最大。在本例中,由于x1的系数-175比x2的系数-150更小,所以x2成为进基变量。

这里,选择x2成为进基变量。选择哪个为退基变量呢?
我们需要计算上一步中,等号右边的值与x2的系数的比值,其实就是当前方程组在x2轴上的截距:

 上述方程组的截距分别为:77/11=7;80/8=10;9/0=∞;6/1=6;
其中,最小截距为S4为基本变量的这个方程,因此将S4作为退基变量。其实就是相当于在可行解域图中找到了x 2 x_2x2轴上的截距最小的那个点,就是E点。

第三步,x2成为进基变量,S4作为退基变量后,用S4的方程作为主元行,消去方程组其他方程中的x2的系数,得到新的方程组:

 同时也消去目标函数中的x 2 x_2x2的系数,得到目标函数为:

 目标函数值为:Z = 1050。

 

第四步,重复上面第二步和第三步的方法,直到目标函数行不存在为负数的系数,结束。此时就是最优解。
目标函数方程

中,系数为负值的只有x1了,因此选取x1作为进基变量。
计算截距,77/11=7,32/10=3.2,9/1=0,6/0=∞ \infty∞;因此选第二个方程,S4已经是退基后的变量了,因此选S2作为退基变量。(此时,对应于可行解域图中D点。)
于是,用第二个方程作为主元行,消去x 1 x_1x1的系数,得到新的方程组,以及新的目标函数。

然后,再重复一次进基和退基之后,就能找到可行解域图中C点。然后消去得到新的方程组,以及新的目标函数后,目标函数中所有的系数都没有负数了,结束。此时,就得到最优解,就是在C点的位置。

参考文献:线性规划(LP)问题求解——单纯形法_lp松弛-CSDN博客

单纯形法:适用于约束条件和变量数目都很多的情况;对于变量数量较少的情况,以下介绍的计算几何的方法效率会更高。

1.3 计算几何的方法(待更新)

对于两个变量的线性规划问题,下面介绍的方法会更适用。不过这里面的会用到一些计算几何方面的知识。

1.3.1 分治式算法

对于线性规划问题,我们可以直接计算所有约束的可行解域(feasible region)。然后根据可行解域的边界交点,计算得到线性规划问题的最优解。

计算可行解域的最直接的方法,就是分治式算法,可计算任意 n 个约束的公共交集。算法伪代码如下:
INTERSECTHALFPLANES(H)
1.如果约束集H中约束的个数为1,返回;否则将约束集H分成两个子集H1和H2 ,大小分别为n/2;
2.如果子集H1中约束的个数大于1,调用INTERSECTHALFPLANES(H),继续将子集一分为二;
3.如果子集H1中约束的个数大于1,调用INTERSECTHALFPLANES(H),继续将子集一分为二;
4.否则,调用IntersectConvexRegions(H1 , H2)。

其中的子函数IntersectConvexRegions(H1 , H2)为计算两个凸多边形交集的算法。方法思路如下:

结论:函数IntersectConvexRegions(H1 , H2),可以 O(n)时间内计算出任意两个凸多边形的交集。

结论:给定平面上的一组共 n 个约束,可以使用线性的空间,在 O(nlogn)时间内计算出其公共的交集。

1.3.1 递增式算法

1.3.2 随机递增式算法

改进的平面扫描算法: 随机平面扫描算法。

1.3.3 无界线性规划问题*

无界线性规划问题。

 

参考文献:

最优化方法笔记3:约束最优化——线性规划(LP)问题_线性优化约束问题例题-CSDN博客

线性规划(LP)问题求解——单纯形法_lp松弛-CSDN博客

posted @ 2024-07-23 23:26  Gaowaly  阅读(4)  评论(0编辑  收藏  举报
``