存储系统模拟—R实现
存储系统
存储问题是人们最熟悉又最需要研究的问题之一。例如企业储存的原材料、在制品等,存储太少,不足以满足生产的需要,将使生产过程中断; 存储太多,超过了生产的需要,将造成资金及资源的积压浪费。商店储存商品,存储太少,造成商品脱销,将影响销售利润和竞争能力; 存储太多,将影响资金周转并带来积压商品的有形或无形损失。
一、存储系统概述
存储是协调供需关系的常用手段。存储由于需求(输出)而减少,通过补充(输入)而增加。存储论研究的基本问题是对于特定的需求类型,以怎样的方式进行补货,才能最好地实现存储管理的目标。根据需求和补充中是否包含随机性因素,在储系统分为确定型和随机型两种。
存储论研究的基本问题是,对于特定的需求类型,讨论用怎样的方式进行物质的供应、商品的订货或者产品的生产,以求最好地实现存储的经济管理目标。具体地说,存储论是研究如何根据生产或者销售活动的实际存贮问题建立起数学模型,然后通过费用分析求出产品、商品的最佳供应量(量)和供应周期(期)这些数量指标。不论哪种存储系统,一般都可用下图的模式来表示。

存储系统可以用“供-存-销”三个字来描述,即一个存储系统,通过订货以及进货后的存储与销售来满足顾客的需求。存贮论所要解决的问题有两个:(1)存贮多少数量最为经济(2)间隔多长时间需要补充一次,以及补充多少?寻求合理的存贮量、补充量和补充周期是存贮论研究的重要内容,由它们构成的方案叫存贮策略。
二、存储问题描述
某公司采用(s,S)订货策略,即当前库存小于s且当前无订货时,就进行采购补充库存至S。假设该公司每天都有顾客,且顾客的需求分布情况可通过统计得到,见下表所示。已知初始库存为x = 100,交货延迟时间L = 1天,存储成本为h=1元/个/天,零售价为r=30元/个,运费+成本函数为d = 10+15x,即每个产品成本为15元,每次订货运费为10元。问应取怎样的(s,S)能使T =100天内的日平均收益最高?
| 需求量 | 50 | 100 | 150 | 200 |
|---|---|---|---|---|
| 需求概率 | 0.1 | 0.2 | 0.5 | 0.2 |
三、存储系统的R模拟
通过sample(values,1,T,probs)产生一个某一天的随机需求。sample函数中的第二个参数1表示产生一个随机量,第三个参数T表示True即有放回。
library(lattice)
data1=matrix(c(50,100,150,200,0.1,0.2,0.5,0.1),nrow=4)
data1=as.data.frame(data1)
values = as.numeric(data1[,1])
probs = as.numeric(data1[,2])
inventory = function(s,S){
x=100; #初始库存
L=1; #交货延迟
h=1; #存储成本h元/个/天
r=30; #零售价r元/个
T=100; #总时长
d = function(x) {10 + 15*x} #运费 + 成本
t=1; t1=Inf; #t是当前时间,t1是下次到货时间
H=0; C=0; R=0; #H累计库存费用,C累计订货费用,R累计收入
y=0; loss=0; #y订货量,loss缺货次数
while(t <= T) {
H = H + h*x; #一天的库存费用
#若当天有货物到达
if(t1 == t){
C = C + d(y); #成本费用
x = x + y;
y = 0;
t1 = Inf;
}
D = sample(values,1,T,probs); #随机产生的需求量
w = min(D,x) #实际购买量
R = R + r*w;
x = x - w;
#若需求大于库存
if(D > x){
loss = loss + 1
}
#若满足订货条件
if(x < s && y ==0){
y = S - x;
t1 = t + L;
}
t = t + 1;
}
return ((R-C-H)/T)
}
对某个特定的(s,S)组合,我们用t表示当前时间,T表示模拟的总时长,while(t<=T)中每天为循环的一次。t1表示下次到货时间,在没有订货的情况下则为无穷大(Inf)。我们只需在每一天的循环中检查当天有无到货,然后随机产生一个需求量,并通过需求量与库存的关系做相应的操作更新相应的值。循环T次以后,即可通过(营业额-成本)/时长T算出每天的平均利润。
s <- 590:600
S <- 990:1000
data <- expand.grid(s,S) #将s与S的可能值两两组合
for (i in 1:121) {
#对每种组合计算10次取均值
data$mean[i] = mean(replicate(10,inventory(data$Var1[i],data$Var2[i])))
}
#查看平均收入前10名的(s,S)组合
data[order(data$mean,decreasing=T)[1:5],]
Var1 Var2 mean
70 593 996 1274.97
108 598 999 1271.01
45 590 994 1266.19
3 592 990 1265.15
86 598 997 1263.29
四、计算结果的可视化
#画二维热图
levelplot(mean ~ Var1 * Var2, data = data,xlab = "再订货点",ylab = "订货数量")

