Das Rätsel eines Friseurs


11

Meine Friseurin Stacey macht immer ein fröhliches Gesicht, ist aber oft gestresst, ihre Zeit zu verwalten. Heute war Stacey für meinen Termin überfällig und sehr entschuldigend. Als ich meinen Haarschnitt bekam, fragte ich mich: Wie lange sollten ihre Standardtermine dauern? (Wenn die Präferenz des Kunden für saubere runde Zahlen für einen Moment ignoriert werden könnte).

Zu berücksichtigen ist ein gewisser „Welleneffekt“, bei dem ein sehr später Kunde zu einer Reihe von verspäteten Terminen führen kann. In Wirklichkeit lernen Friseure intuitiv, Termine immer länger zu platzieren, da sie Angst vor diesen stressigen Tagen haben. Aber eine optimale, elegante Lösung muss von einem statistischen Genie da draußen erreicht werden können. (Wenn wir die Realität ein wenig beschwichtigen)

Angenommen

a) Haarschneidezeiten sind normal verteilt und

b) Es gibt nur einen Friseur.

Die Kosten für zu lange Termine sind offensichtlich die Zeit, die der Friseur damit verschwendet, auf den nächsten Termin zu warten. Lassen Sie uns diese verschwendete Zeit 1 US-Dollar pro Minute kosten.

Wenn der Termin jedoch nicht lang genug ist, muss der nächste Kunde warten, was für die kundenliebende Stacey einen höheren Preis von 3 USD pro Minute bedeutet.

  • Stacey arbeitet bis zu 8 Stunden pro Tag und hat genug Nachfrage, um so viele Termine wie möglich zu besetzen

  • Der mittlere Haarschnitt dauert 30 Minuten, mit einem Standard. dev von 10 Minuten. (Nehmen wir auch an, dass die Schnitte von Männern und Frauen gleich sind!)

BEARBEITEN - Einige haben zu Recht darauf hingewiesen, dass Stacey EARLY-Kunden vor ihrer festgelegten Zeit betreuen könnte. Dies fügt eine weitere Komplexitätsebene hinzu, aber wenn wir dies als ein ziemlich realistisches Problem betrachten, müssen wir es einbeziehen. Vergessen wir meine 90/10-Annahme und versuchen wir eine Annahme, die der Realität vielleicht etwas näher kommt.

  • Einige Kunden kommen zu spät, andere zu früh. Der Mittelwert der Kunden liegt 2 Minuten zu spät mit einer Standardabweichung von 2 Minuten (klingt ziemlich realitätsnah, nein?)

Wie lange sollten ihre Termine genau sein?


@alexplanation Entschuldigung, ich habe die Torpfosten auf dich verschoben! Ich bin sicher, dass R-Leser Ihre Antwort schätzen.


2
Wenn sie die Möglichkeit hat, den nächsten Haarschnitt früher als geplant zu beginnen, darf sie dies nicht tun?
normal

N.((μ=8 Std,σ=40 Protokoll)

Ihnen fehlen ein paar Informationen. 1) die Verteilung früher Zeiten ODER die Tatsache, dass frühe Kunden Stacy bis zu ihrem geplanten Termin keine Kosten zufügen, und 2) die Verteilung später Zeiten. Vielleicht sollten Sie einfach eine Verteilung der Ankunftszeiten relativ zur geplanten Ankunftszeit angeben?
Jbowman

Was passiert nach acht Stunden, wenn sie noch keinen Termin hat? Wenn sie weiter arbeitet, sollte der letzte Termin eindeutig 8 Stunden nach dem ersten (der zu Beginn des Tages stattfinden würde) geplant werden, unabhängig davon, wie viele Termine geplant sind.
Jbowman

Antworten:


13

Dieses Problem enthält viele bewegliche Teile, wodurch es für die Simulation reif wird.

Zunächst einmal, wie Elvis in den Kommentaren erwähnt hat, sollte Stacey ungefähr 16 Termine einnehmen, da jeder ungefähr eine halbe Stunde dauert. Aber Sie wissen, dass sich die Dinge immer später verschieben, wenn sich die Termine verzögern. Wenn Stacey also nur dann einen Termin beginnt, wenn sie noch eine halbe Stunde Zeit hat (so viel, um die Haare vom Boden zu fegen, wie, Stacey) ?) dann haben wir weniger als 16 mögliche Slots, wenn wir eine Kristallkugel verwenden, um Termine ohne Ruhezeit zu planen.

Optimal verteilte Haarschnitte

In der nächsten Simulation können wir die Kostenkurve als Funktion der Terminlänge untersuchen. Natürlich wird auch der Rest der Parameter hier eine Rolle spielen - und in Wirklichkeit wird Stacey ihre Termine nicht im Bruchteil von Minuten einplanen, aber dies gibt uns eine gewisse Vorstellung davon, was los ist.

Geben Sie hier die Bildbeschreibung ein

Ich habe auch die Zeit, in der Stacey bei der Arbeit sein muss, als Farbe eingezeichnet. Ich entschied, dass Stacey ihren letzten Termin nie nach 7:30 Uhr planen würde, aber manchmal taucht der Termin zu spät auf oder es gab eine Verzögerung! Sie können sehen, dass die Zeit, die sie nach Hause braucht, quantisiert wird, sodass Sie mit längeren Terminen einen Termin weniger bekommen und dann nicht so spät arbeiten müssen. Und ich denke, das ist hier ein fehlendes Element - vielleicht ist es großartig, Ihre Termine im Abstand von 45 Minuten zu planen, aber Sie erhalten einen zusätzlichen Termin, wenn Sie ihn auf 40 reduzieren können. Diese Kosten werden durch das Warten von Stacey berücksichtigt (weshalb die Kosten steigen mit zunehmender Termindauer), aber Ihre Einschätzung der Wartezeit von Stacey ist möglicherweise nicht korrekt.

Wie auch immer, lustiges Problem! Und ein guter Weg, um etwas ggplot-Güte zu lernen und sich daran zu erinnern, dass meine R-Syntax super wackelig ist. :) :)

Mein Code ist unten - bitte zögern Sie nicht, Verbesserungsvorschläge zu machen.


So generieren Sie den Code für das oberste Diagramm:

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

Die zweite Simulation ist viel länger ...

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
Nett! Widersprechen Sie der Anzeige des Codes?
Elvis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.