运筹学 | 基础向 | 线性规划、单纯形法

  • 这篇博客是 b 站王老师运筹学应试向网课 的随堂笔记,对应讲座 P1 - P4。
    • 强烈安利王老师的网课 ✔️ 比课本好理解,节奏足够快,适合课余时间自学。
    • 本人以前无运筹学基础,直接听应试向网课,感觉还可以。对于各位自学选手,如果感觉应试向太快,建议看 王老师的教学向视频
  • 本博客
    • 首先,介绍了线性规划基本概念,
    • 然后,介绍了单纯形法的感性思想,
    • 最后,介绍了具体做法“单纯形表”,并讨论了几个变式。
  • 在换基迭代、检验数部分(2.3 节),有超棒的图解!直观理解单纯形法,这一篇就够了 😏
img

1 线性规划:概念、模型、图解法

1.1 线性规划的定义

规划三要素:

  • 目标函数;
  • 决策变量约束;
  • 资源约束。

线性:

  • 【约束】是线性的;
  • 【目标函数】是线性的;
  • 所有变量取值连续。

形式: 最常用的是矩阵形式,后面常用到。

image-20220611144531858

标准形式:

  1. 目标函数 max:取相反数。
  2. 约束 不等式 → 等式:加减非负变量(加松弛,减剩余)。
  3. 等式约束的右端项非负:取相反数。
  4. 决策变量非负:决策变量如果没有约束,将其转化为两个非负变量的差。

1.2 图解法求解简单线性规划

步骤

  1. 画坐标系。因为决策变量非负,所以 所有可行解都在第一象限。
  2. 标出可行域。
  3. 图示目标函数:是一簇平行直线。
  4. 确定最优解:目标函数平行直线 截距最大的点。
    • 可能结局:
      • 唯一最优解;
      • 无穷多最优解(多个且有限个最优解 是不可能的,因为可行域凸);
      • 无界解(目标函数取值可以无穷大,没有意义,现实场景建模错误);
      • 无解(可行域不存在)。
image-20220912101146719

启示

  • 若可行域存在,则是凸集。
  • 最优解(或最优解之一)是可行域顶点:因此只遍历顶点就行了。

2 单纯形法的感性理解

2.1 一些概念 & 定义

  • 基解相关:
    • 基:约束方程中 系数矩阵 的一个满秩子矩阵(随便取一个满秩子矩阵,所以可能有多组基)。
    • 基向量:基中各个列向量。
    • 基变量:基的每一列 对应的决策变量。
    • 基解:令非基变量为 0,(此时有唯一解)得到的方程组的解。
    • 基可行解:如果某一组基的基解,恰好满足基变量非负约束,那么基可行解。
    • 可行基:一个基可行解对应的基(不知是否一定存在)。
  • 凸集相关:
    • 凸集:两点连线( \(x = αx_1 + (1-α)x_2,~α\in[0,1]\) )仍在区域中。
    • 顶点:没法找到两点 X1 X2,使得点 X 在线段 X1 X2 上,则 X 是顶点。

