单纯形法的学习笔记

文章目录

    • A. 单纯形法概述
      • 1. 优化模型示例
    • B. 理论基础
    • C. 算法思想
    • D. 实现算法
      • 1. 线性规划的标准型
      • 2. 顶点解的理解及表示
        • 2.1 在标准型中变量取值为零的意义
        • 2.2 顶点解的表示
      • 3. 最优性判断
      • 4. 解的更新
      • 5. 完成迭代过程
    • E. 单纯形法的基本概念与本文对照
    • F. 文档源码

前言:书中得来意未通,笔下挥洒渐觉明。
如果文中有错误,或是笔误,或是理论错误,还请大家帮忙指明。

A. 单纯形法概述

单纯形法是一种求解线性规划问题的算法。线性规划是优化一个线性目标函数,同时满足一组线性约束条件。以下是对单纯形法的介绍。

1. 优化模型示例

考虑一个最小化的线性规划问题:

目标函数
min z = 3 x 1 + 2 x 2 \text{min} \quad z = 3x_1 + 2x_2 minz=3x1+2x2

约束条件
x 1 + 2 x 2 + x 3 ≥ 4 , 3 x 1 + x 2 − x 4 ≤ 6 , x 1 − x 2 = 1 , x 1 , x 2 ≥ 0 , x 3 , x 4 ≤ 0. \begin{align*} x_1 + 2x_2 + x_3 & \geq 4, \\ 3x_1 + x_2 - x_4 & \leq 6, \\ x_1 - x_2 & = 1, \\ x_1, x_2 & \geq 0, \\ x_3, x_4 & \leq 0. \\ \end{align*} x1+2x2+x33x1+x2x4x1x2x1,x2x3,x44,6,=1,0,0.

  • 在线性规划问题中,可能存在无穷多的解满足这些约束条件。
  • 我们的目标是在所有符合这些约束的解中找到一个使得目标函数 z z z 最小的解。

B. 理论基础

考虑以下线性规划模型并观察其可视化图像:

可行域图

可行域图

可以总结出以下特性(完整的证明可以参照运筹学教材):

  1. 可行域是凸集,一定有至少一个顶点是最优解。
  2. 任意非最优解的顶点一定存在至少一个目标值更优的邻近顶点解。
  3. 给定一个顶点及其相连的边,可以确定沿边移动时目标值是上升还是下降,从而识别是否存在更优的邻近顶点解。

C. 算法思想

根据上述理论,我们可以自然地给出单纯形法的基本流程:

  1. 选择一个顶点解作为当前解;
  2. 判断当前解是否为最优解:以最大化问题为例,如果沿任一邻边移动均导致目标值下降或不变,则该解为最优解;
  3. 如果当前解不是最优,更新为更优的邻近顶点,并返回到步骤2;否则,结束算法。

为便于理解,以下是求解过程的可视化示意图:
寻优过程


D. 实现算法

1. 线性规划的标准型

为方便使用单纯形法,必须将一般线性规划问题转化为标准型(最大化、等式约束、非负变量)。线性规划的标准型可用以下形式表示:

目标函数
max z = c T x \text{max} \quad z = c^T x maxz=cTx

约束条件
A x = b x ≥ 0 \begin{align*} Ax & = b \\ x & \geq 0 \end{align*} Axx=b0

其中:

  • x x x 为决策变量向量, x ∈ R n x \in \mathbb{R}^n xRn
  • c c c 为目标函数的系数向量, c ∈ R n c \in \mathbb{R}^n cRn
  • A A A 为约束条件的系数矩阵, A ∈ R m × n A \in \mathbb{R}^{m \times n} ARm×n
  • b b b 为约束条件的常数向量, b ∈ R m b \in \mathbb{R}^m bRm

需要注意的是,任何线性规划问题均可转化为标准型。无论目标函数是最小化问题还是最大化问题,约束包括不等式约束或等式约束,都能应用相应方法进行转换。具体转化方法请参考以下链接:转化方法详解。

2. 顶点解的理解及表示

在上面的算法思想中,我们了解到求解过程是将当前解不断地从一个顶点转移到另一个更优的邻近顶点,那什么是顶点解,应该怎么进行表示,在这里我们进行分析。

2.1 在标准型中变量取值为零的意义

我们继续考虑上面的线性规划例子,并将其转化为标准型,加入松弛变量 s 1 , s 2 , s 3 s_1, s_2, s_3 s1,s2,s3
在这里插入图片描述

