R语言初探之存储模型/报童问题
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语言初探之存储模型/报童问题相关推荐
- R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、基于自定义函数构建xgboost文本分类模型
R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.基于自定义函数构建xgboost文本分类模型 目录
- R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accuray、F1、偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机)
R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accuray.F1.偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机) ...
- R语言构建logistic回归模型:构建模型公式、拟合logistic回归模型、模型评估,通过混淆矩阵计算precision、enrichment、recall指标
R语言构建logistic回归模型:构建模型公式.拟合logistic回归模型.模型评估,通过混淆矩阵计算precision.enrichment.recall指标 目录
- R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载、划分数据、并分别构建线性回归模型和广义线性加性模型GAMs、并比较线性模型和GAMs模型的性能
R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载.划分数据.并分别构建线性回归模型和广义线性加性模型GAMs.并比较线性模型和GAMs模型的性能 目录
- R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理、构建词袋模型、构建xgboost文本分类模型、基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化
R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理.构建词袋模型.构建xgboost文本分类模型.基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化 目录
- R语言构建随机森林模型错误解决:Error in y - ymean : non-numeric argument to binary operator
R语言构建随机森林模型错误解决:Error in y - ymean : non-numeric argument to binary operator 目录 R语言构建随机森林模型错误解决:Erro ...
- R语言广义加性模型GAMs:可视化每个变量的样条函数、样条函数与变量与目标变量之间的平滑曲线比较、并进行多变量的归一化比较、测试广义线性加性模型GAMs在测试集上的表现(防止过拟合)
R语言广义加性模型GAMs:可视化每个变量的样条函数.样条函数与变量与目标变量之间的平滑曲线比较.并进行多变量的归一化比较.测试广义线性加性模型GAMs在测试集上的表现(防止过拟合) 目录
- R语言广义加性模型(generalized additive models,GAMs):使用广义线性加性模型GAMs构建logistic回归
R语言广义加性模型(generalized additive models,GAMs):使用广义线性加性模型GAMs构建logistic回归 目录
- R语言构建logistic回归模型:WVPlots包PRTPlot函数可视化获取logistic回归模型的最优阈值、优化(precision、enrichment)和recall之间的折衷
R语言构建logistic回归模型:WVPlots包PRTPlot函数可视化获取logistic回归模型的最佳阈值(改变阈值以优化精确度(precision.enrichment)和查全率(recal ...
最新文章
- java 线程组作用_浅析Java中线程组(ThreadGroup类)
- Zookeeper之启动常见错误及解决方法
- 云计算的未来,就是“打车模式” | CCF C³@亚马逊云科技
- BootStrap入门教程 (四)
- 涂抹mysql 完整_涂抹mysql笔记-管理mysql服务
- Android开发之搜Ya项目说明(3)
- 2009-12-12
- Spring+Mybatis多数据源配置(三)——Spring如何获取Properties文件的信息
- 我的手机 不支持箭头函数
- 【附源码】为了帮助程序员谈恋爱,我做了这个APP
- js通过jquery的jsonp跨域请求
- 【转载】随机游走及马尔科夫链(本体映射相关)
- Android开发检测网络是否连接
- java中enum怎么用_java 中enum的使用方法详解
- MCSA Server 2012 R2 IPV6
- android8.1如何升级,关于android8.1实现多个app升级时的注意事项
- 音频合并的步骤有哪些
- 信创只是开始_《作业帮高管团队亲笔信:D轮只是开始,一切归零,重新出发》...
- max3490esa_MAX1661EUB-T_maxim芯片后缀tg16是什么意思
- C++练习题:求一元二次方程的根
热门文章
- html页面,文字的自动换行
- 2021年福建高考成绩排名查询,2021年福建高考成绩排名查询系统,福建高考位次排名查询...
- 【C++】默认成员函数
- WPF DataGridTable
- mysql数据库性能优化—my.cnf详解
- Java mail 535鉴权失败或启动报错
- R_Studio(学生成绩)对数据缺失值md.pattern()、异常值分析(箱线图)
- springcloud-微服务
- 数据库系统概论(1)
- 【PyQt】PyQt+百度API实现图像识别应用(附代码)