单纯形法

单纯形法(Simplex Method)是一种线性规划算法,用于求解线性规划问题。它是由乔治·达内(George Dantzig)于1947年发明的,是现代数学编程的里程碑之一。单纯形法基于线性规划问题的几何特性,通过逐步移动可行域的角点(即“单纯形”),找到最优解。

单纯形法的基本思想是从初始的可行解开始,逐步向目标函数值更小的方向搜索。每次迭代通过找到一个离当前解更好的可行解来更新当前解,直到找到最优解。

单纯形法的关键是如何在可行域中找到一个更好的角点,即如何选择进入变量和离开变量。这个过程可以通过使用单纯形表(Simplex Tableau)来实现。单纯形表是一个表格,其中每一行对应一个约束条件,每一列对应一个变量。在单纯形表中,第一行是目标函数,每个元素表示对应变量的系数。其他行的每个元素表示对应变量在该约束条件中的系数。

单纯形法的时间复杂度一般是多项式级别的,因此在实践中非常有效。但是,在某些情况下,单纯形法可能会出现慢速的情况,如存在大量的约束条件或变量。此外,单纯形法不能解决非线性规划问题。针对这些问题,研究人员提出了许多其他的线性规划算法,如内点法和分支定界法。

1.我们首先转换为非负变量的方程。

一个≤约束可以通过引入一个新变量(称为松弛变量slack variable)转换成一个等式

引入松弛变量x3使≤约束(2)化为等式

≤约束(3),≤约束(4)分别引入松弛变量x4和松弛变量x5,得到

注意:≤约束导致松弛变量slack variable,≥约束导致盈余变量surplus variable。

2.得到基本可行解

可行解feasible solution是方程的任意解,且对所有变量都大于等于0

在单纯形法中,我们总是处理基本方程集,即每个方程包含一个系数为1的变量(基变量),这个变量不会出现在任何其他方程中。其他变量是非基本的。在我们的例子中,这组基本方程包含基变量x3, x4, x5非基变量x1, x2

RHS(Right Hand Side)常数指的是线性规划问题中约束条件右边的常数,如果所有RHS常数都≥0,则一组基本方程称为可行方程。我们的集合基本且可行 basic feasible。单纯形法从一个基本可行集开始,始终保留基本可行集。(如果我们没有一个基本的可行集来开始,那么就使用两相单纯形法two-phase simplex method)

对于任何一个基本可行系统,都可以得到如下的可行解。将每个非基变量置零,每个基变量等于其对应的RHS常数。这被称为基本可行解basic feasible solution (BFS)。下面是我们方程的一个基本可行解的例子。

the BFS is x1=0, x2=0, x3=1500, x4=1500, x5=550 and z=0.

3.得到更好的基本可行系统

在这个BFS中,x1= x2= 0,但如果x1或x2中有一个为正,那么z似乎会更大(因为它们在z方程中的系数都为正)。在该方法中,我们一次只更改一个变量。

我们选择x2,因为它的z系数更大。如果我们从0增加x2,保持x1= 0,那么x3, x4, x5必须根据简化的条件集发生变化:

我们要确保x3,x4, x5≥0,观察一下

x2=500是保持x3≥0的最大值,使x3=0;

x2 =750是保持x4≥0的最大值,使x2=0;

x2 =550是保持x5≥0的最大值,使x5=0.

因此,在x3, x4, x5≥0的条件下,x2的最大可能增量是x2 = 500,(对于x2 = 550, x3的值变为负数), 此时x1=x3=0。

因此,我们现在使x1, x3成为非基变量,通过用x1, x3来解x2(使x2系数为1), 即

再将x2代入方程组的其它方程中:

因此,新的基本可行系统

the BFS is x1=0, x2=500, x3=0, x4=500, x5=50 and z=6000,x1, x3成为新的非基变量。

所以我们把z从0增加到6000。我们已经进行了单纯形法的第一次迭代。

4.开始3的循环

接下来进行第二次迭代,我们看到z = 2x1 - 4x3 + 6000,我们应该增加x1,我们将保持x3= 0(因为x1系数为正,x1增大则z增大)。