在标准型中,变量包括 x 1 , x 2 , s 1 , s 2 , s 3 x_1, x_2, s_1, s_2, s_3 x1,x2,s1,s2,s3每个变量取值为零表示相应的约束达到了边界。具体分析如下:

  1. x 1 = 0 x_1 = 0 x1=0 时:

    • 约束 x 1 ≥ 0 x_1 \geq 0 x10 达到边界。
  2. x 2 = 0 x_2 = 0 x2=0 时:

    • 约束 x 2 ≥ 0 x_2 \geq 0 x20 达到边界。
  3. s 1 = 0 s_1 = 0 s1=0 时:

    • 约束 x 1 + s 1 = 8 x_1 + s_1 = 8 x1+s1=8 转化为 x 1 = 8 x_1 = 8 x1=8,则约束 x 1 ≤ 8 x_1 \leq 8 x18 达到边界。
  4. s 2 = 0 s_2 = 0 s2=0 时:

    • 约束 x 2 + s 2 = 5 x_2 + s_2 = 5 x2+s2=5 转化为 x 2 = 5 x_2 = 5 x2=5,则约束 x 2 ≤ 5 x_2 \leq 5 x25 达到边界。
  5. s 3 = 0 s_3 = 0 s3=0 时:

    • 约束 x 1 + x 2 + s 3 = 10 x_1 + x_2 + s_3 = 10 x1+x2+s3=10 转化为 x 1 + x 2 = 10 x_1 + x_2 = 10 x1+x2=10,则约束 x 1 + x 2 ≤ 10 x_1 + x_2 \leq 10 x1+x210 达到边界。

因此,每个变量均对应了一条约束,当该变量取值为零时,当前解位于对应的约束边界上

2.2 顶点解的表示

在示例中,一个顶点具有两条邻边。当我们让两条邻边对应的变量取值为0时,就可以表示出该顶点。下面展示了所有顶点解及其变量取值为0的组合:

可行域图

可行域图

下面我们对 s 2 = 0 s_2=0 s2=0 s 3 = 0 s_3=0 s3=0 能够得到 ( x 1 = 5 , x 2 = 5 ) (x_1=5,x_2=5) (x1=5,x2=5) 这个顶点,做具体的计算,作为一个举例:

在这里插入图片描述

3. 最优性判断

在之前的部分,我们分析了可以利用一些变量为零来指代一个顶点。接下来,继续分析确定一个顶点后,如何判断该顶点是否为最优解:即判断当前顶点沿邻边移动时,目标值是否可改善。若所有邻边均不可改善,则该顶点为最优解。

以顶点解(0,0)为例,邻边为 x 1 = 0 x_1=0 x1=0 x 2 = 0 x_2= 0 x2=0。我们以沿着 x 1 = 0 x_1=0 x1=0 移动为例进行分析:

  • 首先,如何从数值变化上理解“沿着 x 1 = 0 x_1=0 x1=0 移动”?

    • 这意味着保持 x 1 x_1 x1 为零,增大 x 2 x_2 x2 (另一条边界)。
      • 如果顶点有多条边线,它们会如何变化?以下图为例,当顶点沿着 s 3 = 0 s_3 = 0 s3=0移动时, s 1 s_1 s1 s 2 s_2 s2 均会随之增大。(在几何意义上, s 1 = 0 s_1 = 0 s1=0 增大到 s 1 = 1 s_1 = 1 s1=1 意味着点到 s 1 = 0 s_1 = 0 s1=0的距离增加了1)
        在这里插入图片描述
  • 其次,沿着 x 1 = 0 x_1=0 x1=0 移动时, z z z 如何变化?

    • 此时 z = x 1 + 2 x 2 = 2 x 2 z = x_1 + 2x_2 = 2x_2 z=x1+2x2=2x2。当 x 2 x_2 x2 增大时, z z z 也随之增大。

由于当前顶点沿该邻边移动时 z z z 增大,因此该顶点不是最优解(若沿该边移动无法改善目标值,还需判断其他边)。

4. 解的更新

