这个问题有很多活动的部分,这使得模拟变得成熟。
首先,正如埃尔维斯在评论中提到的那样,史黛西似乎需要约16个约会,每个约会约半小时。但是您知道随着约会开始延迟,事情开始日新月异-因此,如果Stacey仅在还剩半小时的情况下才开始约会(那么多的原因是要把头发从地板上扫掉,嗯,Stacey ?),如果我们使用水晶球安排没有休息时间的约会,那么我们将只有不到16个可能的时段。
在下一个模拟中,我们可以研究成本曲线与任命长度的关系。当然,其余的参数最终也将在这里发挥作用-实际上,Stacey不会安排她的约会间隔很短的时间,但这给了我们一些直觉。
我还绘制了Stacey必须用作颜色的时间。我决定史黛西永远都不会安排她在7:30之后的最后一次约会,但是有时约会显示得太晚了,否则就耽搁了!您可以看到她回家的时间是量化的,因此随着约会时间的增加,约会次数减少了,您不必再迟到了。而且我认为这是一个缺失的要素-也许将您的约会安排在每45分钟一班是很棒的,但是如果您可以将约会挤压到40分钟,那么您将获得一个额外的约会。这笔费用由Stacey的等待处理(这就是为什么费用会减少的原因) (随着约会时间的延长而增加),但您对Stacey等待时间的评估可能不正确。
无论如何,有趣的问题!这是学习ggplot优点并记住我的R语法超级不稳定的好方法。:)
我的代码如下-请随时提出改进建议。
要生成顶部图的代码:
hairtime = 30
hairsd = 10
nSim = 1000
allCuts = rep(0,nSim)
allTime = rep(0,nSim)
for (i in 1:nSim) {
t = 0
ncuts = 0
while (t < 7.5) {
ncuts = ncuts+1
nexthairtime = rnorm(1,hairtime,hairsd)
t = t+(nexthairtime/60)
}
allCuts[i] = ncuts
allTime[i] = t
}
hist(allCuts,main="Number of haircuts in an 8 hour day",xlab="Customers")
第二个模拟要长得多...
nSim = 100
allCuts = rep(0,nSim)
allTime = rep(0,nSim)
allCost = rep(0,nSim)
lateMean = 10
lateSD = 3
staceyWasted = 1
customerWasted = 3
allLengths = seq(30,60,0.25)
# Keep everything in 'long form' just to make our plotting lives easier later
allApptCosts = data.frame(matrix(ncol=3,nrow=length(allLengths)*nSim))
names(allApptCosts) <- c("Appt.Length","Cost","Time")
ind = 1
# for every appointment length...
for (a in 1:length(allLengths)) {
apptlen = allLengths[a]
# ...simulate the time, and the cost of cutting hair.
for (i in 1:nSim) {
appts = seq(from=0,to=(8-hairtime/60),by=apptlen/60)
t = 0
cost = 0
ncuts = 0
for (a in 1:length(appts)) {
customerArrival = appts[a]
# late!
if (runif(1)>0.9) {
customerArrival = appts[a]+rnorm(1,lateMean,lateSD)/60
}
waitTime = t-customerArrival
# negative waitTime means the customer arrives late
cost = cost+max(waitTime,0)*customerWasted+abs(min(waitTime,0))*staceyWasted
# get the haircut
nexthairtime = rnorm(1,hairtime,hairsd)
t = customerArrival+(nexthairtime/60)
}
allCost[i] = cost
allApptCosts[ind,1] = apptlen
allApptCosts[ind,2] = cost
allApptCosts[ind,3] = t
ind = ind+1
}
}
qplot(Appt.Length,Cost,geom=c("point"),alpha=I(0.75),color=Time,data=allApptCosts,xlab="Appointment Length (minutes)",ylab="Cost")+
geom_smooth(color="black",size=2)+
opts(axis.title.x=theme_text(size=16))+
opts(axis.title.y=theme_text(size=16))+
opts(axis.text.x=theme_text(size=14))+
opts(axis.text.y=theme_text(size=14))+
opts(legend.text=theme_text(size=12))+
opts(legend.title=theme_text(size=12,hjust=-.2))