单纯形法 参考博客 :
1 . 查找初始基可行解 :
2 . 最优解判定 :
3 . 迭代原则 :
4 . 单纯形法阶段总结 :
一、线性规划示例
使用单纯形法求解线性规划最优解 :
maxZ=3x1+4x2⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧2x1+x2≤40x1+3x2≤30xj≥0(j=1,2)
二、转化标准形式
首先将该线性规划转为标准形式 :
参考 【运筹学】线性规划数学模型标准形式 ( 标准形式 | 目标函数转化 | 决策变量转化 | 约束方程转化 | 固定转化顺序 | 标准形式转化实例 ) 线性规划 普通形式 -> 标准形式 转化顺序说明 博客 , 先处理变量约束 , 再将不等式转为等式 , 最后更新目标函数 ;
① 变量约束 : 首先查看变量约束 , 两个变量都是 ≥0 的 , 符合线性规划标准形式要求 ;
② 不等式转换 : 两个等式都是 小于等于不等式 , 需要 在不等式左侧加入松弛变量 , 将其转为等式 ;
- 2x1+x2≤40 , 左侧加入松弛变量 x3 , 变为 2x1+x2+x3=40
- x1+3x2≤30 , 左侧加入松弛变量 x4 , 变为 x1+3x2+x4=30
③ 更新目标函数 : 将 x3 和 x4 加入到目标函数中 , 得到新的目标函数 maxZ=3x1+4x2+0x3+0x4 ;
此时线性规划标准形式为 :
maxZ=3x1+4x2+0x3+0x4⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧2x1+x2+x3+0x4=40x1+3x2+0x3+x4=30xj≥0(j=1,2,3,4)
三、查找初始基可行解
找基矩阵 :
上述线性规划标准形式的系数矩阵为 ⎣⎡21131001⎦⎤ , 其中子矩阵中有 ⎣⎡1001⎦⎤ 单位阵 I ;
使用该单位阵 I 作为基矩阵 , 单位阵肯定是可逆的 , 其对应的基解 , 解出后的值就是右侧的常数值 , 肯定大于等于 0 , 是基可行解 ;
列出单纯形表 :
cj |
cj |
|
3 |
4 |
0 |
0 |
|
CB 基变量系数 (目标函数) |
基变量 |
常数 b
|
x1 |
x2 |
x3 |
x4 |
θi |
0 ( 目标函数 x3 系数 c3 ) |
x3 |
40 |
2 |
1 |
1 |
0 |
|
0 ( 目标函数 x4 系数 c4) |
x4 |
30 |
1 |
3 |
0 |
1 |
|
|
|
σj |
3 |
4 |
0 |
0 |
|
基变量是 x3 和 x4 , 基变量在约束条件中的系数矩阵 ⎣⎡1001⎦⎤ 就是基矩阵 , 这是个单位阵 ;
基变量是 x3 和 x4 在目标函数中的系数是 (00) ;
此时的基解是 ⎝⎜⎜⎛004030⎠⎟⎟⎞ , 该解是初始解 , 下面判定该解是否是最优解 ;
四、初始基可行解的最优解判定
使用 检验数矩阵 (CNT−CBTB−1N) 判断上述解 , 是否是最优解 , 该矩阵计算结果中所有的数 , 都是检验数 σ , 如果 所有的数都小于等于 0 , 说明该解就是最优解 ;
这里只求非基变量的检验数 , 即 x1 , x2 的检验数 ;
列出目标函数非基变量系数 (CNT−CBTB−1N) 矩阵 :
-
非基变量在目标函数中的系数矩阵 : CNT=(34)
-
基变量在目标函数中的叙述矩阵 : CBT=(00)
-
B−1N 是系数矩阵中经过矩阵变换后 , 基变量系数是单位阵 I , 非基变量系数是 B−1N : B−1N=⎣⎡2113⎦⎤
(CNT−CBTB−1N)=CNT=(34)−(00)×⎣⎡2113⎦⎤
=(σ1σ2)
其中 σ1 是目标函数中 x1 的系数 , σ2 是目标函数中的 x2 的系数 ;
如果上述两个系数都小于等于 0 , 那么当 非基变量 XN=(x1x2) 取值为 0 时 , 目标函数取值最大 ;
系数的计算公式为 : σj=cj−∑ciaij , 其中 cj 对应的是非基变量在目标函数系数 , ci 是基变量在目标函数中的系数 , aij 是 B−1N 中的矩阵向量 , 代表一列 ;
σ1=c1−(c3a11+c4a12)
σ1=3−(0×2)−(0×1)=3 , 是从下面的单纯形表中的如下位置提取的数值 ;