因为我们希望保持x2, x4, x5≥0。因此x1 = 150是x1的最大可能增量,此时x5=0。因此,我们现在使x3, x5成为非基变量,通过用x3, x5来解x1(使x1系数为1), 即

再将x1代入方程组的其它方程中:

因此,新的基本可行系统

the x1=150, x2=400, x3=0, x4=250, x5=0 and z=6300,x3, x5成为新的非基变量。

所以我们把z从6000增加到6300,我们又有了一个基本的可行方程组。我们已经进行了单纯形法的第二次迭代

5.得到最优解

现在让我们继续。如果我们看一下z,

z = 6300 - 2x3 - 6x5

似乎没有理由增加x3或x5的值,因为它们在z中的系数都是负的。

因此原始LP问题的最优解就是 x1=150, x2=400, x3=0, x4=250, x5=0 and z=6300。

因此,单纯形法在两次迭代中解决了这个LP问题。

同样的方法可以应用于任意数量变量的任何线性规划,只要我们有一个基本可行的系统来启动这个过程。

单纯形表法

唯一的问题是消除和替换步骤很麻烦。幸运的是,我们可以将整个过程放在一个方便的表格格式中:简化的单纯形表the contracted simplex tableau

1.改写z格式

为了方便地将求解过程写成表格形式,我们首先将z写成与基本方程组中其他方程相同的形式,举个例子:

改写z格式后,我们的LP方程变为:

2.转化LP模型为单纯形表

将LP模型直接化为单纯形表,基本可行解的基变量为x3, x4, x5非基变量x1, x2。

3.得到主列,主行,主元

注意,如果我们要最大化,现在我们感兴趣的是z行非基变量x1, x2的负系数。我们选择最负的x2,尽管任何负的都可以。这标识了tableau的一个列,称为主列pivot column

现在我们检查这一列,看看哪个基本变量限制了所选非基变量x2的增加。注意,只有当非基变量在这一列中具有正系数时,基变量才会限制非基变量的增加。例如,约束 x3 + 3x2 = 1500, x2的最大值就是500。但如果存在约束x 3 - 3x2 = 1500,则x2将没有限制(当x2增加时,x3也会增加)。

在单纯形表中,我们可以通过以下比率检验来确定哪个基变量限制了所选的非基变量:

对于主列中的正元素,确定比值

选择与最小值相对应的行。我们称这一行为主行pivot row

主行和主列的交点上被框起的元素称为主元

4.得到新的单纯形表

1.交换主列顶端上的和主行左端上的的变量,其他所有变量保持不变。

2.将主元替换为1/主元值

3.将主行中的其他项替换为原值/主元值

4.将主列中的其他项替换为 -原值/主元值

5.将所有剩余项替换为

如,当p为主元时,r为主行中的同列值,c为主列中的同行值

5.开始3,4的循环

此时z行负系数只有x1,那么选择x1该列为主列。计算比值得到最小结果为 150,即主列为x5,那么主元为 1/3

使用4的步骤得到新的单纯形表

步骤略,得到

6.得到最优解

此时z行的非基变量系数皆为正,z + 6x5 + 2x3 = 6300,即z = 6300 - 6x5 - 2x3

随着非基变量x3,x5的增加,z反而减小,也就是说,此时z达到了最大值

最优解为 x1=150, x2=400, x3=0, x4=250, x5=0 and z=6300。

