数学规划#
数学规划是指在满足一定约束条件的前提下,寻找一个最优解的问题。根据目标函数和约束条件的不同,数学规划可以分为线性规划、整数规划、非线性规划等多种类型。
max(min)f(x)s.t.gi(x)≤0,i=1,2,...,mhj(x)=0,j=1,2,...,p
- 有约束规划:存在 gi(x) 和 hj(x) 约束条件
- 无约束规划:没有约束条件,只有目标函数 f(x)
- 线性规划:目标函数和约束条件都是线性的
- 整数规划:决策变量必须是整数
- 非线性规划:目标函数或约束条件至少有一个是非线性的
可行解#
满足约束条件的解称为可行解。可行解的集合称为可行域。
线性规划的一般形式与标准形式#
LP的一般形式#
max(min)zs.t.j=1∑naijxjxj=j=1∑ncjxj<(>)bi,i=1,2,...,m≥0,j=1,2,...,n或者矩阵形式:
max(min)zs.t.Axx=cTx<(>)b≥0LP的标准形式#
任何线性规划都可以化成标准形式。满足
- 目标函数是最大化
- 决策变量(xi)非负
- 约束条件一律等式(除决策变量非负约束外)
- 约束条件右端(bi)是非负数
maxzs.t.Axx=cTx=b≥0c,x∈Rn,A∈Rm×n,b∈Rm如何将一般形式转化为标准形式#
目标函数:如果是最小化问题,可以通过取负号转化为最大化问题
加上松弛变量 xi′ 和减去剩余变量 xi′′ ( 均非负 )
自由变量(无约束):拆成两个非负变量的差。
LP的可行解(域) ⟺ 方程组 Ax=b 的解集与 x≥0 的交集。这是一个凸多面体(polytope)里的所有点。在可行域里面找特殊结构,就是下文提到的基本可行解。
线性规划的解空间#
基变量和非基变量#
一般假设 rank(A)=m,可以解出 m 个变量,称作 基变量 ,即 xB=x1,x2,...,xm 里面的分量,剩下的 n−m 个变量为 自由变量 (xN 里面的分量),或者 非基变量 。
这俩的关系可以用矩阵分块来表示:
A=[B∣N],x=[xBxN]从 A 中选出 rank(A) 列线性无关的列向量,他们对应的变量是基变量(系数构成单位矩阵的变量),剩下的列向量对应的变量是非基变量。
TIP这也解释了为啥基变量的数量等于约束条件的数量 m,非基变量的数量等于决策变量的总数减去基变量的数量 n−m。
然后令非基变量 xN=0,解出基变量 xB 的值,这样就得到了一个基本解。基本解可能不满足非负约束 xB≥0,如果满足则称为基本可行解。
基本解和基本可行解#
非基变量组成 xN ,基变量组成 xB ,当 xN=0 时,x=[xBxN] 称为 基本解 。
- 基本解可能不满足非负约束 xB≥0,即有可能不可行;如果满足则称为 基本可行解 。
- 基本解的数量最多为 Cnm 个。
当基本解的各个分量都非负时,基本解就是基本可行解。(BFS)
- 基本可行解满足 xB≥0
- 基本可行解的数量最多为 Cnm 个。
- 基本可行解 = 可行域的顶点(极点)这是单纯形法的核心理论基础。
基本可行解的最优解叫做 最优基本可行解 。
WARNING存在一个基本可行解是最优解,但不意味着每个最优解都是基本可行解。
线性规划的最优解可能出现在整个边或面上(无穷多最优解),其中非基本可行解(非顶点)也可能取到最优值。
例如:
maxz=x1+x2s.t.x1+x2≤1x1,x2≥0在这个例子中,所有满足 x1+x2=1 的点都是最优解,其中只有两个基本可行解(顶点)(1,0) 和 (0,1),其他点都是非基本可行解。
依旧用矩阵分块来表示:
AxBxB+NxNBxBxB当xN=b=b=b−NxN=B−1(b−NxN)=0时,xB=B−1b所以基本解是 x=[B−1b0] ,如果满足 xB=B−1b≥0 则是基本可行解。

LP的基本理论(5条)#
-
解的存在性:若可行域非空,则可行域是一个凸集,一定存在有限最优解或者无界最优解。
-
解在顶点的可达性:若存在最优解,则最优解可在某个顶点处达到。
-
顶点与基本可行解的关系:点 x 是可行域的一个顶点 ⟺ x 是一个基本可行解。
-
LP问题中可行解 x 是一个基本可行解 ⟺ x 中正分量对应的系数矩阵列向量线性无关。
-
LP问题的每一个基本可行解 x 对应可行域(约束多面体)的一个极点
-
有界凸集S上的任意一点都可以表示成S的极点的凸组合。如果是无界凸集则可以表示成S的极点的凸组合加上极方向的正组合表示
-
LP问题若可行域有界,且存在最优解,则目标函数必可在其可行域的某个定点达到
-
LP问题,若存在可行性,则必存在一个基本可行解;若存在最优解,则必存在一个基本可行解是最优解。
证明略
单纯形法求解最优解#

例题:参考博客:单纯形法求解线性规划

符号含义:
- CB : 基变量在目标函数中的系数向量
- xB : 当前选择的基变量名称
- xB 右边的列:基变量的值
- x1,x2,… 上面的行:主要关注目标函数中非基变量的系数,作为一开始的检验数(检验数是目标函数中非基变量的系数,表示如果将该非基变量入基,目标函数值会增加多少)
- 中间一大白:当前的约束矩阵
- θi : 比值测试,小的离基
- 底部 −z : 表示当前目标函数值的相反数
- 底部 −z 右边的列:目标函数值的相反数,每次迭代更新,最后的目标函数值就是这个数的相反数。
- 底部 −z 右边的列的右边:检验数(目标函数中非基变量的系数),大的入基(一开始和x1,x2,… 上面的行是一样的)
初始化:检验数初始化成目标函数中非基变量的系数。填写中间一大白部分,然后非基变量取零,解基变量的值并填写基变量右边的列。
- 先选入基变量:从检验数中选出最大的,入基。
- 找到入基变量一列,用基变量的值/入基列向量的对应分量进行比值测试,选出最小的,离基。
- 这样入基变量所在的列和离基变量的行的交叉点(就是图中
()括起来的元素。),更新成1,这一列的其他地方置0(包括检验数)。具体方法是把中间一大白+检验数部分当作一大坨矩阵,用出基变量所在的行把这一列的其他元素消掉。(这一步同时更新了出基变量的检验数)
- 一次迭代结束,往下新增表格。
一直到检验数都不大于0,迭代结束,此时的目标函数值就是最优解。