El enigma de un peluquero


11

Mi peluquera Stacey siempre pone una cara feliz, pero a menudo está estresada por manejar su tiempo. Hoy Stacey estaba retrasada para mi cita y se disculpó mucho. Mientras me cortaba el pelo, me preguntaba: ¿cuánto tiempo deberían durar sus citas estándar? (si la preferencia del cliente por números redondos limpios podría ignorarse, por un momento).

Algo a considerar es un cierto 'efecto dominó' en el que un cliente muy tardío puede llevar a una serie de citas demoradas. En realidad, los peluqueros aprenden intuitivamente a espaciar las citas cada vez más, ya que temen estos días estresantes. Pero una solución óptima y elegante debe ser lograda por algún genio estadístico por ahí ... (si atenuamos un poco la realidad)

Asumamos

a) los tiempos de corte de cabello se distribuyen normalmente y

b) solo hay una peluquería.

El costo de programar citas por mucho tiempo es obviamente el tiempo perdido del peluquero esperando la próxima cita. Cuestemos este tiempo perdido $ 1 por minuto.

Pero si la cita no es lo suficientemente larga, el próximo cliente se queda esperando, lo que representa un costo mayor de $ 3 por minuto para Stacey, que ama al cliente.

  • Stacey trabaja hasta 8 horas por día, y tiene suficiente demanda para que pueda llenar tantas citas como pueda.

  • El corte de cabello medio le lleva 30 minutos, con un estándar. dev de 10 minutos. (¡supongamos también que los cortes para hombres y los cortes para mujeres son iguales!)

EDITAR: algunos han señalado acertadamente que Stacey podría atender a los clientes ANTICIPADOS antes de la hora señalada. Esto agrega otra capa de complejidad, pero si tratamos esto como un problema bastante realista, debemos incluirlo. Olvidemos mi suposición 90/10 e intentemos una suposición quizás un poco más cercana a la realidad.

  • Algunos clientes llegan tarde y otros llegan temprano. La media de clientes llega con 2 minutos de retraso con una desviación estándar de 2 minutos (¿suena razonablemente cerca de la realidad, no?)

¿Exactamente cuánto tiempo deben ser sus citas?


@alexplanation lo siento, te he movido las publicaciones de objetivos. Estoy seguro de que los lectores de R aprecian su respuesta.


2
Si tiene la capacidad de comenzar el próximo corte de cabello antes de lo programado, ¿no se le permite hacerlo?
asumido el

Como regla general, Stacey debería tomar alrededor de 16 citas ... Comencemos con este valor: 16 citas. Teniendo en cuenta su modelo, el tiempo total dedicado a cortar pelos es unnorte(μ=8 horas,σ=40 minutos). Entonces, al final del día, puede llegar más de 30 minutos tarde, es decir, un turno con una cita. Tal vez el modelado es un poco irreal Los cortes de pelo se pueden acelerar un poco cuando llegas tarde ... No sé nada sobre teoría de colas. Creo que este es el tipo de problema que abordan ...
Elvis

Te falta un par de datos. 1) la distribución de los primeros tiempos O el hecho de que los primeros clientes no infligen ningún costo en Stacy hasta la hora programada de su cita, y 2) La distribución de los últimos tiempos. ¿Tal vez debería especificar una distribución de los tiempos de llegada en relación con el horario de llegada programado?
jbowman

Además, ¿qué sucede al final de las ocho horas si no ha terminado con una cita? Si continúa trabajando, claramente la última cita debe programarse para 8 horas después de la primera (que sería al comienzo del día), independientemente de cuántas citas estén programadas.
jbowman

Respuestas:


13

Hay muchas partes móviles en este problema, lo que lo hace maduro para la simulación.

En primer lugar, como mencionó Elvis en los comentarios, parece que Stacey debería tomar alrededor de 16 citas, ya que cada una dura aproximadamente media hora. Pero sabes que a medida que las citas comienzan a retrasarse, las cosas comienzan a cambiar cada vez más tarde, por lo que si Stacey solo comenzará una cita si le queda media hora (tanto por barrer el cabello del piso, eh, Stacey ?) entonces tendremos menos de 16 ranuras posibles, si usamos una bola de cristal para programar citas sin tiempo de descanso.

Cortes de pelo espaciados óptimamente

En la siguiente simulación, podemos investigar la curva de costo en función de la duración de la cita. Por supuesto, el resto de los parámetros también terminarán jugando un papel aquí, y en realidad, Stacey no va a programar sus citas con una fracción de minutos de diferencia, pero esto nos da una idea de lo que está sucediendo.

ingrese la descripción de la imagen aquí

También he trazado el tiempo que Stacey tiene que estar en el trabajo como color. Decidí que Stacey nunca programaría su última cita después de las 7:30, pero a veces la cita llega tarde, ¡o ha habido un retraso! Puede ver que el tiempo que ella tiene para ir a casa está cuantificado, de modo que a medida que las citas se alargan, obtiene una cita menos y luego no tiene que trabajar tan tarde. Y creo que ese es un elemento que falta aquí: tal vez programar sus citas con 45 minutos de diferencia es excelente, pero obtendrá una cita adicional si puede reducirlo a 40. Ese costo se incorpora por la espera de Stacey (por eso el costo va a medida que aumenta la duración de la cita) pero su valoración del tiempo de espera de Stacey podría no ser correcta.

De todos modos, divertido problema! Y una buena manera de aprender algo de ggplot y recordar que mi sintaxis R es súper inestable. :)

Mi código está debajo. No dude en ofrecer sugerencias para mejorar.


Para generar el código para la trama 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")

La segunda simulación es mucho más larga ...

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
¡Agradable! ¿Se opone a mostrar el código?
Elvis
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.