单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第1张图片

在上一篇文章中,

张敬信:【运筹学】单纯形法求解线性规划问题的Matlab实现​zhuanlan.zhihu.com
单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第2张图片

讨论了单纯形法求解线性规划问题,但是它需要约束系数矩阵包含一个单位矩阵,对应的变量指定为初始基变量。一般情况下,是不能保证这一点的,因此需要引入人工变量法,即添加人工变量构造出单位矩阵。

求解带有人工变量的线性规划问题,通常有两种方法:大M法和两阶段法。

一、大M法

例如,

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第3张图片

引入人工变量

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第4张图片

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第5张图片

Matlab实现:

不需要重新写函数,调用上次的 SimplexMax 函数(见上一篇),就能实现。

%% 大M法
M = 10000;
A = [3 2 -3 1 0; 1 -2 1 0 1];
b = [6; 4];
c = [3 -1 -2 -M -M];
ind = [4 5];
[x, z, ST, ca] = SimplexMax(c, A, b, ind)

运行结果:

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第6张图片

ba4efd0a5546314b58e23425a38a5d8b.png

当然也可以进一步把单纯形表 ST 写入 Excel(见上一篇略)。

注:若运行结果不正确,是中间遇到两个相同的最小

,默认的最小下标不对,需要选另一个下标。另外,使用大M法时,需要用最大数代替M,但当某些系数与之较接近时,还是可能会出错。

二、两阶段法

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第7张图片

所以,两阶段法无非就是调用两次 SimplexMax 函数(见上一篇),从第一次返回结果中,取出需要的信息用于第二次的输入,把这个衔接做好即可。

例如,

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第8张图片

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第9张图片

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第10张图片

注意:原问题目标函数无论是求MAX还是求MIN,构造的 第一阶段问题目标函数都是求最小MIN。

用单纯形法求解若所得可行解目标函数值为0,表明原规划问题有基可行解。转入第二步:去掉人工变量,得到第二阶段的单纯形表,继续用单纯形法求解。

Matlab实现:

%% 第一阶段
A1 = [1 1 -1 0 0 1 0; 1 0 0 -1 0 0 1; 2 1 0 0 1 0 0];
b1 = [350; 125; 600];
c1 = [0 0 0 0 0 -1 -1];
ind1 = [6 7 5];
[x1, z1, ST1, ca1] = SimplexMax(c1, A1, b1, ind1)

运行结果:

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第11张图片

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第12张图片
%% 第二阶段
A2 = ST1(end-m1:end-1,4:end-3);   %2个人工变量, 2+1
b2 = ST1(end-m1:end-1,3);
c2 = [-2 -3 0 0 0];
ind2 = ST1(end-m1:end-1,2)';
[x2, z2, ST2, ca2] = SimplexMax(c2, A2, b2, ind2)

运行结果:

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第13张图片

单纯形法matlab_【运筹学】单纯形法之大M法和两阶段法_第14张图片

也可以进一步,把两个单纯形表 ST1 和 ST2 写入一个 Excel文件(注意错开位置,略)。

————————————————————————————

主要参考文献:

胡运权,运筹学原理及应用(第六版),及其课件

————————————————————————————————

原创作品,转载请注明,版权所有,禁止盗用。

你可能感兴趣的:(单纯形法matlab)