文章目录
前言
大学的《运筹学》课程中,手算单纯形法是期末的必考题了!(记得期末考试前一周,几个经常逃课的同学来我宿舍楼下,叫了辆车载我去星巴克给他们讲解这个算法,活活讲了一个多小时他们才听懂,不知道最后及格了没哈哈!)当时已经觉得是信手拈来了,但是时间久了+计算过程本身也比较繁琐,慢慢就忘了。后面为了应付面试,又拾起过,但是面完试细节又给忘了,只记得是在可行域的顶点上来回搜索。
这次想完整的梳理一篇文章(本文是跟着某位大佬的博客,在某些地方掺杂了一些自己的思考和补充知识点汇总的),帮助自己再次回顾和更深的理解单纯形法,原因是在看一些更高阶的算法时,常常需要单纯形法的预备知识!不然就很难继续往下看懂了。
废话有点多了,进入正题吧!
线性规划的标准形式
因为单纯形法就是建立在标准形式之上,在解空间沿着边界的顶点(称为单纯形,“单纯形” 用于描述凸多面体中的极端点或顶点),逐步改进目标值。所以先快速过一下如何将一个线性规划问题转为标准形式!
标准形式三要素:
- 目标函数 m i n i m i z e minimize minimize 或者 m a x i m i z e maximize maximize都行,不同教材选择不一样,本文用 m i n i m i z e minimize minimize;
- 不是minimize怎么办,取负就可以了。
- 约束条件等式化;
- 不是等式怎么办?如果是 > = >= >=,左端减去松弛变量即可,如果是 < = <= <=,左端加上剩余变量即可(这两个变量我看定义也有反过来的,不做纠结了,都当作是辅助变量即可)。
- 决策变量非负化。
也就是:
其中:
一个例子理解单纯形法
4个步骤:
- 将线性规划问题转化为标准形式;
- 找到一个初始可行解;
- 不断地进行旋转(pivot)操作(本质上是在顶点游走的过程);
- 重复步骤3直到解不能改进为止。
🌰栗子来了:
用单纯形法求解下面这个线性规划问题:
1. 将线性规划转化为标准形式
为了将不等式化为等式,我们引入了 x 4 x_4 x4、 x 5 x_5 x5、 x 6 x_6 x6、 x 7 x_7 x7 4个辅助
2. 找到一个初始可行解
step 1: 将辅助变量用非辅助变量表示:
下式中左侧的变量都称为「基变量」,右边的变量都称为「非基变量」
step 2: 将非基变量全部取0,得到一个基本解(0, 0, 0, 4, 2, 3, 6),很明显是可行的(不可行的情况后面在badcase里再讨论),我们称之为:基本可行解。此时的目标值 z = 0 z=0 z=0。
备注:初始可行解中,辅助变量–>基变量,原来的那些变量–>非基变量。
3. 旋转操作
【第一轮旋转】
step 1: 在目标函数里找到一个系数为负的非基变量,作为入基变量
这么做的原因是,我们现在的目标函数是 m i n i m i z e minimize minimize,现在有一个初始可行解了,我们怎么找到一个目标值更小的解呢?只要将目标函数里系数为负的变量,在满足约束的前提下,进一步减小就可以了!(这与在单纯形表中计算检验数 reduce cost 是一个思想,对于检验数的深入理解,见我的文章运筹学基础(四):单纯形法中检验数(reduced cost)的理解)
这里假设我们选取了 x 1 x_1 x1(这里有一个技巧,总是选择符合条件的下标最小的非基变量,原因是为了避免退化,后面badcase里会再讲)。
step2:将入基变量用基变量表示,准备替换:
update一下,今天看一本优化相关的书,他提到的如果选择出基变量的方法是:用约束方程中的常数项除以入基变量的系数,选择比值最小的那个(其实本质上也是选择约束最紧的那个),我觉得这个方式更简洁明了!
因为我们选择的 x 1 x_1 x1作为入基变量,上面第2个式子和第3个式子中都有 x 1 x_1 x1,用上述方法除完分别是:4/1=1, 2/1=2,因此选择 x 1 = 2 − x 5 x_1= 2-x_5 x1=2−x5。
因为我们选择的 x 1 x_1 x1作为入基变量,上面第2个式子和第3个式子中都有 x 1 x_1 x1,我们选择哪个来表示 x 1 x_1 x1呢? 我们来比较一下:
- 用第2个式子表示 x 1 = 4 − x 2 − x 3 − x 4 x_1 =4-x_2-x_3-x_4 x1=4