Loading [MathJax]/extensions/TeX/boldsymbol.js

线性规划单纯形法精解

单纯形法(Simplex Method)是解决线性规划问题的一种高效且广泛使用的算法。由乔治·丹齐克(George Dantzig)在20世纪40年代提出,这一方法通过系统地检查可行解空间的极点,从而找到最优解。由于其计算效率高,单纯形法迅速成为线性规划问题中最重要和最常用的算法之一。它的应用范围广泛,能够有效解决实际中的大规模优化问题,因此在现代工业和经济管理中扮演着关键角色。

初始单纯形表 迭代后单纯形表

一、单纯形表的消元法建构

线性规划的标准型为

\begin{aligned} & \max \quad z=\boldsymbol{C} \boldsymbol{X} \\ & \left\{\begin{array}{c} \boldsymbol{A} \boldsymbol{X}=\boldsymbol{b} \\ \boldsymbol{X} \geqslant \boldsymbol{0} \end{array}\right. \end{aligned}

其中: \boldsymbol{A}m \times n 矩阵, m \leqslant n 且秩 r(\boldsymbol{A})=m ,即 \boldsymbol{A} 中至少有一个 m \times m 满秩子矩阵。

1.1 求基本可行解的代数消元(最优解判断条件)

不妨设 \boldsymbol{B}=\left(\begin{array}{llll}\boldsymbol{P}_1 & \boldsymbol{P}_2 & \cdots & \boldsymbol{P}_m\end{array}\right) 是线性规划的一个基, 将有关矩阵和向量分块,记 \boldsymbol{A}=(\boldsymbol{B}, N), C=\left(\boldsymbol{C}_B, \boldsymbol{C}_N\right), X=\left(\boldsymbol{X}_B, \boldsymbol{X}_N\right)^{\mathrm{T}} ,为求线性规划的基本最优解,先要求线性规划的基本可行解,这样就需将约束中的基变量用非基变量表示出来。
\boldsymbol{B}^{-1} 左乘约束方程 \boldsymbol{A} \boldsymbol{X}=\boldsymbol{b} 的两端,得

\boldsymbol{B}^{-1} \boldsymbol{A} \boldsymbol{X}=\boldsymbol{B}^{-1}(\boldsymbol{B}, N)\binom{\boldsymbol{X}_B}{\boldsymbol{X}_N}=\boldsymbol{B}^{-1} \boldsymbol{B} \boldsymbol{X}_B+\boldsymbol{B}^{-1} \boldsymbol{N} \boldsymbol{X}_N=\boldsymbol{B}^{-1} \boldsymbol{b}

\boldsymbol{B}^{-1} \boldsymbol{B} \boldsymbol{X}_B+\boldsymbol{B}^{-1} \boldsymbol{N} \boldsymbol{X}_N=\boldsymbol{E} \boldsymbol{X}_B+\boldsymbol{B}^{-1} \boldsymbol{N} \boldsymbol{X}_N=\boldsymbol{B}^{-1} \boldsymbol{b}

其中 \boldsymbol{E} 是单位矩阵。整理, 得

\boldsymbol{X}_B=\boldsymbol{B}^{-1} \boldsymbol{b}-\boldsymbol{B}^{-1} \boldsymbol{N} \boldsymbol{X}_N

将其代入目标函数中,得

z=\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{b}-\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{N} \boldsymbol{X}_N+\boldsymbol{C}_N \boldsymbol{X}_N=\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{b}+\left(\boldsymbol{C}_N-\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{N}\right) \boldsymbol{X}_N

z=\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{b}+\sum_{j=m+1}^n\left(c_j-\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{P}_j\right) x_j

非基变量 x_j 前面的系数 c_j-\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{P}_j 称为变量 x_j 的检验数,表示该变量增加或减少一个单位所引起目标函数值的变化,它可以用来判断将 x_j 变成基变量后能否改进目标函数值,以后记为 \sigma_j=c_j-\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{P}_j

最优解判定定理:对某基本可行解 \boldsymbol{X}_B=\boldsymbol{B}^{-1} \boldsymbol{b} 其他 \boldsymbol{x}_N=0, 若所有的 \sigma_j=\boldsymbol{c}_{\boldsymbol{j}} -\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{P}_j \leqslant 0 ,则该解为最优解。

1.2 求基本可行解的矩阵消元

考虑线性方程组 \left\{\begin{array}{l}\boldsymbol{A} \boldsymbol{X}=\boldsymbol{b} \\ \boldsymbol{z}=\boldsymbol{C} \boldsymbol{X}\end{array}\right., 其变量为 \left[\begin{array}{l}\boldsymbol{X} \\ \boldsymbol{z}\end{array}\right], 为便于求解, 整理得方程组 \left\{\begin{array}{c}0 \cdot z+\boldsymbol{A} \boldsymbol{X}=\boldsymbol{b} \\ -z+\boldsymbol{C X}=\boldsymbol{0}\end{array}\right., 其增广矩阵见下表, 应用高斯消元法, 求解线性方程组的解。

常数项 z XB XN
b 0 B N (1-1)
0 -1 C_B C_N (1-2)

\boldsymbol{B}^{-1} 左乘方程组(1-1)的两端, 将 \boldsymbol{X}_B 的系数化为单位矩阵, 得下表。

常数项 z X_B X_N
B^{-1} b 0 B^{-1}B=E B^{-1}N (1-3)
0 -1 C_B C_N

将方程组(1-3)左乘 -\boldsymbol{C}_B 加到方程(1-2)两边,消元化简得下表。

常数项 z X_B X_N
B^{-1} b 0 B^{-1}B=E B^{-1}N
-C_BB^{-1}b -1 C_B - C_BB^{-1}B = 0 C_N - C_BB^{-1}N (1-4)

注意式(1-4)中基向量 \boldsymbol{X}_B 、非基向量 \boldsymbol{X}_N 的系数,它们形式相似,当前者 \boldsymbol{C}_B-\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{B}=0时,后者即为检验数 \boldsymbol{C}_{\boldsymbol{N}}-\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{N} 的矩阵形式。也就是说,用消元法将目标函数中基变量的系数化为零的同时,就会得到非基变量的检验数。事实上, \boldsymbol{C}_B-\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{B} 也可看成基向量的检验数, 应用消元法后, 当基向量的检验数化为零时, 非基变量的系数 \boldsymbol{C}_{\boldsymbol{N}}-\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{N} 就是其检验数。
从上述论述可知, 计算检验数的方法有两种:一是通过公式 \sigma_j=c_j-\boldsymbol{C}_B \boldsymbol{B}^{-1} \boldsymbol{P}_j 计算得出;二是应用消元法,将目标函数中基向量的系数都化为零时,非基向量的系数就是检验数。这也是单纯表结构的出处。

1.3 单纯形法=逆矩阵法

单纯形法的核心思想是通过变换基本变量和非基本变量,找到一个新的基本可行解,并通过比较检验数判断该解是否为最优解。在单纯形法中,每一个基本可行解都对应着一个基矩阵的逆矩阵。基矩阵是从约束条件系数矩阵中选取的列所构成的矩阵,它的逆矩阵在每次迭代中都要更新。
这个逆矩阵的求解是单纯形法消元过程的核心,因为它直接影响到新解的生成和目标函数的优化。具体来说,当我们选择一个进入基的变量并排除一个离开基的变量时,这相当于对基矩阵进行了一次列替换操作。为了保持计算的有效性,我们需要快速更新逆矩阵。这通常通过一个修正的高斯消元法来完成,使得新基的逆矩阵可以通过旧基的逆矩阵迅速计算出来。
单纯形的每次迭代,都可以使用逆矩阵来计算检验数,从而判断是否可以进一步优化目标函数。检验数的计算过程依赖于逆矩阵,因为检验数用于评估当前解的可行性及其对目标函数的影响。如果所有检验数都满足最优性条件,那么当前解就是最优解;否则,我们需要通过逆矩阵的进一步操作继续迭代。
例1:已知初始单纯形表和最终单纯形表, 试求解以下问题。
(1)在初始单纯形表中找出最优基 \boldsymbol{B} ,在最终单纯形表里找出 \boldsymbol{B}^{-1}
(2)完成最终单纯形表。(3) 给出最优解与最优值。

C_B X_B B^{-1}b x_1 x_2 x_3 x_4 x_5 x_6
初始表 0 x_4 60 3 1 1 1 0 0
0 x_5 10 1 -1 2 0 1 0
0 x_6 20 1 1 -1 0 0 1
σ_j 2 -1 1 0 0 0
最终表 x_4 -1 -2
x_1 1/2 1/2
x_2 -1/2 1/2
σ_j

确定最优基和B^{-1}

  • 最优基 \boldsymbol{B}:从初始基变量x_4x_5x_6 通过单纯形法操作,最终基变量变为x_4x_1x_2
  • B^{-1}:通过最终单纯形表的x_4x_5x_6列得到 B^{-1}

B^{-1} = \begin{bmatrix} 1 & -1 & -2 \\ 0 & 1/2 & 1/2 \\ 0 & -1/2 & 1/2 \\ \end{bmatrix}

计算B^{-1}

  • 右端项b = \begin{bmatrix} 60 \quad 10 \quad 20 \end{bmatrix}

B^{-1}b = \begin{bmatrix} 1 & -1 & -2 \\ 0 & 1/2 & 1/2 \\ 0 & -1/2 & 1/2 \\ \end{bmatrix} \begin{bmatrix} 60 \\ 10 \\ 20 \\ \end{bmatrix} = \begin{bmatrix} 10 \\ 15 \\ 5 \\ \end{bmatrix}

计算最终单纯形表中的列向量
-x_3列向量计算:

  • 初始表中x_3列为[1, 2, -1]^T

B^{-1} \begin{bmatrix} 1 \\ 2 \\ -1 \\ \end{bmatrix} = \begin{bmatrix} 1 \\ 0.5 \\ -1.5 \\ \end{bmatrix}

因此x_3列为\begin{bmatrix} 1 \quad 0.5 \quad -1.5 \end{bmatrix}^T

计算检验数σ_j
目标函数为z = 2x_1 -x_2+x_3

  • 基变量的成本系数向量C_B = [0, 2, -1]
变量 P_j σ_j = c_j-C_B B^{-1}P_j 计算过程
x_1 \begin{bmatrix} 0 \quad 1 \quad 0 \end{bmatrix} 0 2-[0, 2, -1] \cdot \begin{bmatrix} 0 \ 1 \ 0 \end{bmatrix} = 0
x_2 \begin{bmatrix} 0 \quad 0 \quad 1 \end{bmatrix} 0 -1-[0, 2, -1] \cdot \begin{bmatrix} 0 \ 0 \ 1 \end{bmatrix} = 0
x_3 \begin{bmatrix} 1 \quad 0.5 \quad -1.5 \end{bmatrix} -1.5 1-[0, 2, -1] \cdot \begin{bmatrix} 1 \ 0.5 \ -1.5 \end{bmatrix} = -1.5
x_4 \begin{bmatrix} 1 \quad 0 \quad 0 \end{bmatrix} 0 0-[0, 2, -1] \cdot \begin{bmatrix} 1 \ 0 \ 0 \end{bmatrix} = 0
x_5 \begin{bmatrix} -1 \quad 0.5 \quad -0.5 \end{bmatrix} -1.5 0-[0, 2, -1] \cdot \begin{bmatrix} -1 \ 0.5 \ -0.5 \end{bmatrix} = -1.5
x_6 \begin{bmatrix} -2 \quad 0.5 \quad 0.5 \end{bmatrix} -0.5 0- [0, 2, -1] \cdot \begin{bmatrix} -2 \ 0.5 \ 0.5 \end{bmatrix} = -0.5

最终单纯形表

C_B X_B B^{-1}b x_1 x_2 x_3 x_4 x_5 x_6
最终表 0 x_4 10 0 0 1 1 -1 -2
3 x_1 15 1 0 0.5 0 1/2 1/2
2 x_2 5 0 1 -1.5 0 -1/2 1/2
σ_j 0 0 -1.5 0 -1.5 -0.5

最优解与最优值

  • 最优解:X^*=\left[\begin{array}{llllll}15 & 5 & 0 & 10 & 0 & 0\end{array}\right]^T
  • 最优值:z^*=25

二、单纯形的迭代步骤

例2:对于线性规划问题

\begin{array}{cc} \text { max } & 2 x_1+3 x_2 \\ \text { s.t. } & 4 x_1+x_2+x_3=16 \\ & -x_1+x_2+x_4=6 \\ & x_1, x_2, x_3, x_4>=0 \end{array}

其中, x_3x_4 是松驰变量。

决策变量:\mathbf{x}=\left[\begin{array}{l}x_1& x_2 & x_3 & x_4\end{array}\right]^T 是决策变量向量。
目标函数: Max \mathbf{C}^T \mathbf{x} 其中, \mathbf{C}=\left[\begin{array}{c}2\quad 3\quad 0 \quad0\end{array}\right]^T 为目标函数的系数向量。
约束条件: \mathbf{A} \mathbf{x}=\mathbf{b} ,其中 \mathbf{A}=\left[\begin{array}{cccc}4 & 1 & 1 & 0 \\ -1 & 1 & 0 & 1\end{array}\right] 是约束系数矩阵。
\mathbf{b}=\left[\begin{array}{c}16 & 6\end{array}\right]^T 是约束右端项向量。因此,标准型的线性规划问题可以表示为:

\begin{aligned} & X_B=\left[x_3, x_4\right], X_N=\left[x_1, x_2\right], N=\left[\begin{array}{cc} 4 & 1 \\ -1 & 1 \end{array}\right], B=\left[\begin{array}{ll} 1 & 0 \\ 0 & 1 \end{array}\right], C_B=[0,0], C_N =[2,3] \end{aligned}

初始化令 X_N=[0,0]

第一轮迭代:此时 c_N-c_B B^{-1} N=[2,3] 因此选择 x_2 作为入基变量更为高效,且 \theta =\min [\frac{16}{1},\frac{6}{1}]=6 x_2 入基, x_4 出基。经过此轮迭代后,各变量如下

\begin{aligned} & x_B=\left[x_3, x_2\right], x_N=\left[x_1, x_4\right], N=\left[\begin{array}{cc} 4 & 0 \\ -1 & 1 \end{array}\right], B=\left[\begin{array}{ll} 1 & 1 \\ 0 & 1 \end{array}\right], c_B=[0,3], c_N =[2,0] \end{aligned}

第二轮迭代:此时 c_N-c_B B^{-1} N=[5,-3] ,选择 x_1 作为入基变量更为高效,且

\theta =\min [\frac{16}{4}]=4

x_2x_1=4 并令 x_3=0, x_1 入基, x_3 出基。经过此轮迭代后,各变量如下

\begin{aligned} & x_B=\left[x_1, x_2\right], x_N=\left[x_3, x_4\right], N=\left[\begin{array}{ll} 1 & 0 \\ 0 & 1 \end{array}\right], B=\left[\begin{array}{cc} 4 & 1 \\ -1 & 1 \end{array}\right], c_B=[2,3], c_N =[0,0] \end{aligned}

第三轮迭代:此时 c_N-c_B B^{-1} N=[-1,-2] 都小于 0 ,达到收敛条件,此时令 x_N=[0,0] 解得 x_B=[2,8] 最小值为28。

可行域顶点 迭代路径

例3:求解下面线性模型


初始单纯形表

x_1 x_2 x_3 x_4 x_5 b \theta
约束 1 3 9 1 0 0 540
约束 2 5 5 0 1 0 450
约束 3 9 3 0 0 1 720
目标函数 70 30 0 0 0

判断当前顶点是否是最优解
对于最大化问题,若当前目标函数中的非基变量的系数小于等于0时,则所得的解为最优解。而在当前的例子中,非基变量的系数分别为70和30,意味着在可行域内随着非基变量x_1x_2的增大,目标函数就会继续增大,因此当前的解不是最优解。故判断当前所得的解是否为最优解时,只需判断目标函数中非基变量的系数是否小于等于0。
进基和出基变量
变量的出基与入基,在几何图像上表现为顶点的变化。入基的规则为选择使目标函数z变化最快的非基变量入基,即选择系数最大且为正数的非基变量入基,故在本例中选择x_1入基。出基的规则则需要引入一个新的量\theta\theta=b/a_ia_i为非基变量系数,a_i的选择的是刚刚入基的非基变量的系数),选择最小的\theta出基。

x_1 x_2 x_3 x_4 x_5 b \theta
约束 1 3 9 1 0 0 540 180
约束 2 5 5 0 1 0 450 90
约束 3 9 3 0 0 1 720 80
目标函数 70 30 0 0 0

第一次迭代,经过x_1入基与x_5出基的运算后,得到的结果如下所示。

x_1 x_2 x_3 x_4 x_5 b \theta
x_3 0 8 1 0 -1/3 300
x_4 0 10/3 0 1 -5/9 50
x_1 1 1/3 0 0 1/9 80
Z 0 20/3 0 0 -70/9 5600

令非基变量的值为0,则得到第一次迭代的解,如下所示

X = \begin{pmatrix} x_1\quad x_2 \quad x_3\quad x_4 \quad x_5 \end{pmatrix} = \begin{pmatrix} 80 \quad 0 \quad 300 \quad 50 \quad 0 \end{pmatrix}^T \\ Z = 5600

判断该解是否为最优解(重复第二个步骤,直到是最优解为止),显然由于非基变量x_2的检验数大于0,故当前位置还不是最优解,再次重复上面步骤。

三、练习

例4:用单纯表求解下面线性规划

Max \quad z = 2x_1 - x_2 + x_3\\ s.t. \begin{cases} 3x_1 + x_2 + x_3 \leq 60 \\ x_1 - x_2 + 2x_3 \leq 10 \\ x_1 + x_2 - x_3 \leq 20 \\ x_1, x_2, x_3 \geq 0 \end{cases} ​

import pandas as pd
import numpy as np

"""
系数矩阵的形式:
       b  x1  x2  x3  x4  x5
obj    0  70  30   0   0   0
x3   540   3   9   1   0   0
x4   450   5   5   0   1   0
x5   720   9   3   0   0   1
①第一行是目标函数的系数;亦即各变量对应的检验数;第2~4行是约束条件的系数
②第一列是约束方程的常数项
③对于目标函数的更新我们同样采用矩阵的变换,所以obj对应的第一列表示的是目标函数的相反数
"""
"""
运行如下代码后得到的结果如下所示
最终的最优单纯性法是:
        b  x1   x2  x3   x4        x5
obj -5700   0  0.0   0 -2.0 -6.666667
x3    180   0  0.0   1 -2.4  1.000000
x2     15   0  1.0   0  0.3 -0.166667
x1     75   1  0.0   0 -0.1  0.166667
目标函数的值: 5700
最优决策变量是:
x1 = 75
x2 = 15
"""

# Initial Simplex tableau, set dtype to float to handle division correctly
matrix = pd.DataFrame(
    data=np.array([
        [0, 2, -1, 1, 0, 0, 0],
        [60, 3, 1, 1, 1, 0, 0],
        [10, 1, -1, 2, 0, 1, 0],
        [20, 1, 1, -1, 0, 0, 1]
    ], dtype=float),  # Explicitly set dtype to float
    index=['obj', 'x4', 'x5', 'x6'],
    columns=['b', 'x1', 'x2', 'x3', 'x4', 'x5', 'x6']
)

# Print the initial tableau
iteration = 1
print(f"第 {iteration} 个单纯性表是:")
print(matrix)

# Continue the iteration until no positive coefficients are in the objective function row
while True:
    # Check the coefficients of the objective function row (检验数)
    c = matrix.iloc[0, 1:]
    
    # Stop if all reduced costs are less than or equal to zero (optimal solution found)
    if c.max() <= 0:
        break
    
    iteration += 1

    # Choose entering variable (the one with the highest positive coefficient)
    in_x = c.idxmax()
    in_x_v = c[in_x]  # Coefficient of the entering variable

    # Choose leaving variable by calculating θ and finding the minimum
    b = matrix.iloc[1:, 0]
    in_x_a = matrix.iloc[1:][in_x]
    
    # Ensure no division by zero, and select the minimum positive theta value
    theta = b / in_x_a
    theta = theta[theta > 0]  # Consider only positive θ values
    
    if theta.empty:  # If theta is empty, break to avoid errors (degenerate case)
        print("No feasible solution found.")
        break
    
    out_x = theta.idxmin()

    # Pivoting: adjust the rows for the entering and leaving variables
    matrix.loc[out_x, :] = matrix.loc[out_x, :] / matrix.loc[out_x, in_x]
    for idx in matrix.index:
        if idx != out_x:
            matrix.loc[idx, :] -= matrix.loc[out_x, :] * matrix.loc[idx, in_x]

    # Update the basis
    basis = matrix.index.tolist()
    basis[basis.index(out_x)] = in_x
    matrix.index = basis

    # Print current tableau
    print(f"第 {iteration} 个单纯性表是:")
    print(matrix)

# Output the final results
print("最终的最优单纯形表是:")
print(matrix)
print("目标函数的值:", -matrix.iloc[0, 0])

# Determine the optimal decision variables
x_count = (matrix.shape[1] - 1) - (matrix.shape[0] - 1)
X = matrix.iloc[0, 1:].index.tolist()[:x_count]
print("最优决策变量是:")
for xi in X:
    if xi in matrix.index:  # Check if the variable is in the current basis
        print(f"{xi} = {matrix.loc[xi, 'b']}")
    else:
        print(f"{xi} = 0")  # If not in basis, the value is zero
第 1 个单纯性表是:
        b   x1   x2   x3   x4   x5   x6
obj   0.0  2.0 -1.0  1.0  0.0  0.0  0.0
x4   60.0  3.0  1.0  1.0  1.0  0.0  0.0
x5   10.0  1.0 -1.0  2.0  0.0  1.0  0.0
x6   20.0  1.0  1.0 -1.0  0.0  0.0  1.0
第 2 个单纯性表是:
        b   x1   x2   x3   x4   x5   x6
obj -20.0  0.0  1.0 -3.0  0.0 -2.0  0.0
x4   30.0  0.0  4.0 -5.0  1.0 -3.0  0.0
x1   10.0  1.0 -1.0  2.0  0.0  1.0  0.0
x6   10.0  0.0  2.0 -3.0  0.0 -1.0  1.0
最终的最优单纯形表是:
        b   x1   x2   x3   x4   x5   x6
obj -25.0  0.0  0.0 -1.5  0.0 -1.5 -0.5
x4   10.0  0.0  0.0  1.0  1.0 -1.0 -2.0
x1   15.0  1.0  0.0  0.5  0.0  0.5  0.5
x2    5.0  0.0  1.0 -1.5  0.0 -0.5  0.5
目标函数的值: 25.0
最优决策变量是:
x1 = 15.0
x2 = 5.0
x3 = 0

总结

单纯形法是线性规划问题中的一种经典算法,它通过逐步优化,找到能够最大化或最小化目标函数的可行解。尽管单纯形法在最坏情况下可能需要指数级时间,但在实际应用中,单纯形法通常能高效地找到最优解,因此它被广泛应用于各种线性规划问题中,例如生产计划、资源分配、运输优化等。
单纯形法的直观性在于从一个顶点开始沿边界移动到另一个顶点,不断提高目标函数值,直到达到最优解。这种方法简单且易于理解,对大多数线性规划问题都能有效求解。然而,单纯形法也存在一些局限性,例如在处理退化问题时可能会出现循环,导致算法陷入无限循环的困境。为了克服这些局限性,研究者们提出了多种改进方案,如反周期规则来防止循环、对偶单纯形法来处理不可行的初始解等。此外,内点法作为一种替代算法,通过从可行域的内部逼近最优解,提供了不同于单纯形法的求解思路,并且在某些情况下表现出更好的最坏情况性能。通过这些改进和新方法的引入,线性规划问题的求解在理论和实践上都得到了极大的丰富和发展,使得我们能够解决更复杂、更大规模的问题。这些进步不仅提升了算法的效率,也拓展了线性规划在各个领域的应用范围。单纯形法及其改进方法的持续发展,确保了线性规划在优化和决策问题中的核心地位。

参考文献

  1. 线性规划-单纯形法推导
  2. python最优化算法实战---线性规划之单纯形法
posted @   郝hai  阅读(1105)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示