单纯形法和单纯形表法相关推荐

  1. 【机器学习5】python实现单纯形法和大M法

    目录 1.手算--单纯形法 2.Python--单纯形法 3.Python包--单纯形法 4.Excel--大M法 5.python--大M法 写在前面: 关于单纯形法和大M法的原理,自己去百度吧,本 ...

  2. 单纯形法和对偶单纯形法

    前言 我在学习这个知识点的时候,花了不少时间,苦于网上的教程要么和老师描述的方法不一致(当然应该也可以),要么不全,所以当时在做作业题的时候,花了不少时间(>10hours).因此想写一篇博文来 ...

  3. R语言编写自定义函数计算R方、使用自助法Bootstrapping估计多元回归模型的R方的置信区间、可视化获得的boot对象、估计单个统计量的置信区间、分别使用分位数法和BCa法

    R语言编写自定义函数计算R方.使用自助法Bootstrapping估计多元回归模型的R方的置信区间.可视化获得的boot对象.估计单个统计量的置信区间.分别使用分位数法和BCa法(Bootstrapp ...

  4. 操作系统之进程调度——优先权法和轮转法(附上样例讲解)

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  5. 基于倒谱法和线性预测法估计基音频率(MATLAB和Python)

    基于倒谱法和线性预测法估计基音频率(MATLAB和Python) 倒谱法基音检测在python中实现 一帧信号的基音频率估计 wlen = 256 inc = 128 pitch = [] x1, F ...

  6. python中怎么比较两个列表的大小_python中对列表元素大小排序(冒泡排序法,选择排序法和插入排序法)—排序算法...

    前言 排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列.本文主要讲述python中经常用的三种排序算法,选择排序法 ...

  7. 容量法和库仑法的异同点_卡尔费休滴定仪容量法与库仑法有什么区别

    卡尔费休滴定仪可分为体积法和库仑法两种方法,我们以前很少提到这两种方法,但每种方法的原理不同.他们之间有一定的区别.有什么区别?让我们知道. 一.卡尔费休滴定仪容量法的原理. 卡尔费休容量法测定水含量 ...

  8. 室内声场计算机模拟的声线跟踪法和虚声源法,基于声线跟踪法的室外声场仿真.doc...

    基于声线跟踪法的室外声场仿真 谭同德,史晓菲,赵新灿,常村红TAN Tong-de,SHI Xiao-fei,ZHAO Xin-can,CHANG Cun-hong郑州大学 信息工程学院,郑州 450 ...

  9. 《机器学习》课后习题 3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对率回归的错误率.

    参考了han同学的答案,数据集也可在han同学的github上下载. 3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对率回归的错误率. import numpy as n ...

最新文章

  1. (区间dp 或 记忆化搜素 )Brackets -- POJ -- 2955
  2. Linux常用命令及技巧3
  3. (完美解决)linux服务器安装anaconda并且配置好jupyter从而windows远程访问
  4. SLF4J: Failed to load class org.slf4j.impl.StaticLoggerBinder.
  5. 一加7充电_夜话丨一加7超级快充明天见
  6. linux ss 命令简介 端口连接查看 代替netstat
  7. PouchContainer 容器技术演进助力阿里云原生升级
  8. Redis中的哨兵机制的不足
  9. 移动端Click300毫秒点击延迟 解决办法
  10. Abp太重了?轻量化Abp框架
  11. Leetcode--130. 被围绕的区域(java)
  12. 如何卸载mysql2008让_怎么才能把sql2008卸载干净
  13. 纪中游记 - Day 3
  14. 第08篇:Mybatis事务处理
  15. c语言写股票交易软件,写股票软件
  16. (python)爬虫----八个项目带你进入爬虫的世界
  17. 微博改变一切_改变自己是神,改变别人是神经病!(深度好文)
  18. 7.网络基础配置实验报告(2)
  19. 【django】用户登录模块实现步骤(二)之QQ登录工具AgentLogin和通过OAuth2.0认证获取openid【33】
  20. 什么是企业架构师?关于这个角色,你需要知道的一切及其未来发展

热门文章

  1. 运动目标检测--三种方法比较
  2. 晨读一年的复盘会议_一年后,在家中远程办公,网真和视频会议
  3. IE 获取 本地 Mac地址
  4. CTF中的无线电以及一些取证题目
  5. 高考失利之后,属于我的大学本科四年
  6. 一代宗师威廉·欧奈尔的选股法则详解
  7. 我的世界个人服务器搭建
  8. 雷电模拟器一键宏实现循环点击
  9. R语言自学笔记:数据处理、数据分布及数据检验
  10. java 窗口点击事件