• 我在大三春夏学期上了张国川老师的《应用运筹学基础》这门课。
  • 张国川老师坚持板书讲解,课上干货满满,是不可多得的好老师。
  • 我本来是在 TSR 学长的博客 的基础上补充知识点的。张老师在期末时把“上课笔记整理”也作为了考核方式之一,于是我把 TSR 学长的部分内容也结合进来了。
  • 这篇文章是系列之一,还有两个系列分别是:

凸集、凸函数、凸优化

  • 凸集:任取 x,ySx, y \in Sθ[0,1]\forall \theta \in [0,1] 满足 θx+(1θ)yS\theta x + (1-\theta)y \in S,称集合 SS 凸集(Convex Set)
    • 凸集的交仍然是凸集。
    • 如果没有 θ[0,1]\forall \theta \in [0,1] 的条件,称集合 SS 仿射集(Affine set)。
  • 凸函数:对于定义在凸集 SS 上的函数 f(x)f(x),若对于 θ[0,1]\forall \theta \in [0,1]f(θx+(1θ)y)θf(x)+(1θ)f(y)f(\theta x + (1-\theta) y) \le \theta f(x) + (1-\theta) f(y),那么称 f(x)f(x)凸函数(Convex Function)
    • 延森不等式(Jensen’s inequality):若 f(x)f(x) 是凸函数, f(i=1nθixi)i=1nθif(xi)f(\sum_{i=1}^n \theta_ix_i) \le \sum_{i=1}^n \theta_i f(x_i)
    • 定理:凸函数的局部最优就是全局最优
      1. 假设 x^\hat{x} 是局部最优点,xx^\ast 为全局最优点,则 f(x^)>f(x)f(\hat{x}) > f(x^\ast)
      2. 由于 f(x)f(x) 为凸函数,那么对于点 x=θx^+(1θ)xx = \theta \hat{x} + (1-\theta)x^\astf(x)θf(x^)+(1θ)f(x)<f(x^)f(x) \le \theta f(\hat{x}) + (1-\theta) f(x^\ast) < f(\hat{x})
      3. θ=1ϵ2x^x\theta = 1 - \frac{\epsilon}{2|\hat{x}-x^\ast|},就有 xx^=ϵ2<ϵ|x - \hat{x}| = \frac{\epsilon}{2} < \epsilon,说明 xxx^\hat{x} 的邻域内且比它优,矛盾。
    • 凸函数的判定条件:
      • 一阶判定条件:设 f(x)f(x) 在凸集 CC 上一阶可微,则该函数为凸的充要条件是:对于 x,yC\forall x, y \in C,都满足 f(y)f(x)+f(x)T(yx)f(y) \ge f(x) + \nabla f(x)^T(y-x).
      • 二阶判定条件:设 f(x)f(x) 在凸集 CC 上二阶可微,则该函数为凸的充要条件是:对 xC\forall x \in C,都满足 2(x)0\nabla^2(x) \succeq 0
  • 凸优化:优化 minf(x)s.t. gi(x)0,i[1..m]hi(x)=0,i[1..p]\min f(x) \quad \text{s.t. } g_{i}(x) \leq 0,i \in [1..m] \quad h_{i}(x)=0, i \in [1..p]。其中 f(x),gi(x)f(x),g_i(x) 是凸函数,hi(x)h_i(x) 是仿射函数。
    • 定义拉格朗日函数 LL:$ \mathbf{R}^{n} \times \mathbf{R}^{m} \times \mathbf{R}^{p} \mapsto \mathbf{R}$, $ L(x, \lambda, v)=f{0}(x)+\sum_{i=1}^{m} \lambda_{i} g_{i}(x)+\sum_{i=1}^{p} v_{i} h_{i}(x)$
    • 最优解 (x,λ,v)\pmb{(x,\lambda,v)} 满足 KKT 条件
      • 原始条件:gi(x)0,hi(x)=0g_i(x) \le 0, h_i(x) =0
      • 拉格朗日函数梯度为 00xL=0\nabla_x L = \pmb{0}
      • 对偶约束:λi0\lambda_i \ge 0
      • 互补松弛条件:λigi(x)=0\lambda_ig_i(x)=0