还是以顶点解(0,0)为例,邻边有两条 x 1 = 0 x_1=0 x1=0 x 2 = 0 x_2= 0 x2=0 ,由于 z = x 1 + 2 x 2 z = x_1 + 2x_2 z=x1+2x2,不管是沿哪条边移动都会增长 z z z值,那么应该选择哪一条边?选择的依据是目标值增长最快的方向。当 x 1 x_{1} x1 增加单位 1 1 1 时, z z z 增加了 x 1 x_{1} x1 的系数 1 1 1;当 x 2 x_{2} x2 增加单位 1 1 1 时, z z z 增加了 x 2 x_{2} x2 的系数 2 2 2。所以,通过系数的对比判断,选择沿着 x 1 = 0 x_1= 0 x1=0 移动,增加 x 2 x_2 x2直到移动到下一个顶点,如下图所示,移动到了新顶点(0,5) 。

移动至新顶点示例

进一步分析

  • 为什么不直接对比邻近顶点的目标值,选择最优的邻近顶点?设计算法时,一方面考虑效果,另一方面还要考虑效率。从效果来说,均达到了找到更优解的目的,只是选择最优的邻近顶点解可能在目标值上会更好一些;从效率来说,增长速度的比较 简单于 目标值的比较。
  • 怎么从数值上判断是不是移动到了新的顶点?当沿着 x 1 = 0 x_1= 0 x1=0 移动,增加 x 2 x_2 x2 时,其它变量 s 1 , s 2 , s 3 s_1, s_2, s_3 s1,s2,s3也会随之变化,当 s 1 , s 2 , s 3 s_1, s_2, s_3 s1,s2,s3中有一个变量降到0时,即是到了新的顶点。
    • 进一步,当沿着 x 1 = 0 x_1= 0 x1=0 移动,增加 x 2 x_2 x2 时,怎么能够判断出 s 1 , s 2 , s 3 s_1, s_2, s_3 s1,s2,s3中的哪个变量会先降到0?通过下面变换,利用 x 2 x_2 x2 表示其它变量,可以容易地判断出随着 x 2 x_2 x2 的增加哪个变量会先降到0。
      在这里插入图片描述

5. 完成迭代过程

  • 判断顶点(0,5)是否为最优解。此时其邻边为 x 1 = 0 x_1=0 x1=0 s 2 = 0 s_2=0 s2=0,我们要分析沿这两条边移动目标值的变化。基于约束方程,可以用 x 1 x_1 x1 s 2 s_2 s2 表示 z z z,得到 z = x 1 − 2 s 2 + 10 z = x_1 - 2s_2 + 10 z=x12s2+10。在沿 s 2 = 0 s_2=0 s2=0 的邻边移动时,增大 x 1 x_1 x1 z z z 也会随之增加,因此顶点(0,5)不是最优解。
  • 更新顶点解:由于 z = x 1 − 2 s 2 + 10 z = x_1 - 2s_2 + 10 z=x12s2+10,增加 s 2 s_2 s2 反而会使 z z z 减小,因此我们只能选择增大 x 1 x_1 x1,也就是开始沿着 s 2 = 0 s_2=0 s2=0 的邻边移动,直到到达(5,5)。
  • 判断顶点(5,5)是否为最优解。其邻边为 s 2 = 0 s_2=0 s2=0 s 3 = 0 s_3=0 s3=0。沿两条邻边移动目标值的变化,用 s 2 s_2 s2 s 3 s_3 s3 表示 z z z,得到 z = − s 2 − s 3 + 15 z = -s_2 - s_3 + 15 z=s2s3+15。此时,无论是增加 s 2 s_2 s2 还是 s 3 s_3 s3,目标值均会下降。因此,顶点(5,5)为最优解,算法结束。

E. 单纯形法的基本概念与本文对照

在上面的介绍中,为了方便理解,并没有直接使用到教材中常用的一些概念,这里做一个表格对比这些概念与本文中所论述的部分(以顶点解(0,0)为例,邻边有两条 x 1 = 0 x_1=0 x1=0 x 2 = 0 x_2= 0 x2=0 z = x 1 + 2 x 2 z = x_1 + 2x_2 z=x1+2x2):