#画收入分布
first = data[order(data$mean,decreasing=T)[1:1],]
Revenue <- replicate(1000,inventory(first$Var1,first$Var2))
hist(Revenue,main="收入分布展示")

五、总结
例子中s、S各取了11个值,对每个组合运算了10次,所以inventory函数执行了111110= 1210次。随着存储问题的日趋复杂,所运用的数学方法日趋多样,不仅包含了常见的数学方法,还采用了概率统计、数值计算方法。可以预见随着企业管理实践的不断深化,存储论将得到更广泛的应用。
参考文献
存储系统模拟—R实现的更多相关文章
- 数据攻略●R语言自述
(注明:以下文章均在Linux操作系统下执行) 一.R语言简介 R语言是用于统计分析,图形表示和报告的编程语言和软件环境.R语言由Ross Ihaka和Robert Gentleman在新西兰奥克兰大 ...
- R语言手册
在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data analysis and visualization which is built bas ...
- 如何创建R包并将其发布在 CRAN / GitHub 上--转载
转载--https://www.analyticsvidhya.com/blog/2017/03/create-packages-r-cran-github/ 什么是 R 包?我开始创建 R 包的原因 ...
- 关于在C++中调用R函数以及RCpp使用
最近因为项目要用到,所以在想办法把R语言用到C++中. 网上查了看到有一个Rcpp的工具.所以在这里总结一下. 现在能想到的几种在C++中调用R语言的方法如下: 1. 使用Rcpp R高级编程技巧及R ...
- ABAP术语-R/3 Repository Information System
R/3 Repository Information System 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/11/1100076.ht ...
- Filecoin:一种去中心化的存储网络(一)
开始初步了解学习Filecoin,如下是看白皮书的内容整理. 参考: 白皮书中文版 http://chainx.org/paper/index/index/id/13.html 白皮书英文版 http ...
- 【转载】 C++中回车换行(\n\r)和换行(\r)的区别
原文:http://blog.csdn.net/xiaofei2010/article/details/8458605 windows下的点一下回车,效果是:回车换行,就是\r\n unix系统下的回 ...
- R语言学习 - 热图绘制heatmap
生成测试数据 绘图首先需要数据.通过生成一堆的向量,转换为矩阵,得到想要的数据. data <- c(1:6, 6:1, 6:1, 1:6, (6:1)/10, (1:6)/10, (1:6)/ ...
- R语言构建蛋白质网络并实现GN算法
目录 R语言构建蛋白质网络并实现GN算法 1.蛋白质网络的构建 2.生物网络的模块发现方法 3.模块发现方法实现和图形展示 4.附录:igraph中常用函数 参考链接 R语言构建蛋白质网络并实现GN算 ...
- R语言简单介绍
R语言 概述 R语言是用于统计分析,图形表示和报告的编程语言和软件环境. R语言由Ross Ihaka和Robert Gentleman在新西兰奥克兰大学创建,目前由R语言开发核心团队开发. R语言的 ...
随机推荐
- hdu4585 Treap与名次树/STL map(C/C++)
hdu4585 题目地址:https://acm.dingbacode.com/showproblem.php?pid=4585 Shaolin Time Limit: 3000/1000 MS (J ...
- xml与DataSet互转
//将DataSet转换为xml字符串 public static string ConvertDataSetToXMLFile(DataSet xmlDS, Encoding encoding) ...
- EF OwnsOne 主键不自增
menu public class Menu { /// <summary> /// id /// </summary> [Key, DatabaseGeneratedAttr ...
- Longest Common Substring(最长公共子串)
SP1811 题目描述 A string is finite sequence of characters over a non-empty finite set Σ. In this problem ...
- 剑指offer-孩子们的游戏
题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...
- Oracle联机备份与恢复
联机备份又称为热备份,在数据库运行的情况下对数据库进行物理备份.进行联机备份,数据库必须运行在归档日志(ARCHIVELOG)模式下. 联机完全备份步骤: 1.设置归档日志模式,创建恢复目录用的表空间 ...
- 【随笔】Java处理异常输出对象Exception,转为String输出
声明:这段代码也是从网上摘抄的,当时忘记记录地址了,此为转载,勿怪 public static String handleException(Exception e) { StringBuffer m ...
- echarts数据过小,log类型无法出现刻度线,并将y轴转为科学计数法
方法仅供参考 可以更改logBase的值,数值越小刻度线越多,但也会出现,刻度值重复的问题,看各自需要,其次是对数据进行处理,全部变成大于1的数,最后在echarts的图表显示设置中更改回来 注意:对 ...
- 《Unix/Linux系统编程》第十二周学习笔记
<Unix/Linux系统编程>第十二周学习笔记 MySQL数据库简介 MySQL是一个关系型数据库管理系统,是最流行的关系型数据库管理系统之一.在 WEB 应用方面,MySQL 是最好的 ...
- String的Equals()和==比较
String的Equals()和==比较 常量池(Constant Pool):指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据.JVM虚拟机为每个被装载的类型维护一个常量池.常量 ...