R语言是一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。

文中测试数据data.csv可在网盘下载:http://pan.baidu.com/s/17qcI4。

本文参考了在R中模拟存储问题 一文。

一、环境安装

上R语言官网(http://www.r-project.org/)下载适合自己系统的版本并安装即可使用。

推荐使用RStudio IDE(http://www.rstudio.com/ide/download/)。

需要注意的是,RStudio IDE依赖于官方包,即需要下载官方包和RStudio才可使用RStudio。

完成后,可在console中输入1:10测试环境:

R语言入门书籍推荐《R语言初学者指南》。(这本书其实我也是随便搜到的,大概看了下对一些基础问题有了比较清晰的认识,还是值得过目的)

二、问题描述

某公司采用(s,S)订货策略,即当前库存小于s且当前无订货时,就进行采购补充库存至S。

假设该公司每天都有顾客,且顾客的需求分布情况可通过统计得到。

已知初始库存为x = 100,交货延迟时间L = 1天,存储成本为h=1元/个/天,零售价为r=30元/个,运费+成本函数为d = 10+15x,即每个产品成本为15元,每次订货运费为10元。

问应取怎样的(s,S)能使T =100天内的日平均收益最高?

三、思路

首先我们从已有的数据库中获得每天顾客需求的分布情况,放到data.csv中(测试数据可从文首的网盘下载)

data.csv的格式为第一列为顾客需求数值,第二列为对应的可能性(注意将格式改为小数而非百分数)。

读取该文件获得values和probs数组,并通过sample(values,1,T,probs)产生一个某一天的随机需求。

其中sample函数中的第二个参数1表示产生一个随机量,第三个参数T表示True即有放回。

对某个特定的(s,S)组合:

我们用t表示当前时间,T表示模拟的总时长,while(t<=T)中每天为循环的一次。

t1表示下次到货时间,在没有订货的情况下则为无穷大(Inf)。

我们只需在每一天的循环中检查当天有无到货,然后随机产生一个需求量,并通过需求量与库存的关系做相应的操作更新相应的值。

循环T次以后,即可通过(营业额-成本)/时长T算出每天的平均利润。

要得到最合适的(s,S)组合,我们只需给出许多组合,并对每一个组合都跑多次(代码中为10次)取得天平均收益的均值,画二维热图观察天平均收益关于不同(s,S)的分布情况,再通过排序得到平均收益最高的前10个(s,S)组合。

对于最高的(s,S)组合,我们还可通过多次模拟,绘制直方图来观察该(s,S)组合产生的收益情况的分布。

四、R语言实现

参考思路部分和代码注释,相信已经比较清楚。

需要注意的问题有:

1. R Studio的脚本页面中,run按钮表示运行当前行或选中部分的代码。所以若要运行整个脚本可先全选再按run。

2. R语言中\表示转义符,所以路径中要打\\

3. 需要将从csv读取的数据转换为数值类型

4. return 语句需要用括号括起来,即 return ((R-C-H)/T),return (R-C-H)/T会导致除以T没有执行,这个问题坑了我很久啊= =

5. 二维热图中的mean ~ Var1 * Var2表示以Var1和Var2为自变量,mean为应变量。可查看data的值帮助理解。

附运行后产生的二维热图和直方图,可能取值不太理想效果不明显。

library(lattice)data = read.table("C:\\data.csv", sep = ",");
values = as.numeric(unlist(data[1]));
probs = as.numeric(unlist(data[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 <- 590:600
S <- 990:1000
#将s与S的可能值两两组合
data <- expand.grid(s,S)for (i in 1:121) {#对每种组合计算10次取均值data$mean[i] = mean(replicate(10,inventory(data$Var1[i],data$Var2[i])))
}
#画二维热图
levelplot(mean ~ Var1 * Var2, data = data,xlab = "再订货点",ylab = "订货数量")#查看平均收入前10名的(s,S)组合
data[order(data$mean,decreasing=T)[1:10],]#第一名的(s,S)组合
first = data[order(data$mean,decreasing=T)[1:1],]
result <- replicate(1000,inventory(first$Var1,first$Var2))hist(result)

五、其它

例子中s、S各取了11个值,对每个组合运算了10次,所以inventory函数执行了11*11*10= 1210次,此时已经有明显的等待时间。

若数据量更大一些,则要等上数小时之久。

由于本例的计算十分适合并行计算,可在网上找到相应的包对程序进行优化,可明显提高效率。

新址:http://www.limisky.com/105.html

R语言初探之存储模型/报童问题相关推荐

  1. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、基于自定义函数构建xgboost文本分类模型

    R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.基于自定义函数构建xgboost文本分类模型 目录

  2. R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accuray、F1、偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机)

    R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accuray.F1.偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机) ...

  3. R语言构建logistic回归模型:构建模型公式、拟合logistic回归模型、模型评估,通过混淆矩阵计算precision、enrichment、recall指标

    R语言构建logistic回归模型:构建模型公式.拟合logistic回归模型.模型评估,通过混淆矩阵计算precision.enrichment.recall指标 目录

  4. R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载、划分数据、并分别构建线性回归模型和广义线性加性模型GAMs、并比较线性模型和GAMs模型的性能

    R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载.划分数据.并分别构建线性回归模型和广义线性加性模型GAMs.并比较线性模型和GAMs模型的性能 目录

  5. R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理、构建词袋模型、构建xgboost文本分类模型、基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化

    R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理.构建词袋模型.构建xgboost文本分类模型.基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化 目录

  6. R语言构建随机森林模型错误解决:Error in y - ymean : non-numeric argument to binary operator

    R语言构建随机森林模型错误解决:Error in y - ymean : non-numeric argument to binary operator 目录 R语言构建随机森林模型错误解决:Erro ...

  7. R语言广义加性模型GAMs:可视化每个变量的样条函数、样条函数与变量与目标变量之间的平滑曲线比较、并进行多变量的归一化比较、测试广义线性加性模型GAMs在测试集上的表现(防止过拟合)

    R语言广义加性模型GAMs:可视化每个变量的样条函数.样条函数与变量与目标变量之间的平滑曲线比较.并进行多变量的归一化比较.测试广义线性加性模型GAMs在测试集上的表现(防止过拟合) 目录

  8. R语言广义加性模型(generalized additive models,GAMs):使用广义线性加性模型GAMs构建logistic回归

    R语言广义加性模型(generalized additive models,GAMs):使用广义线性加性模型GAMs构建logistic回归 目录

  9. R语言构建logistic回归模型:WVPlots包PRTPlot函数可视化获取logistic回归模型的最优阈值、优化(precision、enrichment)和recall之间的折衷

    R语言构建logistic回归模型:WVPlots包PRTPlot函数可视化获取logistic回归模型的最佳阈值(改变阈值以优化精确度(precision.enrichment)和查全率(recal ...

最新文章

  1. java 线程组作用_浅析Java中线程组(ThreadGroup类)
  2. Zookeeper之启动常见错误及解决方法
  3. 云计算的未来,就是“打车模式” | CCF C³@亚马逊云科技
  4. BootStrap入门教程 (四)
  5. 涂抹mysql 完整_涂抹mysql笔记-管理mysql服务
  6. Android开发之搜Ya项目说明(3)
  7. 2009-12-12
  8. Spring+Mybatis多数据源配置(三)——Spring如何获取Properties文件的信息
  9. 我的手机 不支持箭头函数
  10. 【附源码】为了帮助程序员谈恋爱,我做了这个APP
  11. js通过jquery的jsonp跨域请求
  12. 【转载】随机游走及马尔科夫链(本体映射相关)
  13. Android开发检测网络是否连接
  14. java中enum怎么用_java 中enum的使用方法详解
  15. MCSA Server 2012 R2 IPV6
  16. android8.1如何升级,关于android8.1实现多个app升级时的注意事项
  17. 音频合并的步骤有哪些
  18. 信创只是开始_《作业帮高管团队亲笔信:D轮只是开始,一切归零,重新出发》...
  19. max3490esa_MAX1661EUB-T_maxim芯片后缀tg16是什么意思
  20. C++练习题:求一元二次方程的根

热门文章

  1. html页面,文字的自动换行
  2. 2021年福建高考成绩排名查询,2021年福建高考成绩排名查询系统,福建高考位次排名查询...
  3. 【C++】默认成员函数
  4. WPF DataGridTable
  5. mysql数据库性能优化—my.cnf详解
  6. Java mail 535鉴权失败或启动报错
  7. R_Studio(学生成绩)对数据缺失值md.pattern()、异常值分析(箱线图)
  8. springcloud-微服务
  9. 数据库系统概论(1)
  10. 【PyQt】PyQt+百度API实现图像识别应用(附代码)