この問題には可動部分が多く、シミュレーションに適しています。
最初に、Elvisがコメントで述べたように、Staceyはそれぞれ16分程度の予約を取る必要があるようです。しかし、アポイントメントが遅れ始めると、物事は次第にシフトし始めることを知っています-それで、ステイシーが残り30分である場合にのみアポイントメントを開始する場合(床から髪を掃くために多くのこと、ええ、ステイシー?)水晶玉を使用して休憩時間のない予定をスケジュールした場合、可能なスロットは16未満になります。
次のシミュレーションでは、アポイントメントの長さの関数としてのコストの曲線を調査できます。もちろん、残りのパラメータもここで役割を果たすことになります-実際、ステイシーはほんの数分間隔で彼女の予定をスケジュールするつもりはありませんが、これは私たちに何が起こっているかについての直感を与えます。
また、Staceyが作業している時間を色としてプロットしました。私はステイシーが最後の約束を7:30以降にスケジュールしないことを決定しましたが、約束が遅れて表示されるか、遅れていることがあります!彼女が家に帰るまでの時間が量子化されていることがわかります。これにより、アポイントメントが長くなると、アポイントメントが1つ少なくなり、遅くなる必要がなくなります。そして、私はそれがここで欠けている要素だと思います-多分45分間隔であなたの予定をスケジュールすることは素晴らしいですが、あなたがそれを40に絞ることができるなら、あなたは追加の予定を得るでしょう。予定の長さが長くなるにつれて増加します)が、ステイシーの待機時間の評価は正しくない可能性があります。
とにかく、楽しい問題!そして、いくつかの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")
2番目のシミュレーションははるかに長くなります...
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))