理发师的难题


11

我的美发师史黛西(Stacey)总是笑着说,但经常因管理时间而受到压力。今天,斯泰西因我的任命而逾期未交,并且非常抱歉。在理发时,我想知道:她的标准约会应该持续多久?(如果可以暂时忽略客户对干净整数的偏爱)。

需要考虑的是某种“涟漪效应”,一个非常晚的客户可能导致一连串的延迟约会。实际上,理发师由于担心这些压力大的日子而直观地学会间隔越来越久。但是,必须要有一些统计天才才能实现最佳,优雅的解决方案。(如果我们稍微降低现实水平)

假设

a)剪发时间是正态分布的,

b)只有一个理发师。

预约时间太长,显然会浪费美发师等待下一次约会的时间。让我们将此浪费的时间花费为每分钟$ 1。

但是,如果约会的时间不够长,下一位客户就会一直等待,这对喜欢客户的史黛西来说是每分钟3美元的沉重成本。

  • Stacey每天最多工作8个小时,并且有足够的需求来满足自己所能容纳的尽可能多的约会

  • 平均剪发需要30分钟,而且要进行性病。10分钟的开发时间。(我们也假设男人的削减和女人的削减是相同的!)

编辑-有些人正确地指出,Stacey可以在他们指定的时间之前参加早期客户。这增加了另一层复杂性,但是如果我们将其视为一个非常现实的问题,则需要将其包括在内。让我们忘记我的90/10假设,并尝试一个可能接近现实的假设。

  • 有些客户迟到,有些则早。客户的平均延迟时间为2分钟,标准差为2分钟(听起来与实际情况差不多吗?)

她的约会应该多长时间?


@alexplanation对不起,我已经把您的目标发布了!我相信R读者会感谢您的回答。


2
如果她有能力比预定时间更早开始下一次理发,她是否被允许这样做?
假设正常的2012年

根据经验,Stacey应该接受约16个约会...让我们从这个值开始:16个约会。考虑到您的模型,花费的总时间为。因此,在一天结束时,她很容易迟到30分钟以上,也就是说,一次轮班约会。也许建模有点不切实际?迟到时,发型可以加快一点...我对排队理论一无所知。我认为这是他们要解决的问题...N(μ=8 hours,σ=40 minutes)
Elvis 2012年

您缺少一些信息。1)早期时间的分配,或者早期客户在计划的约会时间之前不会对Stacy造成任何损失的事实,以及2)晚期时间的分配。也许您应该只指定到达时间相对于计划到达时间的分布?
jbowman 2012年

另外,如果她还没有预约,在八个小时后会怎样?如果她继续工作,那么很明显,最后一次约会应该安排在第一次约会之后的8个小时(应该是一天的开始),而不管安排多少约会。
jbowman 2012年

Answers:


13

这个问题有很多活动的部分,这使得模拟变得成熟。

首先,正如埃尔维斯在评论中提到的那样,史黛西似乎需要约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))

1
真好!您是否反对显示代码?
猫王2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.