对于包含1个优化目标,n个变量,m个线性约束条件的线性规划问题来说,首先这是一个凸优化问题,一定存在最优值,其次最优值的取值一定是在m个约束条件构建几何体的顶点上。那么怎么找到所有的顶点,并且找到其中对应最优值的那个顶点呢?单纯形法的思路为,
1. 找到一个顶点,也就是一个基可行解
2. 在这个基可行解的基础上,跳到目标函数更好的相邻的另一个顶点上
3. 直到没有更好的顶点为止
具体实施中需要解决:1. 什么是基可行解?2. 怎么根据该基可行解找到另一个目标函数更好的相邻的另一个可行解上?
对于如下线性规划问题,
[egin{array}{l}
max 3x + y + 3z\
2x + 2y + z le 30\
x + 2y + 3z le 25\
2x + y + z le 20\
x ge 0,y ge 0,z ge 0,
end{array}]
首先引入m个松弛变量把m个约束改写成等式
[egin{array}{l}
s1 = 30 - 2x - 2y - z\
s2 = 25 - x - 2y - 3z\
s3 = 20 - 2x - y - z\
s1 ge 0,s2 ge 0,s3 ge 0
end{array}]
整理m+1个等式,其中等式左边的定义为基变量,等式右边的为非基变量,常数值为非负
[egin{array}{l}
obj = 3x + y + 3z\
s1 = 30 - 2x - 2y - z\
s2 = 25 - x - 2y - 3z\
s3 = 20 - 2x - y - z
end{array}]
找到初始基变量:令非基变量x=0,y=0,z=0,那么基变量obj=0,s1=30,s2=23,s3=20。
对应的顶点为(0,0,0)
找到换入变量:选择任意一个在目标函数中系数为正的非基变量,如x,
[egin{array}{l}
s1 = 30 - 2x - 2y - z\
30/2 = 15\
s2 = 25 - x - 2y - 3z\
25/1 = 25\
s3 = 20 - 2x - y - z\
20/2 = 10
end{array}]
找到换出行:找到限制最大的一行,第三个等式进行转轴操作,也就是
[egin{array}{l}
s3 = 20 - 2x - y - z\
x = 10 - 0.5*s3 - 0.5*y - 0.5*z
end{array}]
转轴重写行:在剩下的三个等式中进行对应替换,也就是高斯-乔丹消元法,重新整理等式为,
[egin{array}{l}
obj = 30 - 1.5*s3 - 0.5*y + 1.5*z\
s1 = 10 + s3 - y\
s2 = 15 + 0.5*s3 - 1.5*y - 2.5*z\
x = 10 - 0.5*s3 - 0.5*y - 0.5*z
end{array}]
从而得到更好的基可行解s3=0,y=0,z=0,那么obj=30,s1=10,s2=15,x=10。
对应的顶点为(10,0,0)
重复上述找到换入变量,换出行,转轴重写行的步骤,直到找不到换入变量后,即为找到了最优解。
但是如果我们一开始找不到基可行解怎么办?例如
[egin{array}{l}
max x - y + z\
2x - y + 2z le 4\
2x - 3y + z le - 5\
- x + y - 2z le - 1
end{array}]
增加松弛变量
[egin{array}{l}
obj = x - y + z\
s1 = 4 - x2 + y - 2z\
s2 = - 5 - 2x + 3y - z\
s3 = - 1 + x - y + 2z
end{array}]
令x=0,y=0,z=0,那么obj=0,s1=4,s2=-5,s3=-1,不符合基变量非负的条件。
因此引入人工变量A,A≥0,如果A=0,那就是原问题了
目标变成了令A的值最小化
[egin{array}{l}
obj = - A\
s1 = 4 + A - x2 + y - 2z\
s2 = - 5 + A - 2x + 3y - z\
s3 = - 1 + A + x - y + 2z
end{array}]
找到A对应的 【常数值/A的系数】的比值最小值的所在行,进行转轴操作,
按照对应的步骤迭代变化,最终得到,
[egin{array}{l}
obj = - A\
s1 = 3 + 2A - s3 - x\
y = 2.2 - 0.6*A + 0.4*s2 + 0.2*s3 - 0.6*x\
z = 1.6 - 0.8*A + 0.2*s2 + 0.6*s3 - 0.2*x
end{array}]
求得A=0对应的基可行解,证明原来的问题是可行的,移除A=0
[egin{array}{l}
s1 = 3 - s3 - x\
y = 2.2 + 0.4*s2 + 0.2*s3 - 0.6*x\
z = 1.6 + 0.2*s2 + 0.6*s3 - 0.2*x
end{array}]
目标函数为,
[obj = - 0.6 - 0.2*s2 + 0.4*s3 + 0.2*x]
从而找到了一个基可行解,再重复换入变量,换出行,转轴重写行的步骤,就可以了。
参考:
https://www.coursera.org/lecture/lisan-youhua-suanfapian/3-3-1-xian-xing-gui-hua-FdjCX