Une énigme de coiffeur


11

Ma coiffeuse Stacey a toujours un visage heureux, mais elle est souvent stressée par la gestion de son temps. Aujourd'hui, Stacey était en retard pour ma nomination et très excusée. Tout en obtenant ma coupe de cheveux, je me suis demandé: combien de temps ses rendez-vous standard devraient-ils être? (si la préférence du client pour des numéros ronds propres peut être ignorée, pendant un moment).

Quelque chose à considérer est un certain «effet d'entraînement» où un client très en retard peut entraîner une série de rendez-vous retardés. En réalité, les coiffeurs apprennent intuitivement à espacer les rendez-vous de plus en plus car ils craignent ces journées stressantes. Mais une solution optimale et élégante doit être réalisable par un génie statistique là-bas .. (si nous réduisons un peu la réalité)

Assumons

a) les temps de coupe des cheveux sont normalement répartis et

b) il n'y a qu'un seul coiffeur.

Le coût de fixer des rendez-vous trop longtemps est évidemment le temps perdu par le coiffeur à attendre le prochain rendez-vous. Coûtons ce temps perdu 1 $ par minute.

Mais si le rendez-vous n'est pas assez long, le prochain client reste en attente, ce qui représente un coût plus élevé de 3 $ par minute pour Stacey, qui aime le client.

  • Stacey travaille jusqu'à 8 heures par jour et a suffisamment de demandes pour pouvoir remplir autant de rendez-vous qu'elle le peut

  • La coupe moyenne des cheveux lui prend 30 minutes, avec un std. dev de 10 minutes. (supposons également que les coupes pour hommes et les coupes pour femmes sont les mêmes!)

EDIT - certains ont souligné à juste titre que Stacey pourrait s'occuper des clients EARLY avant l'heure prévue. Cela ajoute une autre couche de complexité, mais si nous traitons cela comme un problème assez réaliste, nous devons l'inclure. Oublions mon hypothèse 90/10 et essayons une hypothèse peut-être un peu plus proche de la réalité.

  • Certains clients sont en retard et certains sont en avance. La moyenne des clients est en retard de 2 minutes avec un écart type de 2 minutes (sons raisonnablement proches de la réalité non?)

Quelle devrait être la durée exacte de ses rendez-vous?


@alexplanation désolé d'avoir déplacé les messages d'objectif sur vous! Je suis sûr que les lecteurs de R apprécient votre réponse.


2
si elle a la possibilité de commencer la prochaine coupe de cheveux plus tôt que prévu, elle n'est pas autorisée à le faire?
supposé normal

En règle générale, Stacey devrait prendre environ 16 rendez-vous ... Commençons par cette valeur: 16 rendez-vous. Compte tenu de votre modèle, le temps total passé à couper les cheveux est un . Ainsi, à la fin de la journée, elle peut facilement avoir plus de 30 minutes de retard, c'est-à-dire un changement d'un rendez-vous. Peut-être que la modélisation est un peu irréaliste? Les coupes de cheveux peuvent être accélérées un peu lorsque vous êtes en retard ... Je ne sais rien de la théorie des files d'attente. Je pense que c'est le genre de problème qu'ils abordent ...N(μ=8 hours,σ=40 minutes)
Elvis

Il vous manque quelques informations. 1) la distribution des heures précoces OU le fait que les premiers clients n'infligent aucun coût à Stacy jusqu'à l'heure prévue pour leur rendez-vous, et 2) la distribution des heures tardives. Peut-être devriez-vous simplement spécifier une distribution des heures d'arrivée par rapport à l'heure d'arrivée prévue?
jbowman

De plus, que se passe-t-il au bout de huit heures si elle n'a pas terminé son rendez-vous? Si elle continue de travailler, il est clair que le dernier rendez-vous devrait être programmé 8 heures après le premier (ce qui serait au début de la journée), quel que soit le nombre de rendez-vous prévus.
jbowman

Réponses:


13

Il y a beaucoup de pièces mobiles dans ce problème, ce qui le rend mûr pour la simulation.

Tout d'abord, comme Elvis l'a mentionné dans les commentaires, il semble que Stacey devrait prendre environ 16 rendez-vous, car chacun dure environ une demi-heure. Mais vous savez qu'à mesure que les rendez-vous commencent à être retardés, les choses changent de plus en plus tard - donc si Stacey ne commence un rendez-vous que s'il lui reste une demi-heure (tant pour balayer les cheveux du sol, hein, Stacey ?) alors nous aurons moins de 16 emplacements possibles, si nous utilisions une boule de cristal pour planifier des rendez-vous sans temps de repos.

Coupes de cheveux espacées de manière optimale

Dans la prochaine simulation, nous pouvons étudier la courbe des coûts en fonction de la durée des rendez-vous. Bien sûr, le reste des paramètres finira également par jouer un rôle ici - et en réalité, Stacey ne va pas planifier ses rendez-vous à quelques minutes d'intervalle, mais cela nous donne une idée de ce qui se passe.

entrez la description de l'image ici

J'ai également tracé le temps que Stacey doit être au travail comme couleur. J'ai décidé que Stacey ne planifierait jamais son dernier rendez-vous après 7h30, mais parfois le rendez-vous arrive en retard, ou il y a eu un retard! Vous pouvez voir que le temps qu'elle a pour rentrer chez elle est quantifié, de sorte qu'à mesure que les rendez-vous s'allongent, vous obtenez un rendez-vous de moins et vous n'avez donc pas à travailler aussi tard. Et je pense que c'est un élément manquant ici - peut-être planifier vos rendez-vous à 45 minutes d'intervalle est génial, mais vous obtiendrez un rendez-vous supplémentaire si vous pouvez le réduire à 40. Ce coût est intégré par l'attente de Stacey (c'est pourquoi le coût va au fur et à mesure que la durée du rendez-vous augmente), mais votre évaluation du temps d'attente de Stacey peut ne pas être correcte.

Quoi qu'il en soit, problème amusant! Et un bon moyen d'apprendre la bonté de ggplot et de se rappeler que ma syntaxe R est très fragile. :)

Mon code est ci-dessous - n'hésitez pas à proposer des suggestions d'amélioration.


Pour générer le code du tracé supérieur:

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 deuxième simulation est beaucoup plus longue ...

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
Agréable! Vous opposez-vous à l'affichage du code?
Elvis
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.