table { margin: auto }

线性规划的单纯形法

线性规划是运筹学中的一个基本分支,它广泛应用现有的科学技术和数学方法,解决实际中的问题,帮助决策人员选择最优方针和决策,自1947年丹捷格提出了一般线性规划问题求解的方法———单纯形法之后,线性规划在理论上趋向成熟,特别是在电子计算机能处理成千上万个约束条件和决策的线性规划问题之后,线性规划的适用领域更为广泛,是对有限的资源进行合理分配,企业提高生产效率,从而获得最佳经济效益的有效工具。

1. 问题的提出

例:(生产计划问题)假设某厂计划生产甲、乙两种产品,其主要原材料有钢材360kg,铜材300kg及专用设备能力200台时,已原材料和设备的单间消耗定额以及单位产品所获利润如下表所示:

现有资源
钢材 9 4 360
铜材 3 10 300
设备台时 4 5 200
利润 60 120

问如何安排生产方使该厂所获利润最大?

2. 线性规划模型

设生产甲乙两种产品的数量为\(x_1\)和\(x_2\),建立数学模型如下:

\[max \ \ \ z=60x_1+120x_2\\\ \ \ \begin{cases} 9x_1+4x_2\leq360\\3x_1+10x_2\leq300\\4x_1+5x_2\leq200\\ x_1\geq0;x_2\geq0 \end{cases}
\]

标准化:

\[max \ \ \ z=60x_1+120x_2\\\ \ \ \begin{cases} 9x_1+4x_2+x_3=360\\3x_1+10x_2+x_4=300\\4x_1+5x_2+x_5=200\\ x_1\geq0;x_2\geq0 \end{cases}
\]

3. R计算程序

  1. Lp <-function(c,A,b,lav)
  2. #c为目标函数系数向量;A为添加松弛变量后的系数矩阵;
  3. #b为常向量;lav松弛变量序号(构成单位阵)
  4. {
  5. ##求初始基可行解、检验数
  6. n = ncol(A);m = nrow(A)
  7. sol = rep(0,n)
  8. for(i in 1:length(lav))sol[lav[i]] = b[i]
  9. B = lav #基变量向量序号(若1,3为基变量序号,则B=c(1,3))
  10. sigma = c - c[lav]%*%A
  11. print("初始单纯形表!")
  12. DF = data.frame("CB" = c[B],"Base" = B,"b"=b, "x" = A)
  13. print(list("frame" = DF,"sigma" = sigma))
  14. while(any(sigma>0))
  15. {
  16. infty = which(sigma>0)
  17. for(i in infty)if(all(A[,i] <= 0))print("答:存在无界解!")
  18. psigma = max(sigma)
  19. pcol = which(sigma == psigma) #主元素所在列
  20. sita0 = b/A[,pcol]
  21. sita = min(sita0)
  22. prow = which(sita0 == sita) #主元素所在行
  23. B[prow] = pcol #换基变量
  24. ##列出新单纯形表
  25. b[prow] = b[prow]/A[prow,pcol] #对主元素行
  26. A[prow,] = A[prow,]/A[prow,pcol]
  27. for(i in c(1:m)[-prow])
  28. {
  29. b[i] = b[i] - b[prow]*A[i,pcol]
  30. A[i,] = A[i,] - A[prow,]*A[i,pcol]
  31. }
  32. sigma = c - c[B]%*%A
  33. print("过程单纯形表!")
  34. DF = data.frame("CB" = c[B],"Base" = B,"b"=b, "x" = A)
  35. print(list("frame" = DF,"sigma" = sigma))
  36. }
  37. if(any(sigma[-B]==0))
  38. {print("答:存在无穷多最优解!")
  39. }else{print("答:唯一最优解!")}
  40. print("最终单纯形表!")
  41. DF = data.frame("CB" = c[B],"Base" = B,"b"=b, "x" = A)
  42. print(list("goal coef" = c,"frame" = DF,"sigma" = sigma))
  43. sol = rep(0,n)
  44. for(i in 1:length(B))sol[B[i]] = b[i]
  45. return(list("最优解"=sol,"最大值"=sum(sol*c)))
  46. }
  47. #输入数据
  48. c=c(60,120,0,0,0)
  49. A=matrix(c(9,3,4,4,10,5,1,0,0,0,1,0,0,0,1),3)
  50. b=c(360,300,200)
  51. lav=c(3,4,5)
  52. #运行结果
  53. Lp(c,A,b,lav)