线性规划的定义

  • 左边形式的问题被称为线性规划(Linear Programming)
    • 由于仿射函数既是凸函数又是凹函数,所以优化问题是 min 还是 max 问题不大;常数 dd 对优化问题的解没有影响,一般也可以去掉。这就变成了中间的这个优化函数。
    • 对于 AxbAx \le b 这个约束,可以通过添加非负变量将其松弛成等式。所以我们总能将线性规划转成右侧的形式。右式也称为线性规划的典则形式
  • 极点:若 xSx \in S 无法表示为凸集 SS 内某两个元素的凸组合,称 xx极点(extreme point)
    • LP 问题的可行域实际上是很多超平面的交,最后组成的应该是一个超多面体。
    • 极点就是超多面体的“顶点”。可以证明,若最优解有解,必然取在极点上:
      1. 假设最优点 OO 严格在凸集里面。任取一条与凸集交在 PPQQ 的直线。因为是线性规划问题,OO 点处的函数值一定是 PP 点和 QQ 点的线性组合。所以 PPQQ 中,至少有一处的函数值是大于等于 OO 的。
      2. 我们可以重复上述步骤,把最优点一步一步约束到顶点上。比如在三维中,我们先将其“规约”到凸壳的表面上,最后“规约”到凸壳的边和点上。
  • 基可行解:我们讨论 Ax=bAx = b 有解且行满秩的情况(如果不满秩就去掉线性相关的限制条件)。设 AA 是一个 m×nm \times n 的矩阵,根据线性代数的知识,我们可以从 AA 中选出最多 mm 列线性无关的列向量,其它列向量都和它们线性相关。我们把这 mm 个列向量调整到前面去,把 AA 分成两部分:A=[ABAN]A = \begin{bmatrix} A_B & A_N \end{bmatrix}.容易构造出 Ax=bAx = b 的一个解:x=[AB1b0]Tx = \begin{bmatrix} A_B^{-1}b \quad 0 \end{bmatrix}^T,称这种解为基可行解(Basic Feasible Solution)。显然,基可行解至多有 CnmC_n^m 种。
    • 定理1:每个极点都对应着一个基可行解,且每个基可行解都对应着一个极点
    • 定理2:最优解一定可以在基可行解处取到
  • tsr 的概念讲解

单纯形法

  • 单纯形法(Simplex Method)(以 max\max 模型为例)
    1. AA 中的基变量消成单位矩阵,并把目标函数基变量的系数都消成 00
    2. 以某种策略找一个 cj>0c_j>0 的非基变量 jj 入基
    3. 依次考察 bi>0b_i > 0 的行,确定一行 ii 使得 biAi,j\frac{b_i}{A_{i,j}} 最小(对于 jj 最紧的限制)。
    4. 拿第 ii 行去消,把每一行的 A?,jA_{?,j} 以及目标函数的 cjc_j 都消成 00。即第 ii 行的基变量出基
    5. 重复步骤 242 \sim 4 直到检验数全大于 00.
  • 单纯形表(Simplex Tabuleau)
    • 变量分成基变量和非基变量:设 cT=[cBTcNT]c^T = \begin{bmatrix} c_B^T & c_N^T \end{bmatrix}A=[ABAN]A = \begin{bmatrix} A_B & A_N \end{bmatrix}x=[xBTxNT]Tx = \begin{bmatrix} x_B^T & x_N^T \end{bmatrix}^T
    • 显然我们有 ABxB+ANxN=bA_Bx_B + A_Nx_N = bz=cBTxB+cNTxNz = c_B^Tx_B + c_N^Tx_N
    • 通过简单的线性变换有:
    • 这其实就是单纯形法的形式化迭代过程
  • 评价
    • 变换的本质是:在满足约束的限制下,用不同的非基变量组合来表示目标函数。
    • 当非基变量的检验值均 0\le 0 时取到最大值。我们可以想象成,目标函数就是由这些非基变量决定的,它们目前都取了 00,而且任意变量的微小增长都会导致结果变劣。
    • 单纯形正确性证明
      1. 设最终的检验数是 c^\hat{c}(均小于 00),对应的解是 xx,最优解是 yy
      2. d=xyd=x-y,我们有 AxAy=bb=0=Ad=ABdB+ANdNAx - Ay = b - b = 0 = Ad = A_Bd_B + A_Nd_N
      3. 那么 dB=AB1ANdNd_B = -A_B^{-1}A_Nd_N,则 cTd=cBTdB+cNTdN=(cNTcBTAB1AN)dN=c^dNc^Td = c_B^Td_B + c_N^Td_N = (c_N^T-c_B^TA_B^{-1}A_N)d_N = \hat{c}d_N
      4. 我们知道 xN=0x_N = 0,又 y0y \ge 0,所以 dN0d_N \ge 0;又 c^0\hat{c} \le 0,所以 cTd=c^dN0c^Td = \hat{c}d_N \le 0,那么 cTy=cTx+cTdcTxc^Ty = c^Tx + c^Td \le c^Tx,说明 yy 并没有比 xx 更优。
    • 在非退化情况下,单纯形法一定可以停止。因为每次迭代都会让答案更优一点,访问的基可行解空间是不会重复的。而基可行解数量又是有限的,所以算法一定可以停止。
    • 可以证明,如果按字典序的顺序选取 jj,单纯形算法一定可以停止。
  • tsr 讲解单纯形法