σ2=c2−(c3a21+c4a22)
σ2=4−(0×1)−(0×3)=4 , 是从下面的单纯形表中的如下位置提取的数值 ;

如果这两个系数 , 如果都小于等于 0 , 该 基可行解⎝⎜⎜⎛004030⎠⎟⎟⎞ 才是最优解 , 这两个系数都大于 0 , 因此不是最优解 ;
五、第一次迭代 : 入基与出基变量选择
入基变量选择 : 具体哪个变量入基 , 是由检验数决定的 , 检验数 σj 较大的入基 ; x2 的检验数 σ2 是 4 , 大于 σ1=3 , 因此这里选择 x2 作为入基变量 ;
出基变量选择 : 系数矩阵中 , 常数列 b=(4030) , 分别除以除以入基变量大于 0 的系数列 (13) , 得出结果是 (4010) , 然后选择一个最小值 10 , 查看该最小值对应的变量是 x4 , 选择该变量作为出基变量 ;

这里将出基变量与入基变量选择好了 , x2 的检验数较大 , 选择 x2 作为入基变量 , x4 的 θ4 较小 , 选择 x4 作为出基变量 ;
入基出基操作完成后 , 基变量变成了 x3,x2 ;
六、第一次迭代 : 方程组同解变换
方程组做同解变换 :
线性规划原始方程组为 ⎩⎪⎨⎪⎧2x1+x2+x3+0x4=40x1+3x2+0x3+x4=30 , 需要将 x2 的系数变为 (01) , x3 的系数保持 (10) 不变 ;
方程 2 同解变换 : 在 x1+3x2+0x3+x4=30 中 , 需要将 x2 的系数变成 1 , 在方程两端乘以 31 , 此时方程变成 31x1+x2+0x3+31x4=10 ;
方程 1 同解变换 : 将上述方程 2 作同解变换后 , 方程组变成 ⎩⎪⎪⎨⎪⎪⎧2x1+x2+x3+0x4=4031x1+x2+0x3+31x4=10 , 目前的需求是将方程 1 的 x2 系数变为 0 , 使用方程 1 减去 方程 2 即可得到要求的矩阵 :
(2−31)x1+0x2+x3+(0−31)x435x1+0x2+x3−31x4==40−1030
最终方程 1 转化为 35x1+0x2+x3−31x4=30 ;
同解变换完成后的方程组为 ⎩⎪⎪⎪⎨⎪⎪⎪⎧35x1+0x2+x3−31x4=3031x1+x2+0x3+31x4=10
七、第一次迭代 : 生成新的单纯形表
单纯形表变成如下形式 : 下面的单纯形表中 , 上面部分是初始基可行解对应的单纯形表 , 下面的部分是本次迭代后生成的新的单纯形表 ;
将同解变换后的方程组中的 系数矩阵 , 和 常数 , 填入新的单纯形表中 ;
cj |
cj |
|
3 |
4 |
0 |
0 |
|
CB 基变量系数 (目标函数) |
基变量 |
常数 b
|
x1 |
x2 |
x3 |
x4 |
θi |
0 ( 目标函数 x3 系数 c3 ) |
x3 |
40 |
2 |
1 |
1 |
0 |
40 ( θ3 ) |
0 ( 目标函数 x4 系数 c4) |
x4 |
30 |
1 |
3 |
0 |
1 |
10 ( θ4 ) |
σj |
|
|
3 ( σ1 ) |
4 ( σ2 ) |
0 |
0 |
|
– |
– |
– |
– |
– |
– |
– |
– |
0 ( 目标函数 x3 系数 c3 ) |
x3 |
30 |
35 |
0 |
1 |
−31 |
? ( θ3 ) |
4 ( 目标函数 x2 系数 c2) |
x2 |
10 |
31 |
1 |
0 |
31 |
? ( θ2 ) |
σj ( 检验数 ) |
|
|
35 ( σ1 ) |
0 |
0 |
−34 ( σ4 ) |
|
八、第一次迭代 : 解出基可行解
新的 基变量是 x3,x2 , 对应的基矩阵是 (1001) , 非基变量是 x1,x4 , 对应的非基矩阵是 ⎝⎜⎛35−313131⎠⎟⎞ , 将非基变量设置为 0 , 方程组为 ⎩⎪⎪⎪⎨⎪⎪⎪⎧35×0+0x2+x3−31×0=3031×0+x2+0x3+31×0=10 , 解出基变量为 ⎩⎪⎨⎪⎧x3=30x2=10 , 基可行解 为 ⎝⎜⎜⎛010300⎠⎟⎟⎞
九、第一次迭代 : 计算检验数 σj 判定最优解 并选择入基变量
根据 【运筹学】线性规划数学模型 ( 单纯形法 | 最优解判定原则 | 单纯形表 | 系数计算方法 | 根据系数是否小于等于 0 判定最优解 ) 博客中分析 , 检验数计算公式为 :
-
矩阵形式 : CNT−CBTB−1N
-
单个检验数计算公式 : σj=cj−∑ciaij
基变量的检验数是 0 , 主要是求非基变量的检验数 σ1,σ4 ;
σ1=c1−(c3a11+c2a12)
σ1=3−(0×35)−(4×31)=35 , 是从下面的单纯形表中的如下位置提取的数值 ;