4. 计算步骤展现

  1. #初始单纯形表
  2. $frame
  3. CB Base b x.1 x.2 x.3 x.4 x.5
  4. 1 0 3 360 9 4 1 0 0
  5. 2 0 4 300 3 10 0 1 0
  6. 3 0 5 200 4 5 0 0 1
  7. $sigma
  8. [,1] [,2] [,3] [,4] [,5]
  9. [1,] 60 120 0 0 0`
  10. #过程单纯形表1
  11. $frame
  12. CB Base b x.1 x.2 x.3 x.4 x.5
  13. 1 0 3 240 7.8 0 1 -0.4 0
  14. 2 120 2 30 0.3 1 0 0.1 0
  15. 3 0 5 50 2.5 0 0 -0.5 1
  16. $sigma
  17. [,1] [,2] [,3] [,4] [,5]
  18. [1,] 24 0 0 -12 0
  19. #过程单纯形表2
  20. $frame
  21. CB Base b x.1 x.2 x.3 x.4 x.5
  22. 1 0 3 84 0 0 1 1.16 -3.12
  23. 2 120 2 24 0 1 0 0.16 -0.12
  24. 3 60 1 20 1 0 0 -0.20 0.40
  25. $sigma
  26. [,1] [,2] [,3] [,4] [,5]
  27. [1,] 0 0 0 -7.2 -9.6
  28. #最终单纯形表
  29. $frame
  30. CB Base b x.1 x.2 x.3 x.4 x.5
  31. 1 0 3 84 0 0 1 1.16 -3.12
  32. 2 120 2 24 0 1 0 0.16 -0.12
  33. 3 60 1 20 1 0 0 -0.20 0.40
  34. $sigma
  35. [,1] [,2] [,3] [,4] [,5]
  36. [1,] 0 0 0 -7.2 -9.6
  37. $最优解
  38. [1] 20 24 84 0 0
  39. $最优值
  40. [1] 4080

5. 总结

运用所学运筹学知识,针对该公司生产计划提出一些科学决策方案,从而达到资源充分利用的目的。通过对方案的提出、分析和解决对策的制定,使我们能够运用运筹学知识和相关工具解决一些实际性问题,加深对该课程的认识。同时,通过软件的计算使用,能够实现将理论与实践相结合的目的,增强我们动手操作能力和工作协调力。

线性规划的单纯形法—R实现的更多相关文章

  1. 【UOJ 179】 #179. 线性规划 (单纯形法)

    http://uoj.ac/problem/179 补充那一列修改方法: 对于第i行: $$xi=bi-\sum Aij*xj$$    $$=bi-\sum_{j!=e} Aij*xj-Aie*xe ...

  2. MATLAB 线性规划实例应用

    线性规划 线性规划函数 功能:求解线性规划问题 语法 x = linprog(f,A,b):求解问题 min fx,约束条件为 Ax <= b x = linprog(f,A,b,Aeq,beq ...

  3. 【Uva 10498】满意值

    Description Kaykobad教授把为ACM选手买饭的任务交给了Nasa.Nasa决定买n种不同的食物.然后他询问了m名选手对每种食物的需求量.选手们当然不会给出任何符合逻辑的回答,他们只是 ...

  4. Matrix 高斯消元Gaussian elimination 中的complete pivoting和partial pivoting

    首先科普下Pivoting的含义 一般翻译为“主元”,在对矩阵做某种算法时,首先进行的部分元素.在线性规划的单纯形法中常见.wiki的解释如下:Pivot element(the first elem ...

  5. 《算法》第六章部分程序 part 8

    ▶ 书中第六章部分程序,加上自己补充的代码,包括单纯形法求解线性规划问题 ● 单纯形法求解线性规划问题 // 表上作业法,I 为单位阵,y 为对偶变量,z 为目标函数值 // n m 1 // ┌── ...

  6. 关于各种算法以及好的blog的整理(持续更新)

    一堆博客先扔着,等有空的时候再去看……好像没几个会的…… 以下都是待学习的算法 博弈论 https://www.cnblogs.com/cjyyb/p/9495131.html https://blo ...

  7. 最优解的lingo和MATLAB解法

    最近运筹学学了线性规划和单纯形法,然后老师讲到了运用lingo和MATLAB软件分别求解的方法 首先,我们来讲讲lingo的(小技巧,只要把鼠标滑轮固定在输入界面按ctrl就可以放大了) lingo比 ...

  8. 干货 | 10分钟带你彻底了解column generation(列生成)算法的原理附java代码

    OUTLINE 前言 预备知识预警 什么是column generation 相关概念科普 Cutting Stock Problem CG求解Cutting Stock Problem 列生成代码 ...

  9. [原]CentOS7安装Rancher2.1并部署kubernetes (二)---部署kubernetes

    ##################    Rancher v2.1.7  +    Kubernetes 1.13.4  ################ ##################### ...

  10. 利用python进行数据分析2_数据采集与操作

    txt_filename = './files/python_baidu.txt' # 打开文件 file_obj = open(txt_filename, 'r', encoding='utf-8' ...

随机推荐

  1. 英国延长 UKCA 标记截止日期

    政府于 2022 年 11 月 14 日宣布,企业将有 2 年的时间来应用新的 UKCA 产品标记.在 2024 年 12 月 31 日之前,企业可以选择使用 UKCA 或 CE 标志,之后企业只能使 ...

  2. 第一个程序,Hello,World!

    Hello World 创建一个文件夹,存放代码 新建一个java文件 后缀名为.java 编写代码 public class Hello{    public static void main(st ...

  3. vim实用用法

    1 dd 删除1行 1 gg 跳到第一行 G 文本最后 C 删除当前光标到行尾,并进入插入模式 D 删除当前光标到行尾 dw 删除一个单词 yw 复制一个单词 r /PATH/FROM/SOMEFIL ...

  4. IntelliJ IDEA 最新激活破解教程,永久激活,亲测有效

    使用ja-netfilter激活Jetbrains系列软件 注意:无限试用脚本已经失效.本教程适合2021.3.*之上的高版本,使用ja-netfilter插件进行激活操作,永久有效 激活步骤: 第一 ...

  5. windows系统下查找开放端口的监听程序

    C:\Program Files (x86)\Nmap>nmap 127.0.0.1Starting Nmap 7.92 ( https://nmap.org ) at 2022-07-15 1 ...

  6. OSIDP-并发:死锁和饥饿-06

    死锁原理 死锁:一组相互竞争系统资源或者进行通信的进程间"永久"阻塞的现象. 资源分为两类:可重用资源和可消耗资源. 可重用资源:一次只能被一个进程使用且不会被耗尽的资源.如处理器 ...

  7. 【PostgreSql】more than one owned sequence found

    do --check seq not in sync $$ declare _r record; _i bigint; _m bigint; begin for _r in ( Select DIST ...

  8. vue3.0+vite+ts项目搭建--初始化项目

    使用yarn yarn create vite 使用pnpm pnpx create-vite(pnpm create vite + 项目名) 根据提示输入项目名称,选择vue框架,选择vue-ts, ...

  9. Crypto入门 (三)Morse

    前言: Morse电码(Morsecode)是大家耳熟能详的编码方式,很多人都误认为它是一种加密方式,但其实它是一种编码,因为它并不存在密钥.在只能使用电报长短音传递信息的条件下,使用摩斯电码是为了方 ...

  10. Vue的Component name报错

    问题描述: Component name "xxxxx" should always be multi-word.eslintvue 解决方案: 在项目目录中找到 .eslintr ...