2.2 单纯形法的支持定理

  • 定理1:若线性规划存在可行解,则问题可行域为凸集。

    • 证明思路:去证 两点连线(坐标线性组合)仍在区域中。
    • 设满足约束条件 \(Ax=b\) 的所有点组成几何图形 C,任意 \(x_1,x_2 ∈ C\),有 \(Ax_1=Ax_2=b\),所以 \(Ax=A[αx_1 + (1-α)x_2]=[α+(1-α)]b=b\)
  • 引理:可行解 X 为基可行解 <=> X 的正分量 对应的系数列向量 线性独立。

    • ⇨:

      • 基可行解的定义:只取一组基的基变量,其他决策变量=0,拿去解约束方程得到的解,并且该解还满足非负约束(即可行解)。
      • 正分量对应的列向量是基,基当然是线性独立的。
    • ⇦:

      • 设解 X 的前 k 个分量 \(x_1..x_k\) 为正,对应的系数矩阵列向量 \(P_1..P_k\) 线性独立。
      • 当 k = 约束等式行数 m 时,\(P_1..P_k\) 组成一个 m×m 满秩矩阵,把它作为基,就能得到基可行解,即 X。
      • 当 k<约束等式行数 m 时,在 \(P_1..P_k\) 之外,再找 m-k 个相互独立的系数矩阵列向量(一定能找到),保证它们组成 m×m 满秩矩阵。把满秩矩阵作为基,就能得到基可行解 X,不过,后 m-k 个系数列向量对应的决策变量都 = 0。
  • 定理2:X 是基可行解 <=> X 是可行域(凸集)的顶点。

    • 证明思路:反证法,去证 X 不是基可行解 <=> X 不是顶点:
    • 不是基可行解 → 不是顶点:
      • 系数矩阵 A(m 行(约束等式行数,也是秩) n 列(决策变量个数));
      • 设解 X 前 k 个分量不为零(为正);因为不是基可行解,所以前 k 个分量对应的 系数矩阵列向量 不线性独立,即,可以找到一组 β,做线性组合 ΣβiAi=0。这组 β 加上 n-k 个 0(记为 β0)是 Ax=0 的解。
      • X 是 Ax=b 的解,那么 X+β0、X-β0 也是 Ax=b 的解。只要 β0 足够小,就离开 X 一点点,就能保证 X±β0 ≥ 0,也在可行域里。因此,X 在 X+β0、X-β0 的连线上,不是顶点。
    • 不是顶点 → 不是基可行解:
      • 设解 X 前 k 个分量不为零(为正);因为不是顶点,所以可行域内存在另外两点 Y Z,满足 X = aY+(1-a)Z。因为 Y Z 都 ≥ 0,而 X 的后 n-k 个分量 = 0,没法被>0 的数线性组合得到,因此 Y Z 后 n-k 个分量也为 0。
      • 因为 X Y Z 都在可行域里,所以 AX=AY=AZ=b,所以 A(Y-Z)=0,即,系数矩阵的前 k 个列向量 可以被线性组合 = 0,即 X 的非零分量列向量 不线性独立,由引理得知,X 不是基可行解。
  • 定理3:若线性规划存在最优解,则一定存在一个基可行解 为最优解。

    • 证明思路:当最优解 X0 不是基可行解时,去证 存在基可行解 X 也是最优解。
    • 因为 X0 不是基可行解(即 顶点),所以可以由 X0+μδ、X0-μδ 表示(μ 为步长,δ 是模 = 1 的方向向量)。
    • X0 最优,即 \(c = \langle C,X_0\rangle\)(内积)是 max,C(X0+μδ) ≤ c,C(X0-μδ) ≤ c,得到 Cμδ ≤ 且 ≥ 0 \(\Longrightarrow\) Cμδ=0,即 C(X0+μδ)、C(X0-μδ) 都 = c,X0+μδ、X0-μδ 都是最优解。
    • 二维的直观理解:如果无穷多个最优解,则 目标函数的斜率 和 某一约束条件的斜率(可行域的一个边缘)相同。对不是顶点的最优解,过它的线段 都在这条边缘上,边缘所有点都最优,所以边缘顶点也最优。
    • 经过若干次移动后,总能移动到顶点,这个顶点(即 基可行解)也是最优解。

定理 3 意味着什么呢?意味着,只要遍历可行域的所有顶点(所有基可行解),就能找到最优解啦!

2.3 单纯形法:迭代求解思想

思路(图解法的启示)

  • 先找一个基可行解(顶点),判断是否为最优解。
  • 如果是,那么找到啦,结束。
  • 如果不是,则沿着可行域的边缘移动,保证这条边缘的移动方向 让目标函数值不断增大,直至挪到另一个顶点;判断该顶点是否最优解,不是则继续移动,直到找到最优解为止。

简而言之,找基解 → 验证最优性 → 换基迭代。

转换到相邻基可行解(即 挪到下一个顶点)

首先,只变换一个基变量,可以得到两个相邻的基可行解(定理),即:

image-20220911184137532

Pj 入基的具体方法:用原来的 m 个基向量,线性表示 Pj,即:\(P_j=\sum_ia_iP_i\)

image-20220911191350614

🟡 为原来的基可行解,🟠 为线性表示 Pj 的系数。直观来说,原来 m 个基向量分别拿出自己的一部分,齐心协力组成了新向量 Pj。