σ4=c4−(c3a41+c2a42)
σ4=0−(0×−31)−(4×31)=−34 , 是从下面的单纯形表中的如下位置提取的数值 ;

检验数 ⎩⎪⎪⎪⎨⎪⎪⎪⎧σ1=3−(0×35)−(4×31)=35σ4=0−(0×−31)−(4×31)=−34 , σ1 是大于 0 的 , 两个检验数必须都小于等于 0 , 该基可行解才算作是最优解 , 因此 该基可行解不是最优解 ;
根据检验数选择入基变量 : 继续迭代 , 选择检验数较大的非基变量 , 作为入基变量 , 这里入基变量是 x1 ;
十、第一次迭代 : 根据入基变量计算并选择出基变量
参考博客 【运筹学】线性规划数学模型 ( 单纯形法 | 迭代原则 | 入基 | 出基 | 线性规划求解示例 ) 五、出基与入基变量选择
入基变量 根据检验数 σ 选择的是 x1 ;
出基变量是根据 θ 值来选择的 , 选择 θ 值较小的值对应的基变量作为出基变量 ;
θ 值计算 : 常数列 b=(3010) , 分别除以除以入基变量 x1 大于 0 的系数列 ⎝⎜⎜⎛3531⎠⎟⎟⎞ , 计算过程如下 ⎝⎜⎜⎜⎜⎜⎜⎜⎛35303110⎠⎟⎟⎟⎟⎟⎟⎟⎞ , 得出结果是 ⎝⎛1830⎠⎞ , 然后选择一个最小值 18 , 查看该最小值对应的变量是 x3 , 选择该变量作为出基变量 ;

x1 作入基变量 , x3 作出基变量 ; 使用 x1 替代基变量中 x3 的位置 ;
迭代后的基变量为 x1,x2 ;
更新一下单纯形表 :
cj |
cj |
|
3 |
4 |
0 |
0 |
|
CB 基变量系数 (目标函数) |
基变量 |
常数 b
|
x1 |
x2 |
x3 |
x4 |
θi |
0 ( 目标函数 x3 系数 c3 ) |
x3 |
40 |
2 |
1 |
1 |
0 |
40 ( θ3 ) |
0 ( 目标函数 x4 系数 c4) |
x4 |
30 |
1 |
3 |
0 |
1 |
10 ( θ4 ) |
σj |
|
|
3 ( σ1 ) |
4 ( σ2 ) |
0 |
0 |
|
– |
– |
– |
– |
– |
– |
– |
– |
0 ( 目标函数 x3 系数 c3 ) |
x3 |
30 |
35 |
0 |
1 |
−31 |
18 ( θ3 ) |
4 ( 目标函数 x2 系数 c2) |
x2 |
10 |
31 |
1 |
0 |
31 |
30 ( θ2 ) |
σj ( 检验数 ) |
|
|
35 ( σ1 ) |
0 |
0 |
−34 ( σ4 ) |
|
十一、第二次迭代 : 方程组同解变换
当前的方程组为 ⎩⎪⎪⎪⎨⎪⎪⎪⎧35x1+0x2+x3−31x4=3031x1+x2+0x3+31x4=10 , 选择 x1,x2 作为基变量 , 基矩阵为 ⎝⎜⎜⎛350311⎠⎟⎟⎞ , 进行同解变换 , 将基矩阵转为单位阵 ;
方程 1 同解变换 :
将 35x1+0x2+x3−31x4=30 方程中的 x1 的系数变为 1 , x2 的系数为 0 保持不变 ;
方程的左右变量乘以 53 :
35x1+0x2+x3−31x4(35x1+0x2+x3−31x4)×53x1+0x2+53x3−51x4===3030×5318
当前方程组变成 ⎩⎪⎪⎪⎨⎪⎪⎪⎧x1+0x2+53x3−51x4=1831x1+x2+0x3+31x4=10
方程 2 同解变换 : 将方程 1 乘以 −31 , 与方程 2 相加 ;
① 方程 1 乘以 −31 :
(x1+0x2+53x3−51x4)×−31−31x1+0x2+−51x3+151x4==18×−31−6
② 与方程 2 相加 :
(−31x1+0x2+−51x3+151x4)+(31x1+x2+0x3+31x4)0x1+x2−51x3+52x4==−6+104
当前方程组变成 ⎩⎪⎪⎪⎨⎪⎪⎪⎧x1+0x2+53x3−51x4=180x1+x2−51x3+156x4=4
十二、第二次迭代 : 生成新的单纯形表
更新一下单纯形表 : 将第三次迭代的矩阵填入下面的单纯形表中 ;
cj |
cj |
|
3 |
4 |
0 |
0 |
|
CB 基变量系数 (目标函数) |
基变量 |
常数 b
|
x1 |
x2 |
x3 |
x4 |
θi |
0 ( 目标函数 x3 系数 c3 ) |
x3 |
40 |
2 |
1 |
1 |
0 |
40 ( θ3 ) |
0 ( 目标函数 x4 系数 c4) |
x4 |
30 |
1 |
3 |
0 |
1 |
10 ( θ4 ) |
σj |
|
|
3 ( σ1 ) |
4 ( σ2 ) |
0 |
0 |
|
第一次迭代 |
– |
– |
– |
– |
– |
– |
– |
0 ( 目标函数 x3 系数 c3 ) |
x3 |
30 |
35 |
0 |
1 |
−31 |
18 ( θ3 ) |
4 ( 目标函数 x2 系数 c2) |
x2 |
10 |
31 |
1 |
0 |
31 |
30 ( θ2 ) |
σj ( 检验数 ) |
|
|
35 ( σ1 ) |
0 |
0 |
−34 ( σ4 ) |
|
第二次迭代 |
– |
– |
– |
– |
– |
– |
– |
3 ( 目标函数 x1 系数 c1 ) |
x1 |
18 |
1 |
0 |
53 |
−51 |
? ( θ3 ) |
4 ( 目标函数 x2 系数 c2) |
x2 |
4 |
0 |
1 |
−51 |
52 |
? ( θ2 ) |
σj ( 检验数 ) |
|
|
0 |
0 |
? ( σ3 ) |
? ( σ4 ) |
|
十三、第二次迭代 : 计算检验数、最优解判定
计算检验数 σ :
σ3=0−3×53−4×(−51)=−59+54=−1
σ4=0−3×(−51)−4×52=53−58=−1
两个非基变量的检验数都是小于等于 0 的 , 因此该基可行解 ⎝⎜⎜⎛18400⎠⎟⎟⎞是最优解 ;