单纯形法的初始可行解

  • 初始可行解
    • 若单纯形的约束是 AxbAx \leq b,初始可行解可以取 x=0x = \pmb{0}.
    • 若约束是 Ax=bAx = b 时,我们可以通过加入松弛变量 xˉ\bar{x} 使得 Ax+xˉ=bAx + \bar{x} = b,这样 x=0,xˉ=bx = \pmb{0}, \bar{x} = b 是初始可行解。这里存在一个问题:xˉ\bar{x} 是我们添加进去的变量——我们希望 xˉ\bar{x} 能全部出基。
  • 大 M 法(Big M Method)
    • 对不为 00xˉ\bar{x} 进行“惩罚”。将目标函数改为 z=cTxMi=1mxˉiz = c^Tx - M\sum_{i=1}^m\bar{x}_i。如果 MM 是一个足够大的正数,xˉ\bar{x} 就会在 M-M 这个“严厉的惩罚”之下变成 00
    • MM 取多大很难说,且取得过大会影响精度。
  • 两阶段法(Two-Phase Method)
    • 添加了 xˉ\bar{x} 后,我们考虑一个新的线性规划:约束不变,改成优化 minxˉi\min {\sum \bar{x}_i} 这个函数。一组显然的初始可行解是 x=0,xˉ=bx = \pmb{0}, \bar{x} = b.
    • 如果这个优化问题的最优解的目标函数值不为 00,则原问题无可行解;否则我们就找到了原问题的一组可行解。我们再以这个可行解为起点,利用单纯形法求出原问题的最优解即可。
    • 由此可以发现,线性规划的可行解和最优解求解难度相同
  • 思考:对于 maxcTx,Axb\max c^Tx,Ax \le b 这个模型,如果突然多了一个 x14x_1 \ge 4 的条件怎么办?
    • 添加一个松弛变量 x\overline{x}x1+x=4-x_1+\overline{x} = -4
    • 此时会发生一个问题:x\overline{x}bb 至少有一个会取负号,不符合约束。
    • 怎么办呢?再引进一个变量 x^\hat{x}x1x+x^=4x_1-\overline{x}+\hat{x}=4
    • 至此,x^=4\hat{x}=4 是新问题的一个可行解,直接套大M法或二阶段法求解。
  • tsr 讲解初始可行解

对偶定理与对偶单纯形法

  • 线性规划的对偶

  • 对偶定理
    • 弱对偶定理 (Weak Duality):设 xxyy 分别是原问题和对偶问题的可行解,则 cTxbTyc^{\rm T}x \le b^{\rm T}y。证明:由 yy 的可行性我们有 ATycA^{\rm T}y \ge c,即 yTAcTy^{\rm T}A \ge c^{\rm T},两边同乘以 xxyTAxcTxy^{\rm T}Ax \ge c^{\rm T}x;由 xx 的可行性还有 AxbAx \le b,那么 yTAxyTby^{\rm T}Ax \le y^{\rm T}b,合起来就是 cTxbTyc^{\rm T}x \le b^{\rm T}y
      • 最优性:若 xxyy 分别是原问题和对偶问题的可行解,而且 cTx=bTyc^\mathrm{T}x=b^\mathrm{T}y,那么 xxyy 分别是原问题和对偶问题的最优解。
      • 可行性:若原问题无最优解(可以取无穷大),则对偶问题无可行解;若对偶问题无最优解(可以去无穷小),则原问题无可行解。
    • 强对偶定理 (Strong Duality):若原问题(或对偶问题)有有限最优解,那么对偶问题(或原问题)也有有限最优解,且二者最优解相等。通过单纯形法的计算过程来辅助证明。
    • 互补松弛定理 (Complementary Slackness):若 xx^\astyy^\ast 分别是原问题和对偶问题的可行解,以下两点等价
      1. xx^\astyy^\ast 分别是原问题和对偶问题的最优解;
      2. (yTAcT)x=0(y^{\ast {\rm T}}A - c^{\rm T})x^\ast = 0yT(Axb)=0y^{\ast {\rm T}}(Ax^\ast-b) = 0
  • 对偶单纯形法步骤(以 min\min 模型为例)
    1. 取一组检验数全都 0\ge 0 的基。
    2. 找一个 bi<0b_i < 0 (一般找绝对值最大的)行 ii,将非基变量 ii 出基。
    3. 我们想让某个非基变量从 00 变成大于 00 来增加 bib_i。在这一行中,找一个 Ai,j<0A_{i,j}< 0jj 使得 cjAi,j|\frac{c_j}{A_{i,j}}| 最小(这样 jj 消完目标函数后检验数依然全都 0\ge 0),让 jj 入基。
    4. 重复步骤 232 \sim 3 直到约束右侧的值均 0\ge 0
  • tsr 讲解对偶单纯形