이 문제에는 움직이는 부분이 많으므로 시뮬레이션에 적합합니다.
우선 Elvis가 의견에서 언급했듯이 Stacey는 약 16 시간 약속을 잡는 것처럼 보입니다. 각 약속은 약 30 분입니다. 그러나 약속이 지연되기 시작하면 상황이 나중에 바뀌기 시작합니다. 따라서 Stacey가 30 분 남았을 때만 약속을 시작하려는 경우 (머리를 바닥에서 쓸어 내기 위해 eh, 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))