单纯形法常用概念本文的对应部分
非基变量两条邻边 x 1 = 0 x_1=0 x1=0 x 2 = 0 x_2= 0 x2=0 ,其中 x 1 x_1 x1 x 2 x_2 x2 为非基变量。
基变量除了非基变量,剩余的变量均是基变量。在非基变量确定之后,求解约束方程可以得到基变量的取值。
入基如果沿着 x 1 = 0 x_1=0 x1=0 移动, x 2 x_2 x2 会增加,不再为0,那么 x 2 x_2 x2由非基变量转化为了基变量。
出基如果沿着 x 1 = 0 x_1=0 x1=0 移动, x 2 x_2 x2 会增加,其它变量 s 1 , s 2 , s 3 s_1, s_2, s_3 s1,s2,s3也会随之变化,当 s 1 , s 2 , s 3 s_1, s_2, s_3 s1,s2,s3中有一个变量降到0时,该变量由基变量转化为了非基变量。
检验数由于 z = x 1 + 2 x 2 z = x_1 + 2x_2 z=x1+2x2,当 x 1 x_{1} x1 增加单位 1 1 1 时, z z z 增加了 x 1 x_{1} x1 的系数 1 1 1;当 x 2 x_{2} x2 增加单位 1 1 1 时, z z z 增加了 x 2 x_{2} x2 的系数 2 2 2 x 1 x_1 x1 x 2 x_2 x2 的系数反映了目标值的增长速度,而检验数就是 x 1 x_1 x1 x 2 x_2 x2 (边界对应的变量)在目标函数中的系数。
最优性判断:如果所有检验数都不为负,当前解为最优解。(最大化问题)如果沿着所有的邻边移动均不能改善目标值,即是最优解。
解的更新:通过交换基变量和非基变量通过将当前解更新为更优的邻近顶点。

F. 文档源码

@[Toc]

前言:书中得来意未通,笔下挥洒渐觉明。

## A. 单纯形法概述

单纯形法是一种求解线性规划问题的算法。线性规划是优化一个线性目标函数,同时满足一组线性约束条件。以下是对单纯形法的介绍。

### 1. 优化模型示例

考虑一个最小化的线性规划问题:

**目标函数**:
$$
\text{min} \quad z = 3x_1 + 2x_2
$$

**约束条件**:
$$
\begin{align*}
x_1 + 2x_2 + x_3 & \geq 4, \\
3x_1 + x_2 - x_4 & \leq 6, \\
x_1 - x_2 & = 1, \\
x_1, x_2 & \geq 0, \\
x_3, x_4 & \leq 0. \\
\end{align*}
$$

- 在线性规划问题中,可能存在无穷多的解满足这些约束条件。
- 我们的目标是在所有符合这些约束的解中找到一个使得目标函数 $z$ 最小的解。

---

## B. 理论基础

考虑以下线性规划模型并观察其可视化图像:

<table style="border: none; border-collapse: collapse; width: 100%;">
  <tr>
    <td style="border: none; text-align: center; width: 50%;">
      <img src="https://i-blog.csdnimg.cn/direct/a6be00131fe64aaf9b47daef35e6fbdd.png" alt="可行域图" style="width: 100px;"/>
      <p></p>
    </td>
    <td style="border: none; text-align: center; width: 50%;">
      <img src="https://i-blog.csdnimg.cn/direct/63564ea4cbd64240a0e5ceb171e63725.png" alt="可行域图" style="width: 200px;"/>
    </td>
  </tr>
</table>

可以总结出以下特性(完整的证明可以参照运筹学教材):
1. 可行域是凸集,一定有至少一个顶点是最优解。
2. 任意非最优解的顶点一定存在至少一个目标值更优的邻近顶点解。
3. 给定一个顶点及其相连的边,可以确定沿边移动时目标值是上升还是下降,从而识别是否存在更优的邻近顶点解。

---
## C. 算法思想

根据上述理论,我们可以自然地给出单纯形法的基本流程:
1. 选择一个顶点解作为当前解;
2. 判断当前解是否为最优解:以最大化问题为例,如果沿任一邻边移动均导致目标值下降或不变,则该解为最优解;
3. 如果当前解不是最优,更新为更优的邻近顶点,并返回到步骤2;否则,结束算法。

