单纯形法
主要来自《算法导论》
标准型
最大化n∑j=1cjxj满足约束n∑j=1aijxj≤bi,i=1,2,...mxj≥0,j=1,2,...m
例题
最大化
3x1+x2+2x3
满足约束
x1+x2+3x3≤302x1+2x2+5x3≤244x1+x2+2x3≤36
1.转换成松弛型
z=3x1+x2+2x3x4=30−x1−x2−3x3x5=24−2x1−2x2−5x3x6=36−4x1−x2−2x3
2.找到基本解
如果所有的x1,...x6都是非负的,就说明这个解是可行的
把等式右边的所有(非基本)变量设为0,计算左边(基本)变量的值,可以得到基本解为(0,0,0,30,24,36)
如果一个基本解是可行的,则将其称为基本可行解。在单纯形算法执行过程中,基本解几乎总是基本可行解
3.增大目标值
每次迭代的目标是让基本解有一个更大的目标值。因此选择一个在目标函数中系数为正值的非基本变量xe,尽可能增加xe的值而不违反任何约束。
为了避免xe违反约束并找到最大的值,考虑将变量xe成为基本变量,而让另一个变量xl成为非基本变量
个人理解:因为基本解几乎总是基本可行解,所以将xe放到左边,更容易找到xe的最大值
3.1 以x1为主元
注意到增加x1时,x4,x5,x6随之减小。对每个变量有一个非负的约束,不能让其中一个变成负值。注意到三个约束分别为30/1,24/2,36/4,其中第三个约束最紧(为9)
考虑将x1作为主元,对第三个式子进行变换
x1=9−x24−x32−x64
所以
x4=30−x1−x2−3x3=30−(9−x24−x32−x64)−x2−3x3=21−34x2−52x3−x64
类似地,得到
x5=6−3x22−4x3+x62
z=27+x24+x32−3x64
基本解为(9,0,0,21,6,0),目标值为27
3.2 以x3为主元
注意到约束分别为18,42/5,3/2,第三个约束是最紧的
z=1114+116x2−18x5−1116x6x1=334−116x2+18x5−516x6x3=32−38x2−14x5+18x6x4=694+316x2+58x5−1116x6
基本解为(33/4,0,3/2,69/4,0,0),目标值为111/4
3.3 以x2为主元
三个约束分别为132,4,∞,第二个约束最紧
z=28−16x3−16x5−23x6x1=8+16x3+16x5−13x6x2=4−38x3−23x5−13x6x4=18−12x3+12x5
此时目标函数中所有的系数都是负的,这种情况只发生在重写的线性规划使得基本解就是一个最优解的情况
解(8,4,0,18,0,0),目标值为28为最优
正式的单纯形法
需要解决的问题
- 如何确定一个线性规划是否可行
- 如果线性规划可行,初始基本解不可行,该怎么办
- 如何确定一个线性规划是无界的
- 如何选择换入变量和换出变量
输入
- m×n 矩阵 A=(aij)
- m维的向量b=(bi)
- n维向量c=(cj)
返回:
- 可行,初始基本解可行的松弛型,n维向量¯¯¯x=(¯¯¯x)
- 不可行
单纯形法伪代码
第一行调用INITIALIZE-SIMPLEX(A,b,c)
,确定这个线性规划是否可行。
如果目标函数中所有的系数都是负值,第2行的while
循环终止;否则在第3行,选择一个在目标函数中系数为正值的变量xe作为换入变量。
下一步,在4-8行,检查每个约束,挑选出最严格的限制xe能增加而不违反非负约束的那个约束,记和这个约束关联的基本变量是xl。此时如果没有约束限制换入变量能够增加的量,在第10行返回“无界”
然后调用主元过程,呼唤换入变量与换出变量的角色。
第12-15行,通过把所有非基本变量设为0以及把每个基本变量¯¯¯¯¯xi设为bi,来计算初始线性规划变量¯¯¯¯¯x1...¯¯¯¯¯¯xn的一个解,将其作为最优解。
TODO
- 证明如果
SIMPLEX
有一个初始可行解且最终会结束,那么它要么返回一个可行解,要么确定线性规划无界
- 说明
SIMPLEX
会终止
- 说明返回的解是最优的
这部分详细证明见《算法导论》P493
对偶性
引入原因:前面已经说明了单纯形法能终止,但没有证明确实能找到一个最优解。因此引入线性规划对偶性
例题
以上文例题为例
z=3x1+x2+2x3x1+x2+3x3≤302x1+2x2+5x3≤244x1+x2+2x3≤36
其对偶线性规划为
最小化
30y1+24y2+36y3
满足约束
y1+2y2+4y3≥3y1+2y2+y3≥13y1+5y2+2y3≥2
其中y1,y2,y3≥0
正确性
定理29.10,证明对偶线性规划的最优值总是等于原线性规划的最优值。单纯形法同时解决了原线性规划和对偶线性规划
线性规划弱对偶性
令¯¯¯x表示原线性规划的任意一个可行解,¯¯¯y表示对偶线性规划的任意一个可行解。则
n∑j=1cj¯¯¯¯¯xj≤m∑i=1bi¯¯¯¯¯yj
证明基本是求和号变换的过程
推论
如果
n∑j=1cj¯¯¯¯¯xj=m∑i=1bi¯¯¯¯¯yj
则¯¯¯x和¯¯¯y分别是原线性规划和对偶线性规划的最优解
初始基本可行解
目标:
- 如何测试一个线性规划是否可行
- 如果可行,如何产生一个基本解可行的松弛型
即叙述INITIALIZE-SIMPLEX
的过程
反例:初始基本解不可行
最大化z=2x1−x2满足约束2x1−x2≤2x1−5x2≤−4x1,x2≥0
如果要将这个线性规划转换为松弛型,基本解为x1=x2=0,显然违反了一个约束,所以这不是一个可行解。
为了确定他是否有可行解,可以指定一个辅助线性规划,可以帮助找到一个基本解可行的松弛型,进而判断是否可行
辅助线性规划
引理
以标准型线性规划L为例
最大化n∑j=1cjxj满足约束n∑j=1aijxj≤bi,i=1,2,...mxj≥0,j=1,2,...m
令Laux是下面带有n+1个变量的线性规划
最大化−x0满足约束n∑j=1aijxj−x0≤bi,i=1,2,...mxj≥0,j=1,2,...m
当且仅当Laux的最优目标值是0时,L是可行的
算法
下面是伪代码
1-3行,测试了L的初始松弛型的基本解,如果这个解可行,返回这个松弛型
第4行构造引理中的Laux,因为L的初始基本解不可行,所以Laux的初始基本解不可行。在第7行执行一次主元过程,把x0换入,xl为换出变量,其中l在第1行中选择为最小的bi的下标。
然后可以在第9行重复主元来解决辅助线性规划。如果找到一个目标值为0的Laux的最优解,那么就可以在第11行中为L构造一个基本解可行的松弛型,在约束中删除所有的x0项,恢复初始目标函数。
如果在第10行发现初始L不可行,那么在第12行返回
实例
对于前面构造的反例
最大化z=2x1−x2满足约束2x1−x2≤2x1−5x2≤−4x1,x2≥0
构造辅助线性规划为
最大化−x0满足约束2x1−x2−x0≤2x1−5x2−x0≤−4x1,x2,x0≥0
根据引理,如果最优目标值是0,则初始线性规划有一个可行解。如果辅助线性规划的最优目标数是正数,则没有可行解
写成松弛型
z=−x0x3=2−2x1+x2+x0x4=−4−x1+5x2+x0
选择x0作为换入变量,最小的bi是−4,对应x4。所以换出变量应为x4
z=−4−x1+5x2−x4x0=4+x1−5x2+x4x3=6−x1−4x2+x4
对应的基本解(4,0,0,6,0)这是可行的。
重复调用主元过程,直到得到Laux的最优解。以x2为换入变量,x0为换出变量(∵ 4/5<6/4)
z=−x0x2=45−15x0+15x1+15x4x3=145−45x0−95x1+15x4
这个解有x0=0,所以初始问题是可行的,将x0从约束集合中删去
z=2x1−x2=2x1−(45−15x0+15x1+15x4)=45+95x1−15x4
x2=45+95x1−15x4x3=145−95x1+15x4
线性规划基本定理
以标准型给出任意的线性规划L可以是以下三者之一:
- 有一个有限目标值的最优解
- 不可行
- 无界
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具