单纯形法实现

联系我:ligong15 AT foxmail.com

2020年春节期间疫情期间完成此部分内容学习回顾

之前一直使用Gurobi对各种整数规划以及线性规划模型进行求解,单纯形法一直未曾实现,借春节休息时间进行完成。

首先弥补单纯形法的理论基础。此前学习过程中经常是使用的时候再去回顾一下,机理并未参透,今日看到了单纯形法直观解释(记为博客1)与单纯形法理论解释(记为博客2)。

通过两篇文章,对单纯形法进行了实施,值得注意的是,实现过程中,变动的为基可行解,那么基可行解对应的B以及其逆矩阵可以通过numpy很简单的求解出来,检验数也可以通过下式很方便的求得。

入基所需步骤:此时xb,xn确定。1、获取B,获取B的逆矩阵;2、通过下式获取检验数构成的向量;3、根据目标函数max或是min,选取向量中对应的换入变量。若是求min,则是向量中小于零的最小值,即,选此变量,能使目标函数进一步减小;若是求max,则是向量中大于零的最大值,即,选此变量,能使目标函数进一步增大。

f=c^{T}x=c_{B}^{T}x_{B}+c_{N}^{T}x_{N}=c_{B}^{T}\left ( B^{-1}b-B^{-1}Nx_{N}\right )+c_{N}^{T}x_{N}

=c_{B}^{T} B^{-1}b+\left ( c_{N}^{T}- c_{B}^{T}B^{-1}N\right )x_{N}

出基所需步骤:出基则是在确定换入变量的基础上,选取合适的基变量,将其替换为入基所获取的换入变量。类比次梯度法,入基相当于确定方向,出基相当于确定步长。此部分摘录博客1中相应内内容:

单纯形法实现_第1张图片

在求换出变量的过程中,需要计算\theta值,\theta值的求解为单纯形表中b^{_{i}}/a_{ij},当前单纯形表为B^{^{-1}}A,当前等式右端bB^{^{-1}}b,那么\theta值计算所需元素均已获取,可以进行\theta值的计算。

对以上进行归纳,每次迭代过程中,不对单纯形表进行完全的计算与存储。:

1、直接已知数据:x_{}Bx_{N}Acb

2、间接已知数据:BB^{^{-1}}c_{B}^{T}c_{N}^{T}NB^{^{-1}}AB^{^{-1}}b

3、计算数据:检验数,\theta

 

代码详见我的GitHub

你可能感兴趣的:(数学建模,算法,线性规划,单纯形法,python,numpy)