运筹学 | 基础向 | 线性规划、单纯形法
- 这篇博客是 b 站王老师运筹学应试向网课 的随堂笔记,对应讲座 P1 - P4。
- 强烈安利王老师的网课 ✔️ 比课本好理解,节奏足够快,适合课余时间自学。
- 本人以前无运筹学基础,直接听应试向网课,感觉还可以。对于各位自学选手,如果感觉应试向太快,建议看 王老师的教学向视频。
- 本博客
- 首先,介绍了线性规划基本概念,
- 然后,介绍了单纯形法的感性思想,
- 最后,介绍了具体做法“单纯形表”,并讨论了几个变式。
- 在换基迭代、检验数部分(2.3 节),有超棒的图解!直观理解单纯形法,这一篇就够了 😏
目录
1 线性规划:概念、模型、图解法
1.1 线性规划的定义
规划三要素:
- 目标函数;
- 决策变量约束;
- 资源约束。
线性:
- 【约束】是线性的;
- 【目标函数】是线性的;
- 所有变量取值连续。
形式: 最常用的是矩阵形式,后面常用到。
标准形式:
- 目标函数 max:取相反数。
- 约束 不等式 → 等式:加减非负变量(加松弛,减剩余)。
- 等式约束的右端项非负:取相反数。
- 决策变量非负:决策变量如果没有约束,将其转化为两个非负变量的差。
1.2 图解法求解简单线性规划
步骤
- 画坐标系。因为决策变量非负,所以 所有可行解都在第一象限。
- 标出可行域。
- 图示目标函数:是一簇平行直线。
- 确定最优解:目标函数平行直线 截距最大的点。
- 可能结局:
- 唯一最优解;
- 无穷多最优解(多个且有限个最优解 是不可能的,因为可行域凸);
- 无界解(目标函数取值可以无穷大,没有意义,现实场景建模错误);
- 无解(可行域不存在)。
- 可能结局:
启示
- 若可行域存在,则是凸集。
- 最优解(或最优解之一)是可行域顶点:因此只遍历顶点就行了。
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 单纯形法:迭代求解思想
思路(图解法的启示)
- 先找一个基可行解(顶点),判断是否为最优解。
- 如果是,那么找到啦,结束。
- 如果不是,则沿着可行域的边缘移动,保证这条边缘的移动方向 让目标函数值不断增大,直至挪到另一个顶点;判断该顶点是否最优解,不是则继续移动,直到找到最优解为止。
简而言之,找基解 → 验证最优性 → 换基迭代。
转换到相邻基可行解(即 挪到下一个顶点)
首先,只变换一个基变量,可以得到两个相邻的基可行解(定理),即:
Pj 入基的具体方法:用原来的 m 个基向量,线性表示 Pj,即:\(P_j=\sum_ia_iP_i\)。
🟡 为原来的基可行解,🟠 为线性表示 Pj 的系数。直观来说,原来 m 个基向量分别拿出自己的一部分,齐心协力组成了新向量 Pj。
随着它们拿出的分量越来越大,Pj 前面的系数越来越大,原来 m 个基向量的系数越来越小。随着它们不断拿出(绿色 ▲ 不断增大),原来 m 个基向量中的某个向量 Pi 会先耗尽(🟡 - ▲🟠 = 0 ),即 拿出了自己的所有。此时,Pi 出基,Pj 入基。
判断是否最优解
首先,如果该顶点的目标函数 ≥ 两侧相邻顶点的目标函数,则该顶点是最优解(定理)。
我们引入检验数 σ,代表 Pi 出基、Pj 入基后的目标函数增益,计算方法如下:
红色方块为目标函数对决策变量的系数,直观理解为 每多造一个特定产品的收益。
如果该顶点移到两侧相邻顶点的检验数 σ 都 ≤ 0,则该顶点是最优解。
3 方法论:单纯形表
3.1 复习单纯形法迭代原理
- 找到初始基可行解,判断是否最优(检验数);
- 如果不是最优解,
- 将 单位变动收益最大(检验数最大)的非基变量,作为入基变量;
- 将 最先因资源受限而降为 0 的基变量,作为出基变量。
- 通过换基,得到更优的解。不断重复,直到找到最优解。
3.2 单纯形表:具体做法
单纯形表的格式:
推荐 超棒的以题代学视频,看一遍就懂了!(所以不具体讲了)
关键:
- 通过行变换,把 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\) 的形式。