随着它们拿出的分量越来越大,Pj 前面的系数越来越大,原来 m 个基向量的系数越来越小。随着它们不断拿出(绿色 ▲ 不断增大),原来 m 个基向量中的某个向量 Pi 会先耗尽(🟡 - ▲🟠 = 0 ),即 拿出了自己的所有。此时,Pi 出基,Pj 入基。

判断是否最优解

首先,如果该顶点的目标函数 ≥ 两侧相邻顶点的目标函数,则该顶点是最优解(定理)。

我们引入检验数 σ,代表 Pi 出基、Pj 入基后的目标函数增益,计算方法如下:

image-20220911193619299

红色方块为目标函数对决策变量的系数,直观理解为 每多造一个特定产品的收益。

如果该顶点移到两侧相邻顶点的检验数 σ 都 ≤ 0,则该顶点是最优解。

3 方法论:单纯形表

3.1 复习单纯形法迭代原理

  • 找到初始基可行解,判断是否最优(检验数);
  • 如果不是最优解,
    • 将 单位变动收益最大(检验数最大)的非基变量,作为入基变量;
    • 将 最先因资源受限而降为 0 的基变量,作为出基变量。
  • 通过换基,得到更优的解。不断重复,直到找到最优解。

3.2 单纯形表:具体做法

单纯形表的格式:

image-20220911200817509

推荐 超棒的以题代学视频,看一遍就懂了!(所以不具体讲了)

关键:

  • 通过行变换,把 m 个基向量 化成单位矩阵形式,方便计算检验数。
  • \(θ_i\):用 m 个基向量表示 \(x_i\)(检验数 σ 最大的向量,入基变量)时,单纯考虑每个基变量,最多能表示多少个 \(x_i\)
    • 即 表示多少个 \(x_i\) 后,该行对应的基变量 因资源受限降为 0。
    • 选择 \(θ_i\) 最小的基变量,作为出基变量。

3.3 变式:大 M 法、两阶段法、单纯形法的优化

大 M 法(人工变量法):

  • 使用场景:系数矩阵没法凑出单位阵(注意,为保证资源约束非负,系数矩阵的行变换 不能给某一行乘负数)。
  • 具体用法:
    • 给某些行加一个人工变量 \(x_{n+1}\),即 \(a_1x_1+\cdots+a_nx_n + x_{n+1}=b_n\)
    • 必须保证 \(x_{n+1}=0\),因此,给目标函数添加 \(x_{n+1}\) 的惩罚项,即 \(\max z=c_1x_1+\cdots+c_nx_n-Mx_{n+1}\),M 是一个足够大的数,称为罚数。
    • 然后,正常画单纯形表。不需要给 M 赋值,直接在表中写 M 即可。
    • 迭代过程中,如果所有检验数 σ 都 ≤ 0,但该解中人工变量 ≠ 0,则无解。(也是无可行解的唯一情况!)

两阶段法(计算流程更明确,方便编程计算):

  • 使用场景:同大 M 法,系数矩阵没法凑出单位阵。
  • 具体用法:
    • 将添加人工变量后的线性规划,拆分成两个阶段:
    • 第一阶段:求解一个 ① 目标函数只包含 -人工变量 ② 决策变量包含所有变量 的线性规划问题。其中,人工变量只有取 0,目标函数才能最优,该最优解即原问题的一个基可行解。
    • 第二阶段:求解 ① 原目标函数 ② 决策变量不包含人工变量 的线性规划,将第一阶段最后的基作为初始基,进行单纯形法迭代。

计算流程的优化:

  • 原流程:确定入基变量(检验数)、出基变量(θ)后,计算 新基变量矩阵 的逆矩阵,用逆矩阵去乘 ① 整个系数矩阵 ② 资源约束向量,完成入基和出基。
  • 具体用法:确定入基变量(检验数)、出基变量(θ)后,对系数矩阵进行初等行变换,将入基变量化为 \((0,\cdots,1,\cdots,0)^T\) 的形式。
posted @ 2022-09-12 10:29  MoonOut  阅读(835)  评论(0编辑  收藏  举报