Zagadka fryzjera

11

Moja fryzjerka Stacey zawsze robi radosną minę, ale często stresuje ją zarządzanie czasem. Dzisiaj Stacey była spóźniona na moje spotkanie i bardzo przepraszała. Podczas strzyżenia zastanawiałem się: jak długo powinny trwać jej standardowe spotkania? (jeśli preferencje klienta dotyczące czystych okrągłych numerów można na chwilę zignorować).

Należy wziąć pod uwagę pewien „efekt falowania”, w którym jeden bardzo późny klient może doprowadzić do szeregu opóźnionych spotkań. W rzeczywistości fryzjerzy intuicyjnie uczą się rozmieszczać terminy coraz dłużej, ponieważ obawiają się stresujących dni. Ale optymalne, eleganckie rozwiązanie musi być możliwe do osiągnięcia dzięki geniuszowi statystycznemu ... (jeśli trochę stępimy rzeczywistość)

Załóżmy

a) czasy strzyżenia włosów są zwykle rozkładane i

b) jest tylko jeden fryzjer.

Koszt zbyt długiego umawiania się na spotkania to oczywiście marnowanie czasu fryzjera na oczekiwanie na następne spotkanie. Kosztujmy ten zmarnowany czas 1 USD za minutę.

Ale jeśli spotkanie nie jest wystarczająco długie, kolejny klient będzie czekał, co kosztuje Stacey kochającego klienta 3 USD za minutę.

  • Stacey pracuje do 8 godzin dziennie i ma wystarczające zapotrzebowanie, aby mogła obsłużyć tyle spotkań, ile będzie mogła zmieścić

  • Średni strzyżenie zajmuje jej 30 minut ze standardowym std. dev 10 minut. (załóżmy również, że męskie cięcia i damskie są takie same!)

EDYCJA - niektórzy słusznie zauważyli, że Stacey może zająć się WCZESNYMI klientami przed wyznaczonym czasem. Dodaje to kolejną warstwę złożoności, ale jeśli traktujemy to jako dość realistyczny problem, musimy go uwzględnić. Zapomnijmy o moim założeniu 90/10 i spróbujmy założyć, że być może trochę bliżej rzeczywistości.

  • Niektórzy klienci spóźniają się, a niektórzy wcześnie. Średnia klientów spóźnia się o 2 minuty ze standardowym odchyleniem 2 minut (brzmi rozsądnie blisko rzeczywistości, nie?)

Dokładnie jak długie powinny być jej spotkania?


@alexplanation przepraszam, przeniosłem na ciebie posty z celami! Jestem pewien, że czytelnicy R docenią twoją odpowiedź.

Nacięcie
źródło
2
jeśli ma możliwość rozpoczęcia następnej fryzury wcześniej niż zaplanowano, nie może tego zrobić?
zakładano, że normalny
Zasadniczo Stacey powinna odbywać około 16 spotkań ... zacznijmy od tej wartości: 16 spotkań. Biorąc pod uwagę model, całkowity czas strzyżenia włosów to . Tak więc pod koniec dnia może łatwo spóźnić się o ponad 30 minut, tj. O jedną wizytę. Może modelowanie jest trochę nierealne? Fryzury można trochę przyspieszyć, gdy się spóźnisz ... Nie wiem nic na temat teorii kolejkowania. Myślę, że to jest problem, którym się zajmują ...N(μ=8 hours,σ=40 minutes)
Elvis
Brakuje kilku informacji. 1) podział wczesnych godzin LUB fakt, że pierwsi klienci nie obciążają Stacy żadnych kosztów do czasu ich umówionego terminu, oraz 2) podział późnych godzin. Może powinieneś po prostu określić rozkład czasów przyjazdu w stosunku do planowanego czasu przyjazdu?
łucznik
Co się stanie po upływie ośmiu godzin, jeśli nie skończy spotkania? Jeśli nadal będzie pracować, najwyraźniej ostatnia wizyta powinna zostać zaplanowana na 8 godzin po pierwszej (która miałaby miejsce na początku dnia), niezależnie od liczby zaplanowanych wizyt.
jbowman

Odpowiedzi:

13

W tym problemie jest wiele ruchomych części, co czyni go dojrzałym do symulacji.

Po pierwsze, jak wspomniał Elvis w komentarzach, wydaje się, że Stacey powinna wziąć około 16 spotkań, ponieważ każde z nich trwa około pół godziny. Ale wiesz, że kiedy terminy zaczynają się opóźniać, sprawy zaczynają się zmieniać później i później - więc jeśli Stacey zamierza umówić się na spotkanie tylko wtedy, gdy zostanie jej pół godziny (tyle za zamiatanie włosów z podłogi, co, Stacey ?) to będziemy mieli mniej niż 16 możliwych miejsc, jeśli użyjemy kryształowej kuli do planowania spotkań bez czasu odpoczynku.

Optymalnie rozmieszczone fryzury

W następnej symulacji możemy zbadać krzywą kosztu jako funkcję długości spotkania. Oczywiście reszta parametrów również będzie odgrywała tutaj rolę - i w rzeczywistości Stacey nie planuje swoich spotkań w odstępach ułamkowych minut, ale to daje nam trochę intuicji na temat tego, co się dzieje.

wprowadź opis zdjęcia tutaj

Rysowałem również czas, w którym Stacey musi być w pracy jako kolor. Zdecydowałem, że Stacey nigdy nie umówi się na ostatnią wizytę po 7:30, ale czasem spotkanie pojawia się późno lub opóźnienie! Widać, że czas powrotu do domu jest skalkulowany, więc w miarę jak spotkania stają się dłuższe, dostajesz o jedno spotkanie mniej, a potem nie musisz pracować do późna. I myślę, że tutaj brakuje elementu - być może umówienie się na spotkanie w odstępie 45 minut jest świetne, ale dostaniesz dodatkowe spotkanie, jeśli możesz je zmniejszyć do 40. Koszt ten jest uwzględniany przez czekanie Stacey (i dlatego koszt idzie w miarę wydłużania się terminu spotkania), ale Twoja ocena czasu oczekiwania Stacey może być nieprawidłowa.

W każdym razie fajny problem! I dobry sposób na poznanie dobroci ggplot i pamiętanie, że moja składnia R jest bardzo niepewna. :)

Mój kod znajduje się poniżej - możesz zaproponować ulepszenia.


Aby wygenerować kod dla górnego wykresu:

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

Druga symulacja jest znacznie dłuższa ...

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
źródło
1
Ładny! Czy sprzeciwiasz się wyświetleniu kodu?
Elvis