为便于理解,以下是求解过程的可视化示意图:
![寻优过程](https://i-blog.csdnimg.cn/direct/3d133ea77c6c460aa62d38f013a38ed2.png)

---

## D. 实现算法

### 1. 线性规划的标准型

为方便使用单纯形法,必须将一般线性规划问题转化为标准型(最大化、等式约束、非负变量)。线性规划的标准型可用以下形式表示:

**目标函数**:
$$
\text{max} \quad z = c^T x
$$

**约束条件**:
$$
\begin{align*}
Ax & = b \\
x & \geq 0
\end{align*}
$$

其中:
- $x$ 为决策变量向量,$x \in \mathbb{R}^n$。
- $c$ 为目标函数的系数向量,$c \in \mathbb{R}^n$。
- $A$ 为约束条件的系数矩阵,$A \in \mathbb{R}^{m \times n}$。
- $b$ 为约束条件的常数向量,$b \in \mathbb{R}^m$。

需要注意的是,任何线性规划问题均可转化为标准型。无论目标函数是最小化问题还是最大化问题,约束包括不等式约束或等式约束,都能应用相应方法进行转换。具体转化方法请参考以下链接:[转化方法详解](https://www.cnblogs.com/haohai9309/p/18303895)### 2. 顶点解的理解及表示

在上面的算法思想中,我们了解到求解过程是将当前解不断地从一个顶点转移到另一个更优的邻近顶点,那什么是顶点解,应该怎么进行表示,在这里我们进行分析。

#### 2.1 在标准型中变量取值为零的意义

我们继续考虑上面的线性规划例子,并将其转化为标准型,加入松弛变量 $s_1, s_2, s_3$:
$$
\begin{array}{ll}
\max & z=x_{1}+2x_{2} \\
\text{s.t.} & x_1 + s_1 = 8 \\
& x_2 + s_2 = 5 \\
& x_1 + x_2 + s_3 = 10 \\
& x_1, x_2, s_1, s_2, s_3 \geq 0
\end{array}
$$

在标准型中,变量包括 $x_1, x_2, s_1, s_2, s_3$,**每个变量取值为零表示相应的约束达到了边界**。具体分析如下:

1. **$x_1 = 0$** 时:
   - 约束 $x_1 \geq 0$ 达到边界。

2. **$x_2 = 0$** 时:
   - 约束 $x_2 \geq 0$ 达到边界。

3. **$s_1 = 0$** 时:
   - 约束 $x_1 + s_1 = 8$ 转化为 $x_1 = 8$,则约束 $x_1 \leq 8$ 达到边界。

4. **$s_2 = 0$** 时:
   - 约束 $x_2 + s_2 = 5$ 转化为 $x_2 = 5$,则约束 $x_2 \leq 5$ 达到边界。

5. **$s_3 = 0$** 时:
   - 约束 $x_1 + x_2 + s_3 = 10$ 转化为 $x_1 + x_2 = 10$,则约束 $x_1 + x_2 \leq 10$ 达到边界。

因此,每个变量均对应了一条约束,**当该变量取值为零时,当前解位于对应的约束边界上**#### 2.2 顶点解的表示

在示例中,一个顶点具有两条邻边。**当我们让两条邻边对应的变量取值为0时,就可以表示出该顶点**。下面展示了所有顶点解及其变量取值为0的组合:

<table style="border: none; border-collapse: collapse; width: 100%;">
  <tr>
    <td style="border: none; text-align: center; width: 50%;">
      <img src="https://i-blog.csdnimg.cn/direct/4160682dd8064247928d52340348a454.png" alt="可行域图" style="width: 100px;"/>
      <p></p>
    </td>
    <td style="border: none; text-align: center; width: 50%;">
      <img src="https://i-blog.csdnimg.cn/direct/53ec6578fa7140ec9e5025756e0a6ccb.png" alt="可行域图" style="width: 200px;"/>
    </td>
  </tr>
</table>

下面我们对 $s_2=0$ 和 $s_3=0$ 能够得到 $(x_1=5,x_2=5)$ 这个顶点,做具体的计算,作为一个举例:

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c068bcb6f8fa44258de90b2a570dff64.png)
### 3. 最优性判断

在之前的部分,我们分析了可以利用一些变量为零来指代一个顶点。接下来,继续分析确定一个顶点后,如何判断该顶点是否为最优解:即判断当前顶点沿邻边移动时,目标值是否可改善。若所有邻边均不可改善,则该顶点为最优解。

以顶点解(0,0)为例,邻边为 $x_1=0$ 和 $x_2= 0$。我们以**沿着 $x_1=0$ 移动**为例进行分析:
- 首先,如何从数值变化上理解“沿着 $x_1=0$ 移动”?
	- 这意味着保持 $x_1$ 为零,增大 $x_2$ (另一条边界)。
		- 如果顶点有多条边线,它们会如何变化?以下图为例,当顶点沿着$s_3 = 0$移动时,$s_1$ 和 $s_2$ 均会随之增大。(在几何意义上,$s_1 = 0$ 增大到 $s_1 = 1$ 意味着点到$s_1 = 0$的距离增加了1)
		![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e52cd5f123d549fa8fcfc75275bb22d8.png)

- 其次,沿着 $x_1=0$ 移动时,$z$ 如何变化?
	- 此时 $z = x_1 + 2x_2 = 2x_2$。当 $x_2$ 增大时,$z$ 也随之增大。

由于当前顶点沿该邻边移动时 $z$ 增大,因此该顶点不是最优解(若沿该边移动无法改善目标值,还需判断其他边)。

### 4. 解的更新

还是以顶点解(0,0)为例,邻边有两条 $x_1=0$ 和 $x_2= 0$ ,由于$z = x_1 + 2x_2$,不管是沿哪条边移动都会增长$z$值,那么应该选择哪一条边?选择的依据是**目标值增长最快的方向**。当 $x_{1}$ 增加单位 $1$ 时,$z$ 增加了 $x_{1}$ 的系数 $1$;当 $x_{2}$ 增加单位 $1$ 时,$z$ 增加了 $x_{2}$ 的系数 $2$。所以,通过系数的对比判断,选择沿着 $x_1= 0$ 移动,增加 $x_2$,**直到移动到下一个顶点**,如下图所示,移动到了新顶点(0,5)![移动至新顶点示例](https://i-blog.csdnimg.cn/direct/5dc9fe6bf99b4244a288d16ed948ef74.png)

**进一步分析**
- 为什么不直接对比邻近顶点的目标值,选择最优的邻近顶点?设计算法时,一方面考虑效果,另一方面还要考虑效率。从效果来说,均达到了找到更优解的目的,只是选择最优的邻近顶点解可能在目标值上会更好一些;从效率来说,增长速度的比较  **简单于**  目标值的比较。
- 怎么从数值上判断是不是移动到了新的顶点?当沿着 $x_1= 0$ 移动,增加 $x_2$ 时,其它变量$s_1, s_2, s_3$也会随之变化,当$s_1, s_2, s_3$中有一个变量降到0时,即是到了新的顶点。
	- 进一步,当沿着 $x_1= 0$ 移动,增加 $x_2$ 时,怎么能够判断出$s_1, s_2, s_3$中的哪个变量会先降到0?通过下面变换,利用 $x_2$ 表示其它变量,可以容易地判断出随着 $x_2$ 的增加哪个变量会先降到0。
	![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f72595b990b24f6ab3a6fd3b35ab6ef3.png)
### 5. 完成迭代过程

- 判断顶点(0,5)是否为最优解。此时其邻边为 $x_1=0$ 和 $s_2=0$,我们要分析沿这两条边移动目标值的变化。基于约束方程,可以用 $x_1$ 和 $s_2$ 表示 $z$,得到 $z = x_1 - 2s_2 + 10$。在沿 $s_2=0$ 的邻边移动时,增大 $x_1$ , $z$ 也会随之增加,因此顶点(0,5)不是最优解。
- 更新顶点解:由于 $z = x_1 - 2s_2 + 10$,增加 $s_2$ 反而会使 $z$ 减小,因此我们只能选择增大 $x_1$,也就是开始沿着 $s_2=0$ 的邻边移动,直到到达(5,5)- 判断顶点(5,5)是否为最优解。其邻边为 $s_2=0$ 和 $s_3=0$。沿两条邻边移动目标值的变化,用 $s_2$ 和 $s_3$ 表示 $z$,得到 $z = -s_2 - s_3 + 15$。此时,无论是增加 $s_2$ 还是 $s_3$,目标值均会下降。因此,顶点(5,5)为最优解,算法结束。

---

## E. 单纯形法的基本概念与本文对照

在上面的介绍中,为了方便理解,并没有直接使用到教材中常用的一些概念,这里做一个表格对比这些概念与本文中所论述的部分(以顶点解(0,0)为例,邻边有两条 $x_1=0$ 和 $x_2= 0$, $z = x_1 + 2x_2$):

| **单纯形法常用概念**       | **本文的对应部分**|
|-|-|
| **非基变量**     | 两条邻边$x_1=0$ 和 $x_2= 0$ ,其中 $x_1$ 和 $x_2$ 为非基变量。             |
| **基变量**    | 除了非基变量,剩余的变量均是基变量。在非基变量确定之后,求解约束方程可以得到基变量的取值。   
| **入基**    | 如果沿着 $x_1=0$ 移动,$x_2$ 会增加,不再为0,那么$x_2$由非基变量转化为了基变量。
| **出基**     | 如果沿着 $x_1=0$ 移动,$x_2$ 会增加,其它变量$s_1, s_2, s_3$也会随之变化,当$s_1, s_2, s_3$中有一个变量降到0时,该变量由基变量转化为了非基变量。            |
| **检验数**    | 由于 $z = x_1 + 2x_2$,当 $x_{1}$ 增加单位 $1$ 时,$z$ 增加了 $x_{1}$ 的系数 $1$;当 $x_{2}$ 增加单位 $1$ 时,$z$ 增加了 $x_{2}$ 的系数 $2$。 $x_1$ 和 $x_2$ 的系数反映了目标值的增长速度,而检验数就是$x_1$ 和 $x_2$ (边界对应的变量)在目标函数中的系数。 |
| **最优性判断:如果所有检验数都不为负,当前解为最优解。(最大化问题)**|  如果沿着所有的邻边移动均不能改善目标值,即是最优解。    |
| **解的更新:通过交换基变量和非基变量**  | 通过将当前解更新为更优的邻近顶点。               |

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950055.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArmSoM RK3588/RK3576核心板,开发板网络设置

ArmSoM系列产品都搭配了以太网口或WIFI模块&#xff0c;PCIE转以太网模块、 USB转以太网模块等&#xff0c;这样我们的网络需求就不止是上网这么简单了&#xff0c;可以衍生出多种不同的玩法。 1. 网络连接​ 连接互联网或者组成局域网都需要满足一个前提–设备需要获取到ip&a…

[Linux]线程概念与控制

目录 一、线程概念 1.什么是线程 2.线程的轻量化 3.LWP字段 4.局部性原理 5.线程的优缺点 6.进程VS线程 二、线程的控制 1.线程创建 2.获取线程id 3.线程退出与等待 4.创建轻量级进程 三、线程的管理 1.pthread库管理线程 2.线程局部存储 四、C线程库 1.构造函…

cmake--库链接--RPATH--RUNPATH

RPATH--RUNPATH RPATH 是一种嵌入到二进制文件(可执行文件/库文件)中的路径信息&#xff0c;也就是存在于可执行文件或者库文件中的&#xff0c; 用RPATH(旧)或者RUNPATH(新)参数记录的路径信息&#xff0c; 指示动态链接器在运行时查找共享库的位置。 查看二进制文件的RPATH或…

Chapter 4.4:Adding shortcut connections

4 Implementing a GPT model from Scratch To Generate Text 4.4 Adding shortcut connections 接下来&#xff0c;让我们讨论 shortcut connections&#xff08;快捷连接&#xff09;背后的概念&#xff0c;也称为 skip connections&#xff08;跳跃连接&#xff09;或 resid…

Web渗透测试之XSS跨站脚本 原理 出现的原因 出现的位置 测试的方法 危害 防御手段 面试题 一篇文章给你说的明明白白

目录 XSS介绍的原理和说明 Cross Site Scripting 钓鱼 XSS攻击原理 XSS漏洞出现的原因&#xff1a; XSS产生的原因分析 XSS出现位置&#xff1a; XSS测试方法 XSS的危害 防御手段&#xff1a; 其它防御 面试题: 备注&#xff1a; XSS介绍的原理和说明 嵌入在客户…

热门数据手套对比,应用方向有何不同?

AI与人形机器人是目前市场中大热的两个新行业。在人形机器人或拟人仿真机器人制造与开发中动作捕捉技术的融入是必不可少的&#xff0c;通过将动捕数据与先进的AI大数据训练技术相结合&#xff0c;不仅能够省去枯燥乏味的动作编程过程大幅减少训练时间&#xff0c;还可以使训练…

dbt Semantic Layer 详细教程-1 :总体概述

dbt 语义模型提供语言描述方式快速定义业务指标。本文介绍语义模型作用和意义&#xff0c;以及语义模型的组成部分&#xff0c;后面会继续介绍如何定义语义模型&#xff0c;基于语义模型定义指标&#xff0c;如何通过MetricFlow&#xff08;语义层框架&#xff09;能够构建用于…

JAVA:探讨 CopyOnWriteArrayList 的详细指南

1、简述 在 Java 的并发编程中&#xff0c;CopyOnWriteArrayList 是一种特殊的线程安全的集合类。它位于 java.util.concurrent 包中&#xff0c;主要用于在并发读写场景下提供稳定的性能。与传统的 ArrayList 不同&#xff0c;CopyOnWriteArrayList 通过在每次修改时创建一个…

简单编程实现QT程序黑色主题显示

代码如下 int main(int argc, char *argv[]) {QApplication a(argc, argv);//QSurfaceFormat::setDefaultFormat(QVTKOpenGLStereoWidget::defaultFormat());QPalette darkpalette;a.setStyle(QStyleFactory::create("Fusion"));darkpalette.setColor(QPalette::Wind…

沁恒CH32V208GBU6外设PWM:注意分辨时钟使能函数RCC_APB2PeriphClockCmd;PWM模式1和模式2的区别;PWM动态开启和关闭

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

飞书企业消息实践

一、飞书自带的消息机器人限制 频控策略 - 服务端 API - 飞书开放平台 自定义机器人的频率控制和普通应用不同&#xff0c;为单租户单机器人 100 次/分钟&#xff0c;5 次/秒。建议发送消息尽量避开诸如 10:00、17:30 等整点及半点时间&#xff0c;否则可能出现因系统压力导致…

0107作业

思维导图 练习: 要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩&#xff0c;分别完成空间的申请、成绩的录入、升序 排序、 成绩输出函数以及空间释放函数&#xff0c;并在主程序中完成测试 要求使用new和delete完成 #include <iostream>using namespace std…

以C++为基础快速了解C#

using System: - using 关键字用于在程序中包含 System 命名空间。 一个程序一般有多个 using 语句, 相当于C的 using namespace std; C# 是大小写敏感的。 所有的语句和表达式必须以分号&#xff08;;&#xff09;结尾。 程序的执行从 Main 方法开始。 与 Java 不同的是&#…

面试题:并发与并行的区别?

并发&#xff08;Concurrency&#xff09;和并行&#xff08;Parallelism&#xff09;是计算机科学中两个相关但不同的概念&#xff0c;它们都涉及到同时处理多个任务&#xff0c;但在实现方式和效果上有显著的区别。理解这两者的区别对于编写高效的多任务程序非常重要。 并发&…

面向对象分析和设计OOA/D,UML,GRASP

目录 什么是分析和设计&#xff1f; 什么是面向对象的分析和设计&#xff1f; 迭代开发 UML 用例图 交互图 基于职责驱动设计 GRASP 常见设计原则 什么是分析和设计&#xff1f; 分析&#xff0c;强调是对问题和需求的调查研究&#xff0c;不是解决方案。例如&#x…

MySQL使用navicat新增触发器

找到要新增触发器的表&#xff0c;然后点击设计&#xff0c;找到触发器标签。 根据实际需要&#xff0c;填写相关内容&#xff0c;操作完毕&#xff0c;点击保存按钮。 在右侧的预览界面&#xff0c;可以看到新生成的触发器脚本

Anthropic 的人工智能 Claude 表现优于 ChatGPT

在人工智能领域&#xff0c;竞争一直激烈&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;技术的发展中&#xff0c;多个公司都在争夺市场的主导地位。OpenAI的ChatGPT和Anthropic的Claude是目前最具影响力的两款对话型AI产品&#xff0c;它们都能够理解并生成自然…

《罪恶装备-奋战》官方中文学习版

《罪恶装备 -奋战-》是Arc System Works开发的格斗游戏《罪恶装备》系列的第二十五部作品 [1]&#xff0c;男主角索尔历时25年的故事就此画上句号&#xff0c;而罪恶装备的故事却并未结束。 《罪恶装备-奋战》官方中文版 https://pan.xunlei.com/s/VODWAm1Dv-ZWVvvmUMflgbbxA1…

期末概率论总结提纲(仅适用于本校,看文中说明)

文章目录 说明A选择题1.硬币2.两个事件的关系 与或非3.概率和为14.概率密度 均匀分布5.联合分布率求未知参数6.联合分布率求未知参数7.什么是统计量&#xff08;记忆即可&#xff09;8.矩估计量9.117页12题10.显著水平阿尔法&#xff08;背公式就完了&#xff09; 判断题11.事件…

流程图(四)利用python绘制漏斗图

流程图&#xff08;四&#xff09;利用python绘制漏斗图 漏斗图&#xff08;Funnel Chart&#xff09;简介 漏斗图经常用于展示生产经营各环节的关键数值变化&#xff0c;以较高的头部开始&#xff0c;较低的底部结束&#xff0c;可视化呈现各环节的转化效率与变动大小。一般重…