线性规划单纯形法python实现与代码详细解读
1 单纯形法(Simplex method)
- 单纯形法是线性规划求解的经典方法之一,它的理论基础在于线性规划的解一定可以在顶点,即基可行解处取得。
- 举个简单例子,大家熟悉的二元线性规划中,目标函数的直线在坐标系上移动,在与可行域的交界处会取得最优解,即使目标函数与边界线相重合,也必然会有顶点位于该重合的直线上,即在顶点处必然会取得最优解。
- 基于以上论述,单纯形法就是从一个基可行解开始,通过一次改变一个基变量,从而实现从当前顶点转至下一个顶点的过程,结合基变量的模型表达式如下:
m a x c B X B + c N X N max\quad c_B X_B+c_N X_N maxcBXB+cNXN
s . t . B X B + N X N = b s.t.\quad B{X}_{B}+N{X}_{N}=b s.t.BXB+NXN=b
X B ≥ 0 , X N ≥ 0 \qquad X_{B}\ge0,X_{N}\ge0 XB≥0,XN≥0
2 编程思路
对于单纯形法的编程实现,其主要基于单纯形表,即约束系数矩阵,约束常数项以及检验数组成,通过初等行变换不断构建列线性无关的基,观察检验数的变化,当检验数表示其他变量入基不会带来更好的目标时,也就达到了最优解,具体的过程解读以及内在含义将在下方结合代码说明。
3 python实现原理解读
鉴于博主也为算法小白,源代码参考于运筹系列1:线性规划单纯形法python代码
原博主的代码实现方式非常简洁,但对于初学者而言还是会相对难以理解,本文也旨在对其做较为详细的说明与解读。
- 数据准备
该算法的输入为一个已有一组基的单纯形表,目标函数取最大值,如下表
( 1 14 6 0 0 0 0 0 1 1 1 1 0 0 0 4 1 0 0 0 1 0 0 2 0 0 1 0 0 1 0 3 0 3 1 0 0 0 1 26 ( x 1 x 2 x 3 x 4 x 5 x 6 x 7 b ) ) \quad\quad\quad\quad\quad\quad\quad\quad\begin{pmatrix} 1&14&6&0&0&0 &0&0\\\\ 1&1&1&1&0&0 &0&4\\\\ 1&0&0&0&1&0 &0&2\\\\ 0&0&1&0&0&1 &0&3\\\\ 0&3&1&0&0&0 &1&26\\\\ (x_1&x_2&x_3&x_4&x_5&x_6 &x_7&b)\\\\ \end{pmatrix} ⎝⎜⎜⎜⎜⎜⎜