单纯形法笔记
单纯形法
主要来自《算法导论》
标准型
例题
最大化
满足约束
1.转换成松弛型
2.找到基本解
如果所有的\(x_1,...x_6\)都是非负的,就说明这个解是可行的
把等式右边的所有(非基本)变量设为0,计算左边(基本)变量的值,可以得到基本解为(0,0,0,30,24,36)
如果一个基本解是可行的,则将其称为基本可行解。在单纯形算法执行过程中,基本解几乎总是基本可行解
3.增大目标值
每次迭代的目标是让基本解有一个更大的目标值。因此选择一个在目标函数中系数为正值的非基本变量\(x_e\),尽可能增加\(x_e\)的值而不违反任何约束。
为了避免\(x_e\)违反约束并找到最大的值,考虑将变量\(x_e\)成为基本变量,而让另一个变量\(x_l\)成为非基本变量
个人理解:因为基本解几乎总是基本可行解,所以将\(x_e\)放到左边,更容易找到\(x_e\)的最大值
3.1 以\(x_1\)为主元
注意到增加\(x_1\)时,\(x_4,x_5,x_6\)随之减小。对每个变量有一个非负的约束,不能让其中一个变成负值。注意到三个约束分别为\(30/1,24/2,36/4\),其中第三个约束最紧(为9)
考虑将\(x_1\)作为主元,对第三个式子进行变换
所以
类似地,得到
基本解为\(\left(9,0,0,21,6,0\right)\),目标值为27
3.2 以\(x_3\)为主元
注意到约束分别为\(18,42/5,3/2\),第三个约束是最紧的
基本解为\(\left(33/4,0,3/2,69/4,0,0\right)\),目标值为\(111/4\)
3.3 以\(x_2\)为主元
三个约束分别为\(132,4,\infty\),第二个约束最紧
此时目标函数中所有的系数都是负的,这种情况只发生在重写的线性规划使得基本解就是一个最优解的情况
解\(\left(8,4,0,18,0,0\right)\),目标值为\(28\)为最优
正式的单纯形法
需要解决的问题
- 如何确定一个线性规划是否可行
- 如果线性规划可行,初始基本解不可行,该怎么办
- 如何确定一个线性规划是无界的
- 如何选择换入变量和换出变量
输入
- $m\times n $ 矩阵 \(\bold A=(a_{ij})\)
- \(m\)维的向量\(\bold b=(b_i)\)
- \(n\)维向量\(\bold c=(c_j)\)
返回:
- 可行,初始基本解可行的松弛型,\(n\)维向量\(\overline {\bold x}=\left(\overline x\right)\)
- 不可行
单纯形法伪代码
第一行调用INITIALIZE-SIMPLEX(A,b,c),确定这个线性规划是否可行。
如果目标函数中所有的系数都是负值,第2行的while循环终止;否则在第3行,选择一个在目标函数中系数为正值的变量\(x_e\)作为换入变量。
下一步,在4-8行,检查每个约束,挑选出最严格的限制\(x_e\)能增加而不违反非负约束的那个约束,记和这个约束关联的基本变量是\(x_l\)。此时如果没有约束限制换入变量能够增加的量,在第10行返回“无界”
然后调用主元过程,呼唤换入变量与换出变量的角色。
第12-15行,通过把所有非基本变量设为0以及把每个基本变量\(\overline{x_i}\)设为\(b_i\),来计算初始线性规划变量\(\overline{x_1}...\overline{x_n}\)的一个解,将其作为最优解。
TODO
- 证明如果
SIMPLEX有一个初始可行解且最终会结束,那么它要么返回一个可行解,要么确定线性规划无界 - 说明
SIMPLEX会终止 - 说明返回的解是最优的
这部分详细证明见《算法导论》P493
对偶性
引入原因:前面已经说明了单纯形法能终止,但没有证明确实能找到一个最优解。因此引入线性规划对偶性
例题
以上文例题为例
\[z = 3x_1+x_2+2x_3 \\ x_1+x_2+3x_3\le30 \\ 2x_1+2x_2+5x_3\le24\\ 4x_1+x_2+2x_3\le36 \]
其对偶线性规划为
最小化
满足约束
其中\(y_1,y_2,y_3\ge0\)
正确性
定理29.10,证明对偶线性规划的最优值总是等于原线性规划的最优值。单纯形法同时解决了原线性规划和对偶线性规划
线性规划弱对偶性
令\(\overline x\)表示原线性规划的任意一个可行解,\(\overline y\)表示对偶线性规划的任意一个可行解。则
证明基本是求和号变换的过程
推论
如果
则\(\overline x\)和\(\overline y\)分别是原线性规划和对偶线性规划的最优解
初始基本可行解
目标:
- 如何测试一个线性规划是否可行
- 如果可行,如何产生一个基本解可行的松弛型
即叙述INITIALIZE-SIMPLEX的过程
反例:初始基本解不可行
如果要将这个线性规划转换为松弛型,基本解为\(x_1=x_2=0\),显然违反了一个约束,所以这不是一个可行解。
为了确定他是否有可行解,可以指定一个辅助线性规划,可以帮助找到一个基本解可行的松弛型,进而判断是否可行
辅助线性规划
引理
以标准型线性规划\(L\)为例
\[\text{最大化}\sum^n_{j=1}c_jx_j \\ \text{满足约束}\\ \sum^n_{j=1}a_{ij}x_j \le b_i,i=1,2,...m \\ x_j\ge0,j=1,2,...m\\ \]
令\(L_{aux}\)是下面带有n+1个变量的线性规划
当且仅当\(L_{aux}\)的最优目标值是0时,\(L\)是可行的
算法
下面是伪代码
1-3行,测试了\(L\)的初始松弛型的基本解,如果这个解可行,返回这个松弛型
第4行构造引理中的\(L_{aux}\),因为\(L\)的初始基本解不可行,所以\(L_{aux}\)的初始基本解不可行。在第7行执行一次主元过程,把\(x_0\)换入,\(x_l\)为换出变量,其中l在第1行中选择为最小的\(b_i\)的下标。
然后可以在第9行重复主元来解决辅助线性规划。如果找到一个目标值为0的\(L_{aux}\)的最优解,那么就可以在第11行中为\(L\)构造一个基本解可行的松弛型,在约束中删除所有的\(x_0\)项,恢复初始目标函数。
如果在第10行发现初始\(L\)不可行,那么在第12行返回
实例
对于前面构造的反例
\[\text{最大化}z = 2x_1-x_2 \\ \text{满足约束}\\ 2x_1-x_2\le2 \\ x_1-5x_2\le-4\\ x_1,x_2\ge0 \]
构造辅助线性规划为
根据引理,如果最优目标值是0,则初始线性规划有一个可行解。如果辅助线性规划的最优目标数是正数,则没有可行解
写成松弛型
选择\(x_0\)作为换入变量,最小的\(b_i\)是\(-4\),对应\(x_4\)。所以换出变量应为\(x_4\)
对应的基本解\((4,0,0,6,0)\)这是可行的。
重复调用主元过程,直到得到\(L_{aux}\)的最优解。以\(x_2\)为换入变量,\(x_0\)为换出变量\((\because~4/5<6/4)\)
这个解有\(x_0=0\),所以初始问题是可行的,将\(x_0\)从约束集合中删去
线性规划基本定理
以标准型给出任意的线性规划\(L\)可以是以下三者之一:
- 有一个有限目标值的最优解
- 不可行
- 无界

浙公网安备 33010602011771号