O enigma de um cabeleireiro

11

Minha cabeleireira Stacey sempre mostra uma cara feliz, mas costuma ficar estressada com a possibilidade de administrar seu tempo. Hoje, Stacey estava atrasada para minha consulta e se desculpou muito. Enquanto cortava o cabelo, eu me perguntava: quanto tempo deveriam durar as consultas regulares? (se a preferência do cliente por números redondos limpos puder ser ignorada, por um momento).

Algo a considerar é um certo "efeito cascata", em que um cliente muito atrasado pode levar a uma série de compromissos atrasados. Na realidade, os cabeleireiros aprendem intuitivamente a marcar consultas por mais e mais tempo, pois temem esses dias estressantes. Mas uma solução ótima e elegante deve ser alcançada por algum gênio estatístico por aí .. (se diminuirmos um pouco a realidade)

Vamos assumir

a) os tempos de corte de cabelo são normalmente distribuídos e

b) existe apenas um cabeleireiro.

O custo da marcação de consultas por muito tempo é obviamente o tempo gasto com o cabeleireiro aguardando a próxima consulta. Vamos custar esse tempo perdido US $ 1 por minuto.

Mas se o compromisso não for longo o suficiente, o próximo cliente fica esperando, o que representa um custo mais alto de US $ 3 por minuto para Stacey, que adora o cliente.

  • Stacey trabalha até 8 horas por dia e tem demanda suficiente para poder preencher o máximo de compromissos possível.

  • O corte de cabelo médio leva 30 minutos, com um padrão. dev de 10 minutos. (Vamos também assumir que os cortes masculinos e femininos são os mesmos!)

EDIT - alguns salientaram, com razão, que a Stacey poderia atender os clientes do EARLY antes do horário marcado. Isso adiciona outra camada de complexidade, mas se tratarmos isso como um problema bastante realista, precisamos incluí-lo. Vamos esquecer minha suposição 90/10 e tentar uma suposição talvez um pouco mais próxima da realidade.

  • Alguns clientes estão atrasados ​​e outros mais cedo. A média de clientes está 2 minutos atrasada com um desvio padrão de 2 minutos (soa razoavelmente próximo da realidade, não?)

Exatamente quanto tempo devem durar as consultas?


@alexplanation desculpe, mudei as postagens para você! Tenho certeza de que os leitores da R apreciam sua resposta.

usuario
fonte
2
se ela tiver a capacidade de iniciar o próximo corte de cabelo antes do previsto, ela não poderá fazê-lo?
assumednormal
N(μ=8 hours,σ=40 minutes)
Faltam algumas informações. 1) a distribuição dos primeiros tempos OU o fato de os clientes iniciais não infligirem qualquer custo à Stacy até o horário agendado, e 2) a distribuição dos últimos tempos. Talvez você deva apenas especificar uma distribuição dos horários de chegada em relação ao horário de chegada programado?
jbowman
Além disso, o que acontece no final de oito horas se ela não termina um compromisso? Se ela continuar trabalhando, claramente o último compromisso deve ser agendado para 8 horas após o primeiro (que seria no início do dia), independentemente de quantos compromissos estão agendados.
jbowman

Respostas:

13

Existem muitas partes móveis nesse problema, o que o torna adequado para a simulação.

Primeiro, como Elvis mencionou nos comentários, parece que Stacey deve levar cerca de 16 consultas, pois cada uma delas dura cerca de meia hora. Mas você sabe que, quando os compromissos começam a atrasar, as coisas começam a mudar cada vez mais tarde - por isso, se Stacey só vai começar um compromisso se tiver meia hora restante (muito para tirar o cabelo do chão, hein, Stacey ?), teremos menos de 16 espaços possíveis, se usarmos uma bola de cristal para agendar compromissos sem tempo de descanso.

Cortes de cabelo com espaçamento ideal

Na próxima simulação, podemos investigar a curva de custo em função da duração do compromisso. É claro que o restante dos parâmetros também acabará desempenhando um papel aqui - e, na realidade, Stacey não vai agendar seus compromissos em minutos fracionários, mas isso nos dá alguma intuição sobre o que está acontecendo.

insira a descrição da imagem aqui

Também tracei o tempo em que Stacey deve estar no trabalho como a cor. Decidi que Stacey nunca agendaria seu último compromisso depois das 7:30, mas às vezes o compromisso aparece tarde, ou houve um atraso! Você pode ver que o tempo que ela chega em casa é quantizado, de modo que, à medida que os compromissos se prolongam, você recebe menos um compromisso e não precisa trabalhar até mais tarde. E acho que esse é um elemento que falta aqui - talvez agendar seus compromissos com 45 minutos de diferença seja ótimo, mas você terá um compromisso extra se puder reduzi-lo a 40. Esse custo é incorporado pela espera de Stacey (e é por isso que o custo aumenta) conforme a duração do compromisso aumenta), mas sua avaliação do tempo de espera de Stacey pode não estar correta.

Enfim, problema divertido! E uma boa maneira de aprender um pouco sobre o ggplot e lembrar que minha sintaxe R é super instável. :)

Meu código está abaixo - sinta-se à vontade para oferecer sugestões de melhorias.


Para gerar o código para o gráfico superior:

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")

A segunda simulação é muito mais longa ...

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))
alexplanation
fonte
1
Agradável! Você se opõe a mostrar o código?
Elvis