Hay muchas partes móviles en este problema, lo que lo hace idóneo para la simulación.
En primer lugar, como mencionó Elvis en los comentarios, parece que Stacey debería tomar unas 16 citas, ya que cada una es de aproximadamente media hora. Pero ya se sabe que a medida que las citas empiezan a retrasarse, las cosas empiezan a desplazarse cada vez más tarde - así que si Stacey sólo va a empezar una cita si le queda media hora (tanto barrer el pelo del suelo, ¿eh, Stacey?) entonces vamos a tener menos de 16 huecos posibles, si utilizamos una bola de cristal para programar citas sin tiempo de descanso.
En la siguiente simulación, podemos investigar la curva de coste en función de la duración de la cita. Por supuesto, el resto de los parámetros también acabarán jugando un papel aquí - y en la realidad, Stacey no va a programar sus citas con minutos fraccionarios de diferencia, pero esto nos da alguna intuición sobre lo que está pasando.
También he trazado la hora a la que Stacey tiene que estar en el trabajo como el color. Decidí que Stacey nunca programaría su última cita después de las 7:30, pero a veces la cita llega tarde, ¡o hay un retraso! Se puede ver que la hora a la que se va a casa está cuantificada, de modo que a medida que las citas se alargan, se tiene una cita menos y entonces no se tiene que trabajar hasta tan tarde. Y creo que ese es un elemento que falta aquí: tal vez programar sus citas con 45 minutos de diferencia es genial, pero obtendrá una cita extra si puede apretarla a 40. Ese coste está incorporado por la espera de Stacey (por eso el coste sube a medida que aumenta la duración de la cita), pero tu valoración del tiempo de espera de Stacey podría no ser correcta.
De todos modos, ¡un problema divertido! Y una buena manera de aprender algunas bondades de ggplot y recordar que mi sintaxis de R es súper inestable. :)
Mi código está abajo - por favor, siéntase libre de ofrecer sugerencias para mejorar.
Para generar el código de la parcela superior:
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")
La segunda simulación es mucho más larga...
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))
2 votos
Una breve búsqueda en Google dio como resultado esta nota .
0 votos
Véase el "cuarto método" en Marc Sage, Teorema de Cayley-Hamilton: cuatro pruebas .