单纯形法简陋入门

单纯形法

解决的问题

单纯形法可以在较短的时间(似乎是非多项式时间,但我不会证,也找不到论文,不过就是非常快)内解决线性规划问题

形式的处理

对于一个线性规划问题,我们可以写作(以下的x是变量,其他都是常数,大写字母表示矩阵):

max z=i=1ncixi=CXs.t.{i=1na1,ixib1i=2na2,ixib2i=1nam,ixibmxi0

其中 nm ,否则没有意义

这样的形式是不利于我们计算的,我们考虑一个更好看的形式(标准形式):

max z=i=1ncixi=CXs.t.{i=1na1,ixi=b1i=2na2,ixi=b2i=1nam,ixi=bmxi0

当然,为了处理时的一致有序,我们把z的表达式也插入到矩阵中,并令其值为0,这样这一行最后的z就是答案的相反数(也就是说后文中的C都是“答案行”消元后的系数)

下面给出一些简单情况的转化方法:

如果求的是min或约束条件中出现大于等于,全部取负即可

j=1nai,jxjbij=1nai,jxj+xn+1=bix0x=yz,yz0y,z0

如此,我们就得到了标准形式的线性约束条件

单纯形的处理

关于矩阵的联想

标准形式和线性方程组很像,我们不由得联想到高斯消元,但是线性规划是一个狭长的矩形(上文说了,总存在nm)

这时我们就不能完全消元,只能选择其中一个m阶矩阵将其变为单位矩阵,而单纯形法就是告诉我们应该选择那些来消元

更具体的步骤

选择基变量

要求z=CX的最大值,我们不难发现,对于任意ci0,我们可以直接令xi=0(当然得保证有解)

联系几何意义,线性规划实际上就是在一个超平面上的凸包里选择一个点,使其坐标的一个线性组合最大,那么不难发现是凸包最外围的“界”上的点满足性质

而“界”的代数含义就是xi=0,于是我们可以让所有我们不准备进行消元的变量为0,之后我们称这样的变量为非基变量,反之叫做基变量

显然,我们希望基变量在C中对应的系数越大越好,因为这样答案收敛快

不过除了第一次,在选择基变量时也应注意解的可行性,记基变量全体为J,有定义有

iJ,i0

于是我们采用最为朴素的方法,枚举所有的xJ,假设我们要将y加入J并将x删除,那么我们可以直接令x=0,并计算y值,代回去验证解的可行性(注意此时除了y的非基变量依然都是0而基变量经过消元后每行只有一个),然后选择最大的合法y值即可

在得到新的J之后,重新消元重复上述步骤

终止条件

结合上文,注意到当所有非基变量在C中对应的系数都不大于0时为最优解(值得一提的是,如果此时存在一个非基变量在C中的对应系数恰为0,有无穷种构造方案)

因为如果存在对应系数大于0的情况,那么可以将其作为新的基变量,并且一定会使得答案增大

又是没有实现的一天

如有错误,欢迎指正

posted @   嘉年华_efX  阅读(150)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示

目录导航