มีชิ้นส่วนที่เคลื่อนไหวจำนวนมากในปัญหานี้ซึ่งทำให้สุกสำหรับการจำลอง
ก่อนอื่นตามที่เอลวิสพูดถึงในความคิดเห็นดูเหมือนว่า 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))