存储系统模拟—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次。随着存储问题的日趋复杂,所运用的数学方法日趋多样,不仅包含了常见的数学方法,还采用了概率统计、数值计算方法。可以预见随着企业管理实践的不断深化,存储论将得到更广泛的应用。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