ปริศนาของช่างผม


11

ช่างทำผมของฉัน Stacey มักจะมีใบหน้าที่มีความสุข แต่มักจะเน้นเรื่องการจัดการเวลาของเธอ วันนี้ Stacey เกินกำหนดสำหรับการนัดหมายของฉันและขอโทษมาก ในขณะที่ได้รับการตัดผมของฉันฉันสงสัยว่า: นัดหมายมาตรฐานของเธอจะนานแค่ไหน? (หากลูกค้าไม่สนใจค่าหมายเลขรอบที่สะอาดก็สามารถทำได้ในขณะนี้)

สิ่งที่ควรพิจารณาคือ 'เอฟเฟ็กต์ระลอกคลื่น' ซึ่งลูกค้าที่มาช้ามากคนหนึ่งสามารถนำไปสู่การนัดหมายที่ล่าช้า ในความเป็นจริงช่างทำผมได้เรียนรู้ที่จะนัดหมายในอวกาศนานขึ้นเรื่อย ๆ เพราะกลัววันเครียดเหล่านี้ แต่วิธีการแก้ปัญหาที่เหมาะสมและสง่างามจะต้องสามารถทำได้โดยอัจฉริยะทางสถิติบางอย่างที่นั่น .. (ถ้าเราลดความเป็นจริงลงเล็กน้อย)

สมมติว่า

a) เวลาในการตัดผมนั้นมีการกระจายตามปกติและ

b) มีช่างทำผมเพียงคนเดียว

ค่าใช้จ่ายในการตั้งค่าการนัดหมายนานเกินไปจะเห็นได้ชัดว่าช่างทำผมเสียเวลารอการนัดหมายครั้งต่อไป เรามาเสียเวลานี้ $ 1 ต่อนาที

แต่หากการนัดหมายไม่เพียงพอลูกค้ารายต่อไปจะถูกรอคอยซึ่งเป็นค่าใช้จ่ายที่หนักกว่า $ 3 ต่อนาทีสำหรับ Stacey ผู้เป็นที่รักของลูกค้า

  • Stacey ทำงานได้มากถึง 8 ชั่วโมงต่อวันและมีความต้องการมากพอที่จะเติมเต็มการนัดหมายให้มากที่สุดเท่าที่จะทำได้

  • การตัดผมเฉลี่ยนั้นใช้เวลา 30 นาทีโดยมี std dev จาก 10 นาที (สมมติว่าการตัดชายและการตัดผู้หญิงเป็นเหมือนกัน!)

แก้ไข - มีบางคนชี้ให้เห็นอย่างถูกต้องว่า Stacey สามารถเข้าร่วมกับลูกค้าก่อนเวลาที่กำหนด นี่เป็นการเพิ่มความซับซ้อนอีกระดับ แต่ถ้าเราปฏิบัติต่อสิ่งนี้เป็นปัญหาที่เกิดขึ้นจริงเราต้องรวมมันไว้ด้วย ลองลืมสมมติฐาน 90/10 ของฉันและลองสมมุติฐานดูอาจจะใกล้เคียงกับความเป็นจริงเล็กน้อย

  • ลูกค้าบางคนมาสายและบางคนมาก่อน ค่าเฉลี่ยของลูกค้าอยู่ที่ 2 นาทีโดยมีค่าเบี่ยงเบนมาตรฐาน 2 นาที (ฟังดูสมเหตุสมผลใกล้ความเป็นจริงหรือไม่?)

นัดหมายของเธอควรจะนานแค่ไหน?


@alexplanation ขออภัยฉันย้ายโพสต์เป้าหมายไปแล้ว! ฉันแน่ใจว่าผู้อ่าน R ชื่นชมคำตอบของคุณ


2
ถ้าเธอมีความสามารถในการเริ่มตัดผมครั้งต่อไปเร็วกว่ากำหนดเธอไม่ได้รับอนุญาตให้ทำเช่นนั้น?
สันนิษฐานว่าปกติ

ยังไม่มีข้อความ(μ=8 ชั่วโมง,σ=40 นาที)

คุณพลาดข้อมูลบางส่วน 1) การกระจายครั้งแรกหรือความจริงที่ว่าลูกค้าก่อนไม่ได้รับค่าใช้จ่ายใด ๆ กับสเตซี่จนกว่าจะถึงกำหนดเวลานัดและ 2) การกระจายเวลาล่าช้า บางทีคุณควรระบุการกระจายเวลามาถึงเทียบกับเวลาถึงที่กำหนด
jbowman

นอกจากนี้จะเกิดอะไรขึ้นเมื่อสิ้นสุดแปดชั่วโมงถ้าเธอยังไม่ได้นัด ถ้าเธอทำงานต่อไปชัดเจนว่าการนัดหมายครั้งสุดท้ายควรกำหนดไว้ 8 ชั่วโมงหลังจากครั้งแรก (ซึ่งจะเป็นตอนเริ่มต้นของวัน) ไม่ว่าจะมีการนัดหมายกี่นัดก็ตาม
jbowman

คำตอบ:


13

มีชิ้นส่วนที่เคลื่อนไหวจำนวนมากในปัญหานี้ซึ่งทำให้สุกสำหรับการจำลอง

ก่อนอื่นตามที่เอลวิสพูดถึงในความคิดเห็นดูเหมือนว่า Stacey ควรใช้เวลานัดหมายประมาณ 16 ครั้งเพราะแต่ละคนใช้เวลาประมาณครึ่งชั่วโมง แต่คุณรู้ว่าเมื่อการนัดหมายเริ่มช้าลงสิ่งต่าง ๆ เริ่มเปลี่ยนไปเรื่อย ๆ - ดังนั้นถ้า Stacey กำลังจะเริ่มนัดเท่านั้นหากเธอเหลือเวลาอีกครึ่งชั่วโมง ?) จากนั้นเราจะมีช่องว่างที่เป็นไปได้น้อยกว่า 16 ช่องหากเราใช้ลูกบอลคริสตัลเพื่อกำหนดเวลาการนัดหมายโดยไม่มีเวลาพัก

ทรงผมที่เว้นระยะอย่างเหมาะสมที่สุด

ในการจำลองถัดไปเราสามารถตรวจสอบเส้นโค้งของต้นทุนเป็นฟังก์ชันของระยะเวลาในการนัดหมาย แน่นอนว่าพารามิเตอร์ที่เหลือจะจบลงด้วยการเล่นบทบาทที่นี่ - และในความเป็นจริง Stacey จะไม่กำหนดเวลาการนัดหมายของเธอแยกเป็นส่วน ๆ แต่สิ่งนี้ทำให้เรามีสัญชาตญาณว่าเกิดอะไรขึ้น

ป้อนคำอธิบายรูปภาพที่นี่

ฉันยังได้วางแผนเวลาที่ Stacey ต้องทำงานเหมือนสี ฉันตัดสินใจว่า Stacey จะไม่นัดหมายกับเธอครั้งสุดท้ายหลังจากเวลา 7:30 น. แต่บางครั้งการนัดหมายปรากฏขึ้นช้าหรือมีความล่าช้า! คุณจะเห็นว่าเวลาที่เธอกลับถึงบ้านถูกกำหนดปริมาณเพื่อให้การนัดหมายนานขึ้นคุณจะได้รับการนัดหมายน้อยลงและไม่ต้องทำงานสาย และฉันคิดว่านั่นเป็นองค์ประกอบที่ขาดหายไปที่นี่ - บางทีการกำหนดเวลาการนัดหมายของคุณห่างกัน 45 นาทีนั้นยอดเยี่ยม แต่คุณจะได้รับการนัดหมายพิเศษหากคุณสามารถบีบให้ถึง 40 ค่าใช้จ่ายนั้นถูกรวมเข้าด้วยกันโดย Stacey ขึ้นอยู่กับระยะเวลาที่นัดหมายเพิ่มขึ้น) แต่การประเมินเวลารอของ Stacey อาจไม่ถูกต้อง

อย่างไรก็ตามปัญหาสนุก! และเป็นวิธีที่ดีในการเรียนรู้ความดีของ ggplot และจำไว้ว่าไวยากรณ์ R ของฉันนั้นสั่นคลอนสุด ๆ :)

รหัสของฉันอยู่ด้านล่าง - โปรดเสนอคำแนะนำเพื่อการปรับปรุง


ในการสร้างรหัสสำหรับพล็อตด้านบน:

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

การจำลองที่สองนั้นยาวนานกว่ามาก ...

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
ดี! คุณคัดค้านการแสดงรหัสหรือไม่
Elvis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.