线性规划的单纯形法—R实现
table { margin: auto }
线性规划的单纯形法
线性规划是运筹学中的一个基本分支,它广泛应用现有的科学技术和数学方法,解决实际中的问题,帮助决策人员选择最优方针和决策,自1947年丹捷格提出了一般线性规划问题求解的方法———单纯形法之后,线性规划在理论上趋向成熟,特别是在电子计算机能处理成千上万个约束条件和决策的线性规划问题之后,线性规划的适用领域更为广泛,是对有限的资源进行合理分配,企业提高生产效率,从而获得最佳经济效益的有效工具。
1. 问题的提出
例:(生产计划问题)假设某厂计划生产甲、乙两种产品,其主要原材料有钢材360kg,铜材300kg及专用设备能力200台时,已原材料和设备的单间消耗定额以及单位产品所获利润如下表所示:
| 甲 | 乙 | 现有资源 | |
|---|---|---|---|
| 钢材 | 9 | 4 | 360 |
| 铜材 | 3 | 10 | 300 |
| 设备台时 | 4 | 5 | 200 |
| 利润 | 60 | 120 |
问如何安排生产方使该厂所获利润最大?
2. 线性规划模型
设生产甲乙两种产品的数量为\(x_1\)和\(x_2\),建立数学模型如下:
\]
标准化:
\]
3. R计算程序
Lp <-function(c,A,b,lav)
#c为目标函数系数向量;A为添加松弛变量后的系数矩阵;
#b为常向量;lav松弛变量序号(构成单位阵)
{
##求初始基可行解、检验数
n = ncol(A);m = nrow(A)
sol = rep(0,n)
for(i in 1:length(lav))sol[lav[i]] = b[i]
B = lav #基变量向量序号(若1,3为基变量序号,则B=c(1,3))
sigma = c - c[lav]%*%A
print("初始单纯形表!")
DF = data.frame("CB" = c[B],"Base" = B,"b"=b, "x" = A)
print(list("frame" = DF,"sigma" = sigma))
while(any(sigma>0))
{
infty = which(sigma>0)
for(i in infty)if(all(A[,i] <= 0))print("答:存在无界解!")
psigma = max(sigma)
pcol = which(sigma == psigma) #主元素所在列
sita0 = b/A[,pcol]
sita = min(sita0)
prow = which(sita0 == sita) #主元素所在行
B[prow] = pcol #换基变量
##列出新单纯形表
b[prow] = b[prow]/A[prow,pcol] #对主元素行
A[prow,] = A[prow,]/A[prow,pcol]
for(i in c(1:m)[-prow])
{
b[i] = b[i] - b[prow]*A[i,pcol]
A[i,] = A[i,] - A[prow,]*A[i,pcol]
}
sigma = c - c[B]%*%A
print("过程单纯形表!")
DF = data.frame("CB" = c[B],"Base" = B,"b"=b, "x" = A)
print(list("frame" = DF,"sigma" = sigma))
}
if(any(sigma[-B]==0))
{print("答:存在无穷多最优解!")
}else{print("答:唯一最优解!")}
print("最终单纯形表!")
DF = data.frame("CB" = c[B],"Base" = B,"b"=b, "x" = A)
print(list("goal coef" = c,"frame" = DF,"sigma" = sigma))
sol = rep(0,n)
for(i in 1:length(B))sol[B[i]] = b[i]
return(list("最优解"=sol,"最大值"=sum(sol*c)))
}
#输入数据
c=c(60,120,0,0,0)
A=matrix(c(9,3,4,4,10,5,1,0,0,0,1,0,0,0,1),3)
b=c(360,300,200)
lav=c(3,4,5)
#运行结果
Lp(c,A,b,lav)
4. 计算步骤展现
#初始单纯形表
$frame
CB Base b x.1 x.2 x.3 x.4 x.5
1 0 3 360 9 4 1 0 0
2 0 4 300 3 10 0 1 0
3 0 5 200 4 5 0 0 1
$sigma
[,1] [,2] [,3] [,4] [,5]
[1,] 60 120 0 0 0`
#过程单纯形表1
$frame
CB Base b x.1 x.2 x.3 x.4 x.5
1 0 3 240 7.8 0 1 -0.4 0
2 120 2 30 0.3 1 0 0.1 0
3 0 5 50 2.5 0 0 -0.5 1
$sigma
[,1] [,2] [,3] [,4] [,5]
[1,] 24 0 0 -12 0
#过程单纯形表2
$frame
CB Base b x.1 x.2 x.3 x.4 x.5
1 0 3 84 0 0 1 1.16 -3.12
2 120 2 24 0 1 0 0.16 -0.12
3 60 1 20 1 0 0 -0.20 0.40
$sigma
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 -7.2 -9.6
#最终单纯形表
$frame
CB Base b x.1 x.2 x.3 x.4 x.5
1 0 3 84 0 0 1 1.16 -3.12
2 120 2 24 0 1 0 0.16 -0.12
3 60 1 20 1 0 0 -0.20 0.40
$sigma
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 -7.2 -9.6
$最优解
[1] 20 24 84 0 0
$最优值
[1] 4080
5. 总结
运用所学运筹学知识,针对该公司生产计划提出一些科学决策方案,从而达到资源充分利用的目的。通过对方案的提出、分析和解决对策的制定,使我们能够运用运筹学知识和相关工具解决一些实际性问题,加深对该课程的认识。同时,通过软件的计算使用,能够实现将理论与实践相结合的目的,增强我们动手操作能力和工作协调力。
线性规划的单纯形法—R实现的更多相关文章
- 【UOJ 179】 #179. 线性规划 (单纯形法)
http://uoj.ac/problem/179 补充那一列修改方法: 对于第i行: $$xi=bi-\sum Aij*xj$$ $$=bi-\sum_{j!=e} Aij*xj-Aie*xe ...
- MATLAB 线性规划实例应用
线性规划 线性规划函数 功能:求解线性规划问题 语法 x = linprog(f,A,b):求解问题 min fx,约束条件为 Ax <= b x = linprog(f,A,b,Aeq,beq ...
- 【Uva 10498】满意值
Description Kaykobad教授把为ACM选手买饭的任务交给了Nasa.Nasa决定买n种不同的食物.然后他询问了m名选手对每种食物的需求量.选手们当然不会给出任何符合逻辑的回答,他们只是 ...
- Matrix 高斯消元Gaussian elimination 中的complete pivoting和partial pivoting
首先科普下Pivoting的含义 一般翻译为“主元”,在对矩阵做某种算法时,首先进行的部分元素.在线性规划的单纯形法中常见.wiki的解释如下:Pivot element(the first elem ...
- 《算法》第六章部分程序 part 8
▶ 书中第六章部分程序,加上自己补充的代码,包括单纯形法求解线性规划问题 ● 单纯形法求解线性规划问题 // 表上作业法,I 为单位阵,y 为对偶变量,z 为目标函数值 // n m 1 // ┌── ...
- 关于各种算法以及好的blog的整理(持续更新)
一堆博客先扔着,等有空的时候再去看……好像没几个会的…… 以下都是待学习的算法 博弈论 https://www.cnblogs.com/cjyyb/p/9495131.html https://blo ...
- 最优解的lingo和MATLAB解法
最近运筹学学了线性规划和单纯形法,然后老师讲到了运用lingo和MATLAB软件分别求解的方法 首先,我们来讲讲lingo的(小技巧,只要把鼠标滑轮固定在输入界面按ctrl就可以放大了) lingo比 ...
- 干货 | 10分钟带你彻底了解column generation(列生成)算法的原理附java代码
OUTLINE 前言 预备知识预警 什么是column generation 相关概念科普 Cutting Stock Problem CG求解Cutting Stock Problem 列生成代码 ...
- [原]CentOS7安装Rancher2.1并部署kubernetes (二)---部署kubernetes
################## Rancher v2.1.7 + Kubernetes 1.13.4 ################ ##################### ...
- 利用python进行数据分析2_数据采集与操作
txt_filename = './files/python_baidu.txt' # 打开文件 file_obj = open(txt_filename, 'r', encoding='utf-8' ...
随机推荐
- vim多行缩进
1.首先设置vim缩进空格 vim /etc/vim/vimrc 或者vim /etc/vimrc,添加一下文字 set smartindent set shiftwidth=4 # 缩进四个空格 # ...
- SpringIOC以及AOP注解开发
和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作. 本质上:所有一切的操作都是 Java ...
- C++运算符重载引用传参与返回引用的小小心得
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 //平面向量类,提供完成向量运算和比较的API 6 //除递增运算符和左移运 ...
- BubbleSort,冒泡排序,C++非递归和递归实现
1 // g++ bubble_sort.cc -Wall -O3 && ./a.exe 2 3 4 #include <iostream> 5 #include < ...
- excel制作表格
我们这个表格举例: 1. 序号列自动生成序号.选中数字"1"所在的单元格,将鼠标停留在图片中标红的区域向下拖动即可 ...
- OSIDP-并发:死锁和饥饿-06
死锁原理 死锁:一组相互竞争系统资源或者进行通信的进程间"永久"阻塞的现象. 资源分为两类:可重用资源和可消耗资源. 可重用资源:一次只能被一个进程使用且不会被耗尽的资源.如处理器 ...
- 树莓派 wiringPi的BCM与BOARD编码
一.基础命令使用wiringPi库 1.1.获取管教信息 gpio readall ---获取管脚信息 1.2.BOARD编码和BCM一般都在python库中使用 import RPi.GPIO ...
- jmeter-脚本制作
HTTP请求 默认端口号 HTTP默认端口号:80 HTTPS默认端口:443 数据来源 通过网络抓包软件(Fiddler.Charles等).接口文档数据 脚本制作+结果 录制脚本 badbod 录 ...
- CH573 CH582 CH579蓝牙主机(Central)例程讲解一(主机工作流程)
蓝牙主机,顾名思义,就是一个蓝牙主设备,与从机建立连接进行通信,可以接收从机通知,也可以给从机发送信息,可将Central例程和Peripheral例程结合使用. 蓝牙主机例程的工作流程大致如下: 一 ...
- qemu4.0+libvirt5.6.0编译使用
1. qemu4.0.0 apt install pythonapt install libpixman-1-dev./configure --prefix=/usrmakemake install ...