Bir kuaför muamma


11

Kuaförlerim Stacey her zaman mutlu bir yüze sahiptir, ancak genellikle zamanını yönetme konusunda stres altındadır. Bugün Stacey benim randevum için gecikmiş ve çok özür dileme. Saçımı alırken merak ettim: Standart randevuları ne kadar olmalı? (müşterinin temiz yuvarlak sayılar için tercihi bir an için yok sayılabilirse).

Dikkate alınması gereken bir şey, çok geç bir müşterinin bir dizi gecikmeli randevuya yol açabileceği belirli bir 'dalgalanma etkisidir'. Gerçekte, kuaförler bu stresli günlerden korktukları için randevuları daha uzun ve daha uzun süre sezgisel olarak öğrenirler. Ancak, orada bazı istatistiksel dehalar tarafından optimum ve zarif bir çözüm elde edilebilir olmalıdır.

Varsayalım

a) saç kesme süreleri normal olarak dağıtılır ve

b) sadece bir kuaför var.

Randevu almanın çok uzun bir maliyeti belli ki kuaförün bir sonraki randevuyu beklemek için harcanan zamanı. Boşa harcanan zamanı dakika başına 1 $ 'a mal edelim.

Ancak randevu yeterince uzun değilse, bir sonraki müşteri beklemeye devam eder, bu da müşteriyi seven Stacey için dakikada 3 dolar daha ağır bir maliyettir.

  • Stacey günde 8 saate kadar çalışıyor ve sığabildiği kadar çok randevu alabilmesi için yeterli talebi var

  • Ortalama saç kesimi onu bir std ile 30 dakika sürüyor. dev 10 dakika. (diyelim ki erkek kesimleri ile kadın kesimlerinin aynı olduğunu varsayalım!)

EDIT - bazıları haklı olarak Stacey'nin belirlenen zamanlarından önce ERKEN müşterilere katılabileceğini belirtti. Bu, başka bir karmaşıklık katmanı ekler, ancak bunu oldukça gerçekçi bir sorun olarak ele alırsak, eklememiz gerekir. 90/10 varsayımımı unutalım ve belki de gerçeğe biraz daha yakın bir varsayım deneyelim.

  • Bazı müşteriler geç, bazıları erken. Müşterilerin ortalaması 2 dakika geç ve standart 2 dakikalık sapma var (kulağa makul geliyor mu?)

Randevuları tam olarak ne kadar olmalı?


@alexplanation özür dilerim Size kale direkleri taşındı! Eminim R okuyucuları cevabınızı takdir eder.


2
bir sonraki saç kesimini planlanandan daha erken başlatabiliyorsa, buna izin verilmiyor mu?
2012'de

Genel bir kural olarak Stacey 16 randevu almalıdır ... bu değerle başlayalım: 16 randevu. Modeliniz göz önüne alındığında, tüyleri kesmek için harcanan toplam süre . Günün sonunda kolayca 30 dakikadan fazla gecikebilir, yani bir randevuyla değişebilir. Belki de modelleme biraz gerçekçi değil? Geç kaldığınızda saç kesimleri biraz hızlanabilir ... Kuyruk teorisi hakkında hiçbir şey bilmiyorum. Sanırım bu onların ele aldığı bir tür sorun ...N(μ=8 hours,σ=40 minutes)
Elvis

Birkaç bilgi eksik. 1) erken saatlerin dağılımı VEYA erken müşterilerin planlanan randevu saatlerine kadar Stacy'ye herhangi bir maliyet getirmemesi ve 2) Geç saatlerin dağılımı. Belki de sadece varış saatlerinin planlanan varış saatine göre dağılımını belirtmelisiniz?
jbowman

Ayrıca, randevu almadıysa sekiz saatin sonunda ne olur? Çalışmaya devam ederse, kaç tane randevunun planlandığına bakılmaksızın, son randevunun, ilk randevunun ardından 8 saat boyunca (günün başında olacak) açıkça planlanması gerekir.
jbowman

Yanıtlar:


13

Bu problemde simülasyon için olgunlaşan birçok hareketli parça var.

Öncelikle, Elvis'in yorumlarda belirttiği gibi, her biri yaklaşık yarım saat olduğu için Stacey'nin yaklaşık 16 randevu alması gerekiyor gibi görünüyor. Ama biliyorsunuz ki randevular gecikmeye başladıkça, işler daha sonra ve daha sonra değişmeye başlıyor - eğer Stacey sadece randevuya yarım saat kaldıysa (saçları yerden süpürmek için çok fazla, eh, Stacey ?) o zaman dinlenme zamanı olmayan randevuları planlamak için bir kristal top kullandıysak, 16'dan az olası yuvaya sahip olacağız.

Optimal aralıklı saç kesimleri

Bir sonraki simülasyonda, randevu uzunluğunun bir fonksiyonu olarak maliyet eğrisini araştırabiliriz. Tabii ki, parametrelerin geri kalanı da burada bir rol oynayacak - ve gerçekte Stacey, randevularını birkaç dakika arayla planlamayacak, ancak bu bize neler olduğu hakkında sezgi veriyor.

resim açıklamasını buraya girin

Ayrıca Stacey'nin renk olarak iş başında olması gereken zamanı planladım. Stacey'nin son randevusunu 7: 30'dan sonra asla planlamayacağına karar verdim, ancak bazen randevu geç ortaya çıkıyor veya bir gecikme oldu! Eve gitme zamanının nicelleştirildiğini görebilirsiniz, böylece randevular uzadıkça bir tane daha az randevu alırsınız ve daha sonra geç saatlerde çalışmak zorunda kalmazsınız. Ve bence bu burada eksik bir unsur - belki randevularınızı 45 dakika arayla planlamak harika, ancak 40'a kadar sıkabiliyorsanız ekstra bir randevu alacaksınız. randevu süresi uzadıkça), ancak Stacey'nin bekleme süresi değerlemeniz doğru olmayabilir.

Her neyse, eğlenceli problem! Ve ggplot iyiliğini öğrenmenin ve R sözdizimin süper titrek olduğunu hatırlamanın iyi bir yolu. :)

Kodum aşağıda - iyileştirme için önerilerde bulunmaktan çekinmeyin.


Üst grafiğin kodunu oluşturmak için:

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

İkinci simülasyon çok daha uzun ...

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
Güzel! Kodu gösteren itirazınız var mı?
Elvis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.