存储系统

存储问题是人们最熟悉又最需要研究的问题之一。例如企业储存的原材料、在制品等,存储太少,不足以满足生产的需要,将使生产过程中断; 存储太多,超过了生产的需要,将造成资金及资源的积压浪费。商店储存商品,存储太少,造成商品脱销,将影响销售利润和竞争能力; 存储太多,将影响资金周转并带来积压商品的有形或无形损失。

一、存储系统概述

存储是协调供需关系的常用手段。存储由于需求(输出)而减少,通过补充(输入)而增加。存储论研究的基本问题是对于特定的需求类型,以怎样的方式进行补货,才能最好地实现存储管理的目标。根据需求和补充中是否包含随机性因素,在储系统分为确定型和随机型两种。

存储论研究的基本问题是,对于特定的需求类型,讨论用怎样的方式进行物质的供应、商品的订货或者产品的生产,以求最好地实现存储的经济管理目标。具体地说,存储论是研究如何根据生产或者销售活动的实际存贮问题建立起数学模型,然后通过费用分析求出产品、商品的最佳供应量(量)和供应周期(期)这些数量指标。不论哪种存储系统,一般都可用下图的模式来表示。

存储系统可以用“供-存-销”三个字来描述,即一个存储系统,通过订货以及进货后的存储与销售来满足顾客的需求。存贮论所要解决的问题有两个:(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实现的更多相关文章

  1. 数据攻略●R语言自述

    (注明:以下文章均在Linux操作系统下执行) 一.R语言简介 R语言是用于统计分析,图形表示和报告的编程语言和软件环境.R语言由Ross Ihaka和Robert Gentleman在新西兰奥克兰大 ...

  2. R语言手册

    在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data analysis and visualization which is built bas ...

  3. 如何创建R包并将其发布在 CRAN / GitHub 上--转载

    转载--https://www.analyticsvidhya.com/blog/2017/03/create-packages-r-cran-github/ 什么是 R 包?我开始创建 R 包的原因 ...

  4. 关于在C++中调用R函数以及RCpp使用

    最近因为项目要用到,所以在想办法把R语言用到C++中. 网上查了看到有一个Rcpp的工具.所以在这里总结一下. 现在能想到的几种在C++中调用R语言的方法如下: 1. 使用Rcpp R高级编程技巧及R ...

  5. ABAP术语-R/3 Repository Information System

    R/3 Repository Information System 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/11/1100076.ht ...

  6. Filecoin:一种去中心化的存储网络(一)

    开始初步了解学习Filecoin,如下是看白皮书的内容整理. 参考: 白皮书中文版 http://chainx.org/paper/index/index/id/13.html 白皮书英文版 http ...

  7. 【转载】 C++中回车换行(\n\r)和换行(\r)的区别

    原文:http://blog.csdn.net/xiaofei2010/article/details/8458605 windows下的点一下回车,效果是:回车换行,就是\r\n unix系统下的回 ...

  8. R语言学习 - 热图绘制heatmap

    生成测试数据 绘图首先需要数据.通过生成一堆的向量,转换为矩阵,得到想要的数据. data <- c(1:6, 6:1, 6:1, 1:6, (6:1)/10, (1:6)/10, (1:6)/ ...

  9. R语言构建蛋白质网络并实现GN算法

    目录 R语言构建蛋白质网络并实现GN算法 1.蛋白质网络的构建 2.生物网络的模块发现方法 3.模块发现方法实现和图形展示 4.附录:igraph中常用函数 参考链接 R语言构建蛋白质网络并实现GN算 ...

  10. R语言简单介绍

    R语言 概述 R语言是用于统计分析,图形表示和报告的编程语言和软件环境. R语言由Ross Ihaka和Robert Gentleman在新西兰奥克兰大学创建,目前由R语言开发核心团队开发. R语言的 ...

随机推荐

  1. Linux使用NAT/VMnet8(NAT)模式配置网卡ping通外网/主机/百度

    vmnat 配置好后无法ping通打开共享 vmnet8 nat网卡配置 主机网卡配置 去掉网关

  2. MySQL分库分表原理

    转自https://www.jianshu.com/p/7aec260ca1a2 前言 在互联网还未崛起的时代,我们的传统应用都有这样一个特点:访问量.数据量都比较小,单库单表都完全可以支撑整个业务. ...

  3. Checkmarx

    1.概述 CheckMarx:是以色列的一家高科技软件公司,也是世界上最著名的源代码安全扫描软件CheckmarxCxSuite的生产商. Checkmarx CxEnterprise(Checkma ...

  4. 第十二组 -摩天脆脆冰淇淋队-第四次团队作业:Git实战

    这个作业属于哪个课程 至诚软工实践F班 - 福州大学至诚学院 - 班级博客 - 博客园 (cnblogs.com) 这个作业要求在哪里 第四次团队作业:Git实战 - 作业 - 至诚软工实践F班 - ...

  5. lisp入门资料收集

    1.一些文档 http://acl.readthedocs.io/en/latest/zhCN/index.html http://daiyuwen.freeshell.org/gb/lisp.htm ...

  6. 01 docker容器技术基础入门

    本章内容: 1.container是什么? 2.LXC技术介绍 3.namespaces-名称空间,实现资源隔离 4.容器的资源分配--Cgroup,实现资源分配 5.LXC与dockers ---- ...

  7. 西电oj73题字符串处理

    问题描述 有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩).例如,字符串aaaaabbbabaaaaaaaaaaaaab ...

  8. C知识点

    1.变量在内存中所占存储空间的首地址,称为该变量的地址:而变量在存储空间中存放的数据,即变量的值. C语言中,指针就是变量的地址.一个变量的值是另一个变量的地址,且变量类型相同,则称该变量为指针变量. ...

  9. loadrunner入门(关联)

    左右边界:提取第一个id web_reg_save_param_ex(                 "ParamName=Id",         "LB=//OK[ ...

  10. java中取数组第一个元素

    java中取数组第一个元素   var a=[1,2,2,3,4];console.log(a);a.shift();console.log(a);   pop:删除原数组最后一项,并返回删除元素的值 ...