L'enigma di un parrucchiere


11

La mia parrucchiera Stacey ha sempre una faccia felice, ma è spesso stressata nel gestire il suo tempo. Oggi Stacey era in ritardo per il mio appuntamento ed era molto dispiaciuto. Mentre mi tagliavo i capelli mi chiedevo: quanto tempo dovevano essere i suoi appuntamenti standard? (se la preferenza del cliente per i numeri arrotondati puliti potrebbe essere ignorata, per un momento).

Qualcosa da considerare è un certo "effetto a catena" in cui un cliente molto in ritardo può portare a una serie di appuntamenti in ritardo. In realtà, i parrucchieri imparano intuitivamente a spaziare appuntamenti sempre più a lungo mentre temono di questi giorni stressanti. Ma una soluzione ottimale ed elegante deve essere raggiungibile da un genio statistico là fuori .. (se smorziamo un po 'la realtà)

Assumiamo

a) i tempi di taglio dei capelli sono normalmente distribuiti e

b) c'è solo un parrucchiere.

Il costo di fissare appuntamenti troppo lunghi è ovviamente il tempo perso dal parrucchiere in attesa del prossimo appuntamento. Costiamo questo tempo sprecato $ 1 al minuto.

Ma se l'appuntamento non è abbastanza lungo, il prossimo cliente è in attesa, il che è un costo più pesante di $ 3 al minuto per Stacey che ama i clienti.

  • Stacey lavora fino a 8 ore al giorno e ha una domanda sufficiente per poter riempire tutti gli appuntamenti che può inserirsi

  • Il taglio medio dei capelli impiega 30 minuti, con uno std. sviluppo di 10 minuti. (supponiamo anche che i tagli da uomo e quelli da donna siano uguali!)

EDIT - alcuni hanno giustamente sottolineato che Stacey potrebbe occuparsi di EARLY clienti prima del loro tempo stabilito. Ciò aggiunge un altro livello di complessità, ma se trattiamo questo come un problema abbastanza realistico, dobbiamo includerlo. Dimentichiamo il mio presupposto del 90/10 e proviamo per un presupposto forse un po 'più vicino alla realtà.

  • Alcuni clienti sono in ritardo e alcuni sono in anticipo. La media dei clienti è in ritardo di 2 minuti con una deviazione standard di 2 minuti (sembra ragionevolmente vicino alla realtà no?)

Esattamente quanto dovrebbero durare i suoi appuntamenti?


@alexplanation mi dispiace di aver spostato i post degli obiettivi su di te! Sono sicuro che i lettori di R apprezzeranno la tua risposta.


2
se ha la possibilità di iniziare il prossimo taglio di capelli prima del previsto, non le è permesso farlo?
assunto il

N(μ=8 hours,σ=40 minutes)

Manca un paio di informazioni. 1) la distribuzione dei primi tempi OPPURE il fatto che i primi clienti non impongano alcun costo su Stacy fino al loro orario di appuntamento programmato, e 2) la distribuzione dei tempi ritardati. Forse dovresti semplicemente specificare una distribuzione degli orari di arrivo in relazione all'orario di arrivo previsto?
jbowman

Inoltre, cosa succede alla fine delle otto ore se non ha terminato un appuntamento? Se continua a lavorare, chiaramente l'ultimo appuntamento dovrebbe essere programmato per 8 ore dopo il primo (che sarebbe all'inizio della giornata), indipendentemente dal numero di appuntamenti previsti.
jbowman,

Risposte:


13

Ci sono molte parti mobili in questo problema, che lo rende maturo per la simulazione.

Prima di tutto, come Elvis ha menzionato nei commenti, sembra che Stacey dovrebbe prendere circa 16 appuntamenti, dato che ognuno è circa mezz'ora. Ma sai che quando gli appuntamenti iniziano a essere ritardati, le cose iniziano a spostarsi più tardi e più tardi - quindi se Stacey inizierà un appuntamento solo se le resterà mezz'ora (così tanto per spazzare i capelli dal pavimento, eh, Stacey ?) allora avremo meno di 16 possibili slot, se usassimo una sfera di cristallo per programmare appuntamenti senza tempo di riposo.

Tagli di capelli distanziati in modo ottimale

Nella prossima simulazione, possiamo studiare la curva dei costi in funzione della durata dell'appuntamento. Naturalmente, anche il resto dei parametri finirà per svolgere un ruolo qui - e in realtà, Stacey non pianificherà i suoi appuntamenti a pochi minuti di distanza, ma questo ci dà qualche intuizione su ciò che sta succedendo.

inserisci qui la descrizione dell'immagine

Ho anche tracciato il tempo in cui Stacey deve essere al lavoro come colore. Ho deciso che Stacey non avrebbe mai programmato il suo ultimo appuntamento dopo le 7:30, ma a volte l'appuntamento si presenta in ritardo o c'è stato un ritardo! Puoi vedere che il tempo in cui arriva a casa è quantizzato, così che man mano che gli appuntamenti si allungano, ottieni un appuntamento in meno e quindi non devi lavorare fino a tardi. E penso che sia un elemento mancante qui - forse programmare gli appuntamenti a 45 minuti di distanza è fantastico, ma otterrai un appuntamento in più se riesci a spingerlo a 40. Tale costo è incorporato dall'attesa di Stacey (motivo per cui il costo va man mano che aumenta la durata dell'appuntamento) ma la tua valutazione del tempo di attesa di Stacey potrebbe non essere corretta.

Comunque, problema divertente! E un buon modo per imparare un po 'di bontà ggplot e ricordare che la mia sintassi R è molto traballante. :)

Il mio codice è sotto - non esitate a offrire suggerimenti per il miglioramento.


Per generare il codice per la trama principale:

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 seconda simulazione è molto più lunga ...

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
Bello! Ti opponi mostrando il codice?
Elvis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.