单纯形法求解线性规划问题示例

单纯形法求解线性规划问题示例

引言

今天被一个人问到了一个线性规划问题,这个问题我印象中只有在数学建模中会出现,于是就研究了一下,这里做一个记录。

示例

线性规划问题如下:
max z = 90 x 1 + 70 x 2 s . t . { x 1 + x 2 ≤ 16 3 x 1 + 2 x 2 ≤ 36 5 x 2 ≤ 65 x 1 , x 2 ≥ 0 (1) \text{max} \quad z = 90x_1 + 70x_2 \\ \begin{align} s.t.\left\{\begin{matrix} x_1 + x_2 &\le 16 \\ 3x_1 + 2x_2 &\le36 \\ 5x_2 &\le 65\\ x_1, x_2 &\ge 0 \end{matrix}\right. \nonumber \end{align} \tag{1} maxz=90x1+70x2s.t. x1+x23x1+2x25x2x1,x21636650(1)
先将模型化为标准型:
max z = 90 x 1 + 70 x 2 s . t . { x 1 + x 2 + x 3 = 16 3 x 1 + 2 x 2 + x 4 = 36 5 x 2 + x 5 = 65 x 1 , x 2 , x 3 , x 4 , x 5 ≥ 0 (2) \text{max} \quad z = 90x_1 + 70x_2 \\ \begin{align} s.t.\left\{\begin{matrix} x_1 + x_2 + x_3 &= 16 \\ 3x_1 + 2x_2 + x_4 &= 36\\ 5x_2 + x _5 &= 65\\ x_1, x_2,x_3,x_4,x_5 &\ge 0 \nonumber \end{matrix}\right. \end{align} \tag{2} maxz=90x1+70x2s.t. x1+x2+x33x1+2x2+x45x2+x5x1,x2,x3,x4,x5=16=36=650(2)
标准形式下的约束条件系数矩阵的增广矩阵可以表示为:
[ 1 1 1 0 0 ∣ 16 3 2 0 1 0 ∣ 36 0 5 0 0 1 ∣ 65 ] \begin{bmatrix} 1 & 1 & 1 & 0 & 0 &| 16\\ 3 & 2 & 0 & 1 & 0 &|36 \\ 0 & 5 & 0 & 0 & 1 &|65 \end{bmatrix} 130125100010001∣16∣36∣65
显然,我们应将 x 3 , x 4 , x 5 x_3, x_4, x_5 x3,x4,x5 视为基变量,且将 x 1 , x 2 x_1, x_2 x1,x2 视作非基变量。接下来,令 x 1 , x 2 = 0 x_1, x_2 = 0 x1,x2=0,找到初始基可行解 X = ( 0 , 0 , 16 , 36 , 65 ) X = \left(0, 0, 16, 36, 65\right) X=(0,0,16,36,65),列出初始的单纯形表:

x B x_B xBb x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 x 5 x_5 x5 θ \theta θ
x 3 x_3 x3161110016
x 4 x_4 x4363201012
x 5 x_5 x56505001
z09070000

观察(2)式可知,其中只有两个关于 x 1 x_1 x1 的约束条件:
x 1 + x 2 + x 3 = 16 3 x 1 + 2 x 2 + x 4 = 36 \begin{align} x_1 + x_2 + x_3 &= 16 \tag{3} \\ 3x_1 + 2x_2 + x_4 &= 36 \tag{4} \end{align} x1+x2+x33x1+2x2+x4=16=36(3)(4)
现在我们要对 x 1 x_1 x1 进行研究,因此,首先令 x 2 = 0 x_2 = 0 x2=0

对于(3)式,如果我们令 x 3 x_3 x3 减小到 0, 那么 x 1 x_1 x1 最大可以取到 16。对于(4)式,如果我们令 x 4 x_4 x4 减小到 0,那么 x 1 x_1 x1 最大可以取到 12。因为两个约束条件共同作用,因此, x 1 x_1 x1 最大只能增加到 12。如上述表格中的 θ \theta θ 所示。

此时,我们需要将 x 1 x_1 x1 作为换入变量,将 x 4 x_4 x4 作为换出变量。那么当完成替换后,z 值的增量为:
z increase = 12 × 90 = 1080 z_{\text{increase}} = 12 \times 90 = 1080 zincrease=12×90=1080
我们需要将上表中所有 x 4 x_4 x4 对应行中的 x 1 x_1 x1 的系数化简为 1,其余行 x 1 x_1 x1 的系数化 0,因此,我们需要进行行列式变换,变换后,我们得到新的单纯形表为:

x B x_B xBb x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 x 5 x_5 x5 θ \theta θ
x 3 x_3 x340 1 3 \frac{1}{3} 311- 1 3 \frac{1}{3} 31016
x 1 x_1 x1121 2 3 \frac{2}{3} 320 1 3 \frac{1}{3} 31012
x 5 x_5 x56505001
z10800100-350

对于(4)式,当 x 3 = 0 x_3 = 0 x3=0 x 2 x_2 x2 每增大 1, x 1 x_1 x1 需要减小 2 3 \frac{2}{3} 32,因此, x 2 x_2 x2 每增大 1,对应 z 值的变化量为:
z variation = z x 1 + z x 2 = 90 × ( − 2 3 ) + 70 × 1 = − 60 + 70 = 10 \begin{align} z_{\text{variation}} &= z_{x_1} + z_{x_2} \nonumber \\ &= 90 \times (-\frac{2}{3}) + 70 \times 1 \nonumber \\ & = -60 + 70 \nonumber \\ &= 10 \nonumber \end{align} zvariation=zx1+zx2=90×(32)+70×1=60+70=10
对于(4)式,当 x 1 = 0 x_1 = 0 x1=0 x 2 x_2 x2 每增大 1, x 2 x_2 x2 需要减小 1 2 \frac{1}{2} 21,因此, x 4 x_4 x4 每增大 1,对应 z 值的变化量为:
z variation = − 1 2 × 70 = − 35 \begin{align} z_{\text{variation}} &= -\frac{1}{2} \times 70 \nonumber \\ &= -35 \nonumber \end{align} zvariation=21×70=35
替换完成后的非基变量变成了 x 2 , x 4 x_2, x_4 x2,x4,接下来需要考虑将 x 2 x_2 x2 换入,三个约束条件均包含 x 2 x_2 x2 变量:
x 1 + x 2 + x 3 = 16 3 x 1 + 2 x 2 + x 4 = 36 5 x 2 + x 5 = 65 \begin{align} x_1 + x_2 + x_3 &= 16 \tag{5} \\ 3x_1 + 2x_2 + x_4 &= 36 \tag{6} \\ 5x_2 + x _5 &= 65 \tag{7} \end{align} x1+x2+x33x1+2x2+x45x2+x5=16=36=65(5)(6)(7)
现在我们要对 x 2 x_2 x2 进行研究,因此,首先令 x 1 = 0 x_1 = 0 x1=0

对于(5)式,当 x 3 x_3 x3 减小到 0 时, x 2 x_2 x2 最大可以取到 16。对于(6)式,当 x 4 x_4 x4 减小到 0 时, x 2 x_2 x2 最大可以取到 18。对于(7)式,当 x 5 x_5 x5 减小到 0 时, x 2 x_2 x2 最大可以取到 13。因此, x 2 x_2 x2 的最大值只能取到 13。

类比上面相同的行列式操作,最终我们可以得到的单纯形表为:

x B x_B xBb x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 x 5 x_5 x5 θ \theta θ
x 3 x_3 x3 1 3 \frac{1}{3} 31001- 1 3 \frac{1}{3} 31 1 15 \frac{1}{15} 151
x 1 x_1 x1 10 3 \frac{10}{3} 310100 1 3 \frac{1}{3} 31- 2 15 \frac{2}{15} 152
x 2 x_2 x2130100 1 5 \frac{1}{5} 51
z1210000-14-2

对应上述单纯表,最终我们可以将标准模型变为:
max z = 90 x 1 + 70 x 2 s . t . { x 3 − 1 3 x 4 + 1 15 x 5 = 1 3 x 1 + 1 3 x 4 − 2 15 x 5 = 10 3 x 2 + 1 5 x 5 = 13 x 1 , x 2 , x 3 , x 4 , x 5 ≥ 0 (8) \text{max} \quad z = 90x_1 + 70x_2 \\ \begin{align} s.t.\left\{\begin{matrix} x_3 - \frac{1}{3}x_4 + \frac{1}{15}x_5&= \frac{1}{3} \\ x_1 + \frac{1}{3}x_4 - \frac{2}{15}x_5 &= \frac{10}{3} \\ x_2 + \frac{1}{5}x _5 &= 13 \\ x_1, x_2,x_3,x_4,x_5 &\ge 0 \nonumber \end{matrix}\right. \end{align} \tag{8} maxz=90x1+70x2s.t. x331x4+151x5x1+31x4152x5x2+51x5x1,x2,x3,x4,x5=31=310=130(8)
对于(7)式, x 5 x_5 x5 每增大 1, x 2 x_2 x2 需要减小 1 5 \frac{1}{5} 51,因此, x 5 x_5 x5 每增大 1,对应 z 值的变化量为:
z variation = − 1 5 × 10 = − 2 \begin{align} z_{\text{variation}} &= -\frac{1}{5} \times 10 \nonumber \\ &= -2 \nonumber \end{align} zvariation=51×10=2
对于(7)式, x 5 x_5 x5 每增大 1, x 2 x_2 x2 需要减小 1 5 \frac{1}{5} 51,再考虑约束(6)式, x 2 x_2 x2 每减小 1, x 4 x_4 x4 需要增加 2 5 \frac{2}{5} 52,对应 z 值的变化量为:
z variation = − 2 5 × 35 = − 14 \begin{align} z_{\text{variation}} &= -\frac{2}{5} \times 35 \nonumber \\ &= -14 \nonumber \end{align} zvariation=52×35=14
最终,z 值的最大值为:
z increase = 1080 + 10 × 13 = 1080 + 130 = 1210 z_{\text{increase}} = 1080 + 10 \times 13 = 1080 + 130 = 1210 zincrease=1080+10×13=1080+130=1210
因此,我们说,我们求解的原始线性规划问题等同于求解方程 y = 1210 − 14 x 4 − 2 x 5 y = 1210 -14x_4 - 2x_5 y=121014x42x5的最大值问题。

如果大家觉得有用,就点个赞让更多的人看到吧~

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
单纯形法是一种求解线性规划问题的常用算法,它可以在有限步内找到最优解或确定问题无界或无可行解。下面是一个使用C语言实现单纯形法求解线性规划问题示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_N 100 #define MAX_M 100 double a[MAX_M + 1][MAX_N + MAX_M + 1]; int basis[MAX_M + 1]; int m, n; void pivot(int r, int c) { double tmp = a[r][c]; a[r][c] = 1; for (int j = 0; j <= n + m; j++) a[r][j] /= tmp; for (int i = 0; i <= m; i++) { if (i != r) { tmp = a[i][c]; a[i][c] = 0; for (int j = 0; j <= n + m; j++) a[i][j] -= a[r][j] * tmp; } } basis[r] = c; } int feasible() { while (1) { int r = 0, c = 0; for (int i = 1; i <= m; i++) { if (a[i][0] < a[r][0]) r = i; } if (a[r][0] >= 0) return 1; double minv = 1e9; for (int j = 1; j <= n + m; j++) { if (a[r][j] < minv) { minv = a[r][j]; c = j; } } if (minv == 1e9) return 0; pivot(r, c); } } int simplex() { while (1) { int r = 0, c = 0; for (int j = 1; j <= n + m; j++) { if (a[0][j] > a[0][c]) c = j; } if (a[0][c] <= 0) return 1; double minv = 1e9; for (int i = 1; i <= m; i++) { if (a[i][c] > 0 && a[i][0] / a[i][c] < minv) { minv = a[i][0] / a[i][c]; r = i; } } if (minv == 1e9) return 0; pivot(r, c); } } double simplex_solve(double *c, double *b, double **mat, double *x) { n = sizeof(c) / sizeof(double); m = sizeof(b) / sizeof(double); for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { a[i][j] = mat[i - 1][j - 1]; } for (int j = n + 1; j <= n + m; j++) { a[i][j] = (i == j - n) ? 1 : 0; } a[i][n + m + 1] = b[i - 1]; } for (int j = 1; j <= n; j++) a[0][j] = -c[j - 1]; feasible(); if (!simplex()) return -1; for (int i = 0; i < n; i++) { x[i] = 0; for (int j = 1; j <= m; j++) { if (basis[j] == i + 1) x[i] = a[j][0]; } } return -a[0][0]; } ``` 使用时,只需将线性规划问题转化为标准形式,即将约束条件通过引入松弛变量转化为等式,再将非负约束通过引入人工变量转化为等式,最后将优化目标函数转化为最大化问题,即可调用 `simplex_solve` 函数求解线性规划问题,其中 `c` 为目标函数系数向量,`b` 为约束条件右侧常数向量,`mat` 为约束条件系数矩阵,`x` 为最优解向量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤奋的大熊猫

你的鼓励将是我写作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值