Visual Basic Formulas de Erlang
Visual Basic Formulas de Erlang
rm rk 1 + m! k! 1 r/k m=0
k1
donde r = / = k. Nota esta se conoce como la frmula Erlang-C. o Respuesta: La probabilidad de que en estado estable todos los operarios estn ocupados es: e
(1)
para 0 i k 1
1
(2) (3)
rk 1 rm + m! k! 1 r/k m=0
C(k, r) = 1 p0 1 +
k1
= 1 p0
rm m! m=0
C(k, r) = 1
rm rk 1 + m! k! 1 r/k m=0
k1
b. Llamaremos Wq la espera t pica de un cliente antes de ser atendido si encuentra el sistema en estado estable. La distribucin de el nmero de personas que encuentra enfrente un arribo al llegar al sistema o u es igual a la distribucin de estado estable. esto se conoce como PASTA (Poisson arrivals see time o averages). 1
Demuestre que P (Wq > 0) = C(k, r) Respuesta: La probabilidad de que un cliente tenga que esperar es la probabilidad de que cuando llegue al sistema no encuentre servidores disponibles para ser atendido. De acuerdo con la propiedad de pasta esto es igual a la probabilidad en estado estable todos los servidores estn ocupados, es decir C(k, r). e c. Demuestre que si hay espera esta se distribuye exponencialmente, es decir P (Wq < t|Wq > 0) = 1 e(k)t Respuesta: Primero se dene: t>0
Esta distribucin se obtiene condicionando en el nmero de personas que encuentra un arribo en la o u cola as :
H(t) =
i=0
(5)
que se calcula como sigue qi = = = = = P (i en cola, Wq > 0) P (Wq > 0) P (i + k en el sistema) P (Wq > 0) pi+k i = 0, 1, 2... C(k, r) k k k+i 1 p0 C(k, r) k! 1 p k i . C(k, r)
(6)
En la pgina 270 del libro de Kulkarni azul se tiene la demostracin del siguiente reslutado: a o pk 1 pk = (1 )C(k, r),
C(k, r) =
(7)
qi = (1 )i
i = 0, 1, . . .
Para la componente 2 de (5) razonamos de la siguiente manera. Si hay i en cola cuando llega un cliente entonces el tiempo en cola para este arribo es la suma de (i + 1) esperas, donde cada una de estas esperas es el m nimo de k exponenciales independientes de parmetro , es decir una exponencial de a parmetro k. L espera en cola condicional es, por lo tanto la suma de (i + 1) exponenciales que como a se sabe es Erlang, por lo tanto P (Wq t|Wq > 0, i en cola) = Fi+1 (t; k) donde Fr (t; ) es la fda de una Erlang de parmetros r y es decir a
t
Fr (t; ) =
0
r xr1 ex dx (r 1)!)
H(t) =
i=0
Fi+1 (t; k) qi .
h(t) =
i=0
(k)i+1 ti ekt (1 )i i!
=e
kt
(1 )k
i=0
(k)i i!
Esta es la fdp de una exponencial de parmetro k(1 ) y por lo tanto su fda correspondiente viene a dada por H(t) = 1 ek(1)t .
d. Halle EWq . EWq = P (Wq > 0)E(Wq |Wq > 0) = C(k, r) Respuesta: Del numeral b se sabe que: 1 1 k 1 r/k
(8)
De otro lado se sabe del numeral c se sabe que si hay espera esta se distribuye exponencialmente, entonces: 1 , (k )
(9)
(10)
reemplazando (8) y (10) en la ecuacin del enunciado se tiene que: o EWq = C(k, r) e. Halle P (Wq t). Respuesta: P (Wq t) = 1 C(k, r)ek(1)t Respuesta: P (Wq t) = P (Wq t|Wq = 0)P (Wq = 0) + P (Wq t|Wq > 0)P (Wq > 0) = 1(1 C(k, r)) + (1 ek(1)t )C(k, r) = 1 C(k, r)ek(1) . t>0 1 1 k 1 r/k
f. Cierto call center abre 9 horas al d de 8 a 5 pm y las tasa de llamadas en cada hora se pueden ver a en la siguiente tabla. Horas 8:00 - 9:00 9:00 - 10:00 10:00 -11:00 11:00 - 12:00 12:00 - 1:00 1:00 - 2:00 2:00 - 3:00 3:00 - 4:00 4:00 - 5:00 Tasa 40 50 70 110 120 30 20 10 10
Se ha observado que la duracin de las llamadas se puede ajustar con una distribucin exponencial o o de media 3 minutos. Se quiere tener un nivel de servicio que garantice que el 95 % de los clientes esperen menos de 20 segundos a ser atendidos. Determine el m nimo nmero de agentes que se deben u programar en cada hora para satisfacer este requerimiento de servicio. Suponga que en cada hora la tasa es constante a lo largo de la hora y que se logra estado estable de modo que pueda usar las ecuaciones anteriores. Ayuda: comience por determinar para cada intervalo el nmero de agentes necesarios para u que el sistema sea estable, y aumente esta cantidad hasta lograr el nivel de servicio requerido. Respuesta: Comenzamos por elaborar un pequeo cdigo en VBA que implementa la frmula Erlang-C. Rerase al n o o e apndice ?? para verlo, en la funcin ErlangC_PWait. En esta funcin la expresin With WorksheetFunction e o o o permite usar las funciones de excel con solo poner un punto. F jese que la frmula se calcula en trminos o e
rm rk 1 + m! k! 1 r/k m=0
k1
rk 1 k! 1r/k
(1 ) + F (k; r) F (k 1; r) = F (k; r) F (k 1; r)
r k er k! k1 r m er m=0 m!
r k er k!
donde F (n; r) es la fda de la distribucin Poisson con media r evaluada en n. En el cdigo de vba o o se usa la funcin PoissonCDF para calcular la acumulativa. Dicha funcin invoca la funcin de Excel, o o o pero si falla se aproxima usando la normal. Esto ocurre para parmetros r grandes pues expr se hace a muy pequeo, pero es precisamente para esos valores para los cuales n F (x; r) x + 0,5 r r
. El 0,5 viene del hecho que estamos aproximando una distribucin discreta con una continua. Usando o esta funcin se calcula la Tabla 1 (Ud encontrar en Sicua la hoja de Excel con los clculos). o a a Horas 8:00 - 9:00 9:00 - 10:00 10:00 -11:00 11:00 - 12:00 12:00 - 1:00 1:00 - 2:00 2:00 - 3:00 3:00 - 4:00 4:00 - 5:00 40 50 70 110 120 30 20 10 10 20 20 20 20 20 20 20 20 20 r 2.00 2.50 3.50 5.50 6.00 1.50 1.00 0.50 0.50 k-estab 3 3 4 6 7 2 2 1 1 k 5 6 8 10 11 5 4 3 3 0.400 0.417 0.438 0.550 0.545 0.300 0.250 0.167 0.167 C(k, r) 0.0597 0.0474 0.0299 0.0628 0.0492 0.0201 0.0204 0.0152 0.0152 P (W q <= 20s) 0.9572 0.9678 0.9819 0.9619 0.9718 0.9863 0.9854 0.9885 0.9885
Tabla 1: Resultados para el modelo Erlang-C La columna k-estab contiene el nmero de agentes necesarios para que el sistema sea estable. Increu mentamos k a partir de dichos valores hasta lograr el nivel de servicio deseado (95 %). Esto no es dif cil de hacer a mano, pero esta implementado en ErlangC_minAgentes en el Apndice ??. e g. Los agentes son estudiantes que trabajan turnos de 4 horas contiguas. Determine el nmero de estuu diantes que debe contratar y la asignacin de horas. Use cualquier software de programacin lineal o o entera, o el solver de Excel. Respuesta: Construiremos un MIP con los siguientes parmetros a T = Nmero de peridos u o L = Duracin de los turnos (en nuestro caso 4) o Rt = Agentes requeridos en periodo t Llamaremos xt el nmero de agentes que comienzan su turno en el per u odo t. Dichos agentes estarn a activos en t, t + 1, . . . , t + L 1. El ultimo per odo en el cul pueden comenzar es en t L + 1. La a funcin objetivo es minimizar el nmero de agentes contratados: o u
T L1
xt
t=1
Debemos garantizar que el nmero de agentes en el periodo t sea mayor a los requeridos Rt . En un u periodo t pico t estn trabajando aquellos contratados en ese periodo ms los contratados en t 1, a a t 2 t 3 y t 4. Es decir, el nmero de agentes en el periodo t se puede escribir como u
Mt
xs ,
s=mt
+ x4 + x4 + x4 x4
+ x5 + x5 + x5 x5
+ x6 + x6 + x6 x6
Minimizar
z=
t=1 Mt
xt xs Rt
sujeto a
s=mt
t = 1, . . . , T
Requerimento de agentes
Archivo callcenter.mos
( ! ****************************************************** f i l e c a l l c e n t e r . mos ******************************************************* ! ) model C a l l c e n t e r uses mmxprs
parameters i n p u t F i l e= . / c a l l c e n t e r . dat o u t p u t F i l e = . / c a l l c e n t e r . t x t endparameters forward function g e t P r o b l e m S t a t u s ( s t a t u s : integer ) : s t r i n g declarations ! Conjuntos PERIODOS : set of integer ! Rango de p e r i o d o s de tiempo ! Par metros a MinAgentes : array (PERIODOS) of integer ! Minimo numero de a g e n t e s L : integer ! Numero de t u r n o s c o n t i g u o s ! Var d e c i s i n o s t a r t s : array (PERIODOS) of mpvar ! a g e n t e s que comienzan en t
enddeclarations
i n i t i a l i z a t i o n s from i n p u t F i l e PERIODOS MinAgentes L endi n i t i a l i z a t i o n s ! Numero de p e r i o d o s T := g e t s i z e (PERIODOS ) ; ! Creamos l a v a r i a b l e s l o para l o s p r i m e r o s TL p e r i o d o s o ! p ue s no pueden comenzar ms t a r d e a f o r a l l ( t i n PERIODOS | t <= T L + 1 ) do create ( starts ( t ) ) ; ! starts ( t ) is integer ; enddo ! O b j e t i v o : minimizar numero de a g e n t e s TotAgentes := sum( t i n PERIODOS | t <= T L + 1 ) s t a r t s ( t ) ! Minimos deben s e r s a t i s f e c h o s : f o r a l l ( t i n PERIODOS) do mn := m a x l i s t ( 1 , tL+1); mx := m i n l i s t ( t , TL+1) r e q ( t ):= sum( s i n mn . . mx) s t a r t s ( s ) >= MinAgentes ( t ) enddo
! R e s u e l v a e l problema minimize ( TotAgentes ) ! Genere e l r e p o r t e i f ( o u t p u t F i l e <> ) then f o p e n ( o u t p u t F i l e ,F OUTPUT) endi f writeln ( S t a t u s : , g e t P r o b l e m S t a t u s ( g e t p r o b s t a t ) ) ; writeln ( Numero T o t a l de Agentes : , g e t o b j v a l ) ; writeln ; writeln ( P e r i o d o Comz Tot Req ) f o r a l l ( t i n PERIODOS) do write ( s t r f m t (PERIODOS( t ) , 6 ) ) write ( s t r f m t ( g e t s o l ( s t a r t s ( t ) ) , 8 ) ) write ( s t r f m t ( MinAgentes ( t ) g e t s l a c k ( r e q ( t ) ) , 8 ) ) writeln ( s t r f m t ( g e t s o l ( MinAgentes ( t ) ) , 8 ) ) enddo f c l o s e (F OUTPUT)
! returns function status function g e t P r o b l e m S t a t u s ( s t a t u s : integer ) : s t r i n g case s t a t u s of XPRS OPT : r e t u r n e d := S o l v e d t o o p t i m a l i t y . XPRS UNF : r e t u r n e d := U n f i n i s h e d . XPRS INF : r e t u r n e d := I n f e a s i b l e . XPRS UNB : r e t u r n e d := Unbounded . e l s e r e t u r n e d := Unknown s t a t u s . endcase endfunction endmodel
Archivo callcenter.txt
S t a t u s : S o l v e d to o p t i m a l i t y . Numero T o t a l de Agentes : 19 Periodo 1 2 3 4 5 6 7 8 9 Comz 5 1 2 2 6 3 0 0 0 Tot 5 6 8 10 11 13 11 9 3 Req 5 6 8 10 11 5 4 3 3
Podemos ver que la solucin ptima usar 19 agentes. La columna Comz dice cuntos deben comenzar o o a a por turno, mientras que la columna Tot contiene el nmero disponible en ese turno. u Tambin solucionamos el problema usando el solver de Excel, y encontr una solucin alterna tambin e o o e con 19 agentes. El archivo est disponible en Sicua para consulta. La solucin de excel est en la Tabla a o a 2.
Horas 8:00 - 9:00 9:00 - 10:00 10:00 -11:00 11:00 - 12:00 12:00 - 1:00 1:00 - 2:00 TOTAL NECESARIOS #ope q comz 5 5 2 2 2 3 19 8-9 5 9 - 10 5 5 10 -11 5 5 2 11 - 12 5 5 2 2 12 - 1 5 2 2 2 11 11 1-2 2-3 3-4 4-5
2 2 2 3 9 5
2 2 3 7 4
2 3 5 3
3 3 3
5 5
10 6
12 8
14 10
Tabla 2: Disposicin de agentes ptima encontrada por Excel. o o Aunque las dos soluciones usan el mismo nmero de agentes, vale la pena compararlas en cuanto a la u calidad de servicio que ofrecen para ver cul es preferible. Al ver la Tabla 3 vemos que la de Excel a ofrece niveles de servicio ligeramente superiores. Xpress C(k, r) P (W q <= 20s) 5.970 % 95.722 % 4.744 % 96.784 % 2.989 % 98.187 % 6.279 % 96.192 % 4.922 % 97.176 % 0.000 % 100.000 % 0.000 % 100.000 % 0.000 % 100.000 % 1.515 % 98.852 % 4.308 % 97.330 % Excel P (W q <= 20s) 95.722 % 99.987 % 99.988 % 99.930 % 97.176 % 99.999 % 99.996 % 99.989 % 98.852 % 98.846 %
Horas 8:00 - 9:00 9:00 - 10:00 10:00 -11:00 11:00 - 12:00 12:00 - 1:00 1:00 - 2:00 2:00 - 3:00 3:00 - 4:00 4:00 - 5:00 PROM
40 50 70 110 120 30 20 10 10
20 20 20 20 20 20 20 20 20
k 5 6 8 10 11 13 11 9 3
k 5 10 12 14 11 9 7 5 3
C(k, r) 5.970 % 0.029 % 0.030 % 0.179 % 4.922 % 0.003 % 0.009 % 0.018 % 1.515 % 1.888 %
h. Suponga ahora que los agentes se contratan por 4 horas diarias, pero no necesariamente contiguas, pues puede haber una interrupcin de hasta una hora. Genere un nuevo programa de turnos. o Respuesta: Denimos las siguientes cantidades i = periodos,i {1, . . . , T } j = turnos, j {1, . . . , M } Aij = 1(El turno j cubre el periodo i) Ri = Numero requerido de agentes en periodo i xj = nmero de agentes contratados para el turno j u La matriz A se arma buscando los posibles turnos que satisfacen el requerimiento de la interrupcin. o Nosotros encontramos 21 turnos que se pueden ver en la Tabla 5: El modelo a resolver es el siguiente.
Minimizar
z=
i=1 M
ci xi Aij xj Ri
sujeto a
j=1
i = 1, . . . , T
Requerimiento de agentes
xj Z + A continuacin mostramos la implementacin en Xpress, as como les resultados obtenidos. Podemos o o ver que la solucin usa 14 agentes, es decir una reduccin de 5 agentes respecto a la solucin original. o o o
Archivo callcenter2.mos
( ! ****************************************************** f i l e c a l l c e n t e r 2 . mos En e s t e modelo s e hace e l s c h e d u l i n g usando e l e n f o q u e de s e t c o v e r i n g . Germn Ria o . U n i v e r s i d a d de l o s Andes a n ******************************************************* ! ) model C a l l c e n t e r uses mmxprs
parameters i n p u t F i l e= . / c a l l c e n t e r 2 . dat outputFile = ./ callce nte r2 . txt endparameters forward function g e t P r o b l e m S t a t u s ( s t a t u s : integer ) : s t r i n g declarations ! Conjuntos PERIODOS : set of integer ! Rango de p e r i o d o s de tiempo TURNOS: set of integer ! Par metros a MinAgentes : array (PERIODOS) of integer ! Minimo numero de a g e n t e s A: array (PERIODOS,TURNOS) of integer !A( i , j )=1 s i t u r r n o j c u b r e i Costo : array (TURNOS) of r e a l enddeclarations
i n i t i a l i z a t i o n s from i n p u t F i l e PERIODOS TURNOS MinAgentes A Costo endi n i t i a l i z a t i o n s ! Var de d e c i s i o n declarations a g e n t e s : array (TURNOS) of mpvar ! a g e n t e s que comienzan en t enddeclarations f o r a l l ( j i n TURNOS) a g e n t e s ( j ) i s i n t e g e r ! O b j e t i v o : minimizar C o s t o s TotCosto := sum( j i n TURNOS) Costo ( j ) * a g e n t e s ( j ) ! Minimos deben s e r s a t i s f e c h o s : f o r a l l ( t i n PERIODOS) do r e q ( t ):= sum( j i n TURNOS| A( t , j )=1) a g e n t e s ( j ) >= MinAgentes ( t ) enddo
! R e s u e l v a e l problema minimize ( TotCosto ) ! Genere e l r e p o r t e i f ( o u t p u t F i l e <> ) then f o p e n ( o u t p u t F i l e ,F OUTPUT) endi f writeln ( S t a t u s : , g e t P r o b l e m S t a t u s ( g e t p r o b s t a t ) ) ; writeln ( Costo T o t a l : , g e t o b j v a l ) ; writeln ( Numero T o t a l de Agentes : , sum( j i n TURNOS) g e t s o l ( a g e n t e s ( j ) ) ) ; writeln ; writeln ( P e r i o d o Total Req ) f o r a l l ( t i n PERIODOS) do write ( s t r f m t (PERIODOS( t ) , 6 ) ) write ( s t r f m t ( MinAgentes ( t ) g e t s l a c k ( r e q ( t ) ) , 8 ) ) writeln ( s t r f m t ( g e t s o l ( MinAgentes ( t ) ) , 8 ) ) enddo writeln ; writeln ( Turno Agentes ) ! f o r a l l ( j i n TURNOS| g e t s o l ( a g e n t e s ( j )) >0) do f o r a l l ( j i n TURNOS) do write ( s t r f m t (TURNOS( j ) , 6 ) ) writeln ( s t r f m t ( g e t s o l ( a g e n t e s ( j ) ) , 8 ) ) enddo f c l o s e (F OUTPUT)
! returns function status function g e t P r o b l e m S t a t u s ( s t a t u s : integer ) : s t r i n g case s t a t u s of XPRS OPT : r e t u r n e d := S o l v e d t o o p t i m a l i t y . XPRS UNF : r e t u r n e d := U n f i n i s h e d . XPRS INF : r e t u r n e d := I n f e a s i b l e . XPRS UNB : r e t u r n e d := Unbounded . e l s e r e t u r n e d := Unknown s t a t u s . endcase endfunction endmodel
10
Archivo callcenter2.txt
S t a t u s : S o l v e d to o p t i m a l i t y . Costo T o t a l : 14 Numero T o t a l de Agentes : 14 Periodo 1 2 3 4 5 6 7 8 9 Turno 1 2 7 11 12 13 14 20 21 Total 5 6 8 10 11 5 4 4 3 Agentes 2 2 2 2 1 1 1 2 1 Req 5 6 8 10 11 5 4 3 3
Obtuvimos tambin la solucin usando el Solver de Excel. La solucin encontrada tambin tiene 14 e o o e agentes, pero es ligeramente diferente de la de Xpress, se puede ver en la Tabla 6. Las comparamos ambas y se puede ver la comparacin en la Tabla 4. De nuevo la de Excel es ligeramente superior en o su desempeo. n
Horas 8:00 - 9:00 9:00 - 10:00 10:00 -11:00 11:00 - 12:00 12:00 - 1:00 1:00 - 2:00 2:00 - 3:00 3:00 - 4:00 4:00 - 5:00 PROM
40 50 70 110 120 30 20 10 10
20 20 20 20 20 20 20 20 20
k 5 6 8 10 11 5 4 4 3
Xpress C(k, r) P (W q <= 20s) 5.970 % 95.722 % 4.744 % 96.784 % 2.989 % 98.187 % 6.279 % 96.192 % 4.922 % 97.176 % 2.014 % 98.635 % 2.041 % 98.538 % 0.181 % 99.878 % 1.515 % 98.852 % 4.532 % 97.175 %
k 6 6 8 10 11 5 4 3 3
Excel C(k, r) P (W q <= 20s) 1.869 % 98.802 % 4.744 % 96.784 % 2.989 % 98.187 % 6.279 % 96.192 % 4.922 % 97.176 % 2.014 % 98.635 % 2.041 % 98.538 % 1.515 % 98.852 % 1.639 % 98.758 % 4.207 % 97.418 %
Tabla 4: Comparacin entre la soluciones de Xpress y Excel para el problema con turnos exibles o 11
8:00 - 9:00 9:00 - 10:00 10:00 -11:00 11:00 - 12:00 12:00 - 1:00 1:00 - 2:00 2:00 - 3:00 3:00 - 4:00 4:00 - 5:00 Tabla 5: Posibles turnos con hasta una hora de interrupcin o
1 1 1 1 1 0 0 0 0 0
2 0 1 1 1 1 0 0 0 0
3 0 0 1 1 1 1 0 0 0
4 0 0 0 1 1 1 1 0 0
5 0 0 0 0 1 1 1 1 0
6 0 0 0 0 0 1 1 1 1
7 1 0 1 1 1 0 0 0 0
8 0 1 0 1 1 1 0 0 0
9 0 0 1 0 1 1 1 0 0
10 0 0 0 1 0 1 1 1 0
11 0 0 0 0 1 0 1 1 1
12 1 1 0 1 1 0 0 0 0
13 0 1 1 0 1 1 0 0 0
14 0 0 1 1 0 1 1 0 0
15 0 0 0 1 1 0 1 1 0
16 0 0 0 0 1 1 0 1 1
17 1 1 1 0 1 0 0 0 0
18 0 1 1 1 0 1 0 0 0
19 0 0 1 1 1 0 1 0 0
20 0 0 0 1 1 1 0 1 0
21 0 0 0 0 1 1 1 0 1
12
3 2 2 2 2 2 2 2 2 2 0 0 0 0 3 3 3 3 2 2 2 2 1 1 1 1 4 1 5 6 7 2 8 2 9 10 0 11 3 12 13 14 15 16 17 1 1 1 1 1 18 19 20 21 TOT 14 6 6 8 10 11 5 4 3 3 REQ 5 6 8 10 11 5 4 3 3 .
1 3
2 0
8:00 - 9:00 9:00 - 10:00 10:00 -11:00 11:00 - 12:00 12:00 - 1:00 1:00 - 2:00 2:00 - 3:00 3:00 - 4:00 4:00 - 5:00
3 3 3 3 -
0 0 0 0 -
Tabla 6: Solucin para el problema de turnos exibles encontrada con el solver de excel. Usa un total de 14 agentes o
i. Suponga ahora que se tiene en cuenta la impaciencia de los clientes. En particular suponga que la impaciencia es exponencial con media de 1.5 minutos. Calcule el nmero agentes necesarios para que u el nivel de servicio se mantenga. Respuesta: De acuerdo con la informacin dada = 60/1,5 = 40 por hora. Implementamos las frmulas de o o Mandelbaum y Zeltyn para el modelo M/M/k + G, para el caso exponencial. En el Apndice A se e puede ver el cdigo usado. En la Tabla 7 se puede ver los resultados obtenidos. El nivel de servicio o ac se calcula como P {W < t}, es decir para todos los clientes (contando los que abandonan). Si Ud a usa el calculador Erlang-X disponible en http://www.math.vu.nl/koole/ccmath/ErlangX.php Ud. obtendr resultados ligeramente diferentes, pues all calculan el nivel de servicio como P {V < t}, es a decir usando tiempo virtual. Si el porcentaje de abandonos no es muy alto estas dos cantidades no diferirn mucho. Podemos concluir que al tener en cuenta los abandonos se necesita un agente menos a entre las 10 y las 3 de la tarde, lo cul puede signicar un ahorro. a Lo unico en el cdigo de VBA que amerita mencin es el clculo de la funcin gamma imcompleta o o a o
b
(a, b) =
0
ta1 et dt.
Excel no tiene una funcin para la gamma incompleta, pero tiene la funcin de distribucin gamma o o o
x 1 t/
F (x; , ) =
0
e dt. ()
Es fcil ver que la gamma incompleta se puede calcular como a (a, b) = (a) F (b; a, 1). Excel no tiene (a), pero s GammaLn, que calcula su logaritmo. Horas 8:00 - 9:00 9:00 - 10:00 10:00 -11:00 11:00 - 12:00 12:00 - 1:00 1:00 - 2:00 2:00 - 3:00 3:00 - 4:00 4:00 - 5:00 40 50 70 110 120 30 20 10 10 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 r 2.00 2.50 3.50 5.50 6.00 1.50 1.00 0.50 0.50 k-estab 3 3 4 6 7 2 2 1 1 k 5 6 7 9 10 4 3 3 3 0.400 0.417 0.500 0.611 0.600 0.375 0.333 0.167 0.167 P {wait > 0} 4.9354 % 3.9364 % 6.0290 % 9.5657 % 7.6311 % 6.1677 % 7.5903 % 1.4001 % 1.4001 % P {Abandon} 1.6507 % 1.1877 % 1.7220 % 2.4947 % 1.8536 % 2.3248 % 3.3014 % 0.5843 % 0.5843 % P (W q <= 20s) 97.4084 % 98.0716 % 97.1476 % 95.7534 % 96.8198 % 96.5220 % 95.3912 % 99.1730 % 99.1730 %
Tabla 7: Clculos para el modelo Erlang A a j. Haga un estudio de simulacin para corroborar sus resultados. o Respuesta: Hicimos un modelo en Arena (archivo callcenter.doe) y corrimos optquest (archivo callcenter.opt) variando el nmero de personas en cada hora. La Tabla 9 muestra las mejores soluciones encontradas u por OptQuest. La mejor solucin usa 42 operarios-hora con un TSF de %95,31, mientras que la nuestra o recomendaba 55. En la Tabla 8 se pueden ver algunos de los resultados pertinentes. Nuestra hoja de clculo predice 92,2707 % para la conguracin encontrada por Arena. La razn para la discrepancia a o o es que nuestro anlisis usa ecuaciones de estado estable mientas que la simulacin tiene en cuenta a o que cuando la tasa sube al sistema le toma un tiempo saturarse. Quiere esto decir que los resultados anal ticos deben desecharse? No. Por una lado los usamos de punto de partida para el OptQuest, lo cul ayudo a que la convergencia fuese ms rpido. Pero adems los resultados anal a a a a ticos los obtuvimos rpidamente en una hoja de clculo, mientras que la simulacin requiri mas tiempo para hacer el a a o o modelo y para correr (ya usando software especializado que tiene un costo mayor). 13
Output Espera en Cola en min Numero Promedio en Cola Porcentaje de Abandonos TSF Tabla 8: Resultados de la simulacin o
14 TSF 97.5591 97.079 95.815 95.3691 95.3196 Cap[9] 3 3 3 2 2 Cap[8] 3 1 1 1 1 Cap[7] 3 3 3 3 3 Cap[6] 4 2 2 2 2 Cap[5] 10 10 9 11 9 Cap[4] 9 9 9 9 9 Cap[3] 9 9 10 8 8 Cap[2] 6 6 4 4 5 Cap[1] 5 5 5 3 3 Total 52 48 46 43 42
MinimizeTotal 52 48 46 43 42
Tabla 9: Resultados de la simulacin con Arena + OptQuest. Las cantidades Cap[i] representan el nmero de servidores disponibles en el periodo i. o u Para cada escenario se corren sucientes replicaciones que garanticen intervalos de conanza del 95 % no sean ms anchos que el 2 % de la media (es a decir el intervalo a lo sumo del 4 % de la media)
A.
Cdigo de VBA o
Archivo CallCenters.bas
A t t r i b u t e VB Name = C a l l C e n t e r s Option E x p li c i t UTILITY FUNCTIONS I n c o m p l e t e gamma F u n c t i o n Function gammaInc ( x , y ) With WorksheetFunction gammaInc = . GammaDist ( y , x , 1 , True ) * Exp ( . GammaLn( x ) ) End With End Function F a i l s a f e P o i s s o n CDF Public Function PoissonCDF ( n , mean ) On Error GoTo UseNormal PoissonCDF = WorksheetFunction . P o i s s o n ( n , mean , True ) Exit Function UseNormal : PoissonCDF = WorksheetFunction . NormDist ( n + 0 . 5 , mean , Sqr ( mean ) , True ) End Function ERLANG C FUNCTIONS P(W >0) i n an E r l a n g C Public Function ErlangC PWait ( k , r ) Dim numer , deno With WorksheetFunction numer = PoissonCDF ( k , r ) PoissonCDF ( k 1 , r ) deno = PoissonCDF ( k , r ) ( r / k ) * PoissonCDF ( k 1 , r ) End With ErlangC PWait = numer / deno End Function Telephone s e r v i c e f a c t o r P(W ) <t Public Function ErlangC TSF ( k , r , mu, t ) Dim rho As Double ErlangC TSF = 1# ErlangC PWait ( k , r ) * Exp( (k r ) * mu * t ) End Function Number o f a g e n t s needed f o r TSF Public Function ErlangC minAgents ( r , mu, TSF , t a r g e t T i m e ) Dim k As Integer With WorksheetFunction k = . RoundUp ( r , 0 ) I f k = r Then k = k + 1 While ErlangC TSF ( k , r , mu, t a r g e t T i m e ) < TSF k = k + 1 Wend End With ErlangC minAgents = k End Function ASA= a v e r a g e s p e e d answer = Wating i n Q Public Function ErlangC ASA ( r , mu, k ) Dim rho , Lq , Wq rho = r / k Lq = ErlangC PWait ( k , r ) * rho / ( 1 rho ) Wq = Lq / (mu * rho )
15
ErlangC ASA = Wq End Function ERLANG A FUNCTIONS From Mandelbaum and Z e l t y n Function ErlangA J ( lambda , mu, t h e t a , k ) Dim lambdaOtheta lambdaOtheta = lambda / t h e t a ErlangA J = Exp( lambdaOtheta ) / t h e t a * WorksheetFunction . Power ( lambdaOtheta , k * mu / t h e t a ) * gammaInc ( k * mu / t h e t a , lambdaOtheta ) End Function Function E r l a n g A J t ( lambda , mu, t h e t a , k , t ) Dim lambdaOtheta lambdaOtheta = lambda / t h e t a E r l a n g A J t = Exp( lambdaOtheta ) / t h e t a * WorksheetFunction . Power ( lambdaOtheta , k * mu / t h e t a ) * gammaInc ( k * mu / t h e t a , lambdaOtheta * Exp( t h e t a * t ) ) End Function Function ErlangA JH ( lambda , mu, t h e t a , k , J ) Dim lambdaOtheta lambdaOtheta = lambda / t h e t a ErlangA JH = J / t h e t a Exp( lambdaOtheta ) / t h e t a / t h e t a * WorksheetFunction . Power ( lambdaOtheta , k * mu / t h e t a 1 ) * gammaInc ( k * mu / t h e t a + 1 , lambdaOtheta ) End Function Function ErlangA JHt ( lambda , mu, t h e t a , k , Jt , t ) Dim lambdaOtheta lambdaOtheta = lambda / t h e t a ErlangA JHt = J t / t h e t a Exp( lambdaOtheta ) / t h e t a / t h e t a * WorksheetFunction . Power ( lambdaOtheta , k * mu / t h e t a 1 ) * gammaInc ( k * mu / t h e t a + 1 , lambdaOtheta * Exp( t h e t a * t ) ) End Function Function ErlangA E ( lambda , mu, k ) Dim Ei As Double , muOLambda As Double , i As Integer muOLambda = mu / lambda Ei = 1 E s t e e s E0 For i = 1 To k 1 Ei = 1 + i * muOLambda * Ei Next i ErlangA E = Ei End Function Public Function ErlangA Dim J , E J = ErlangA J ( lambda , E = ErlangA E ( lambda , ErlangA PAbandon = ( 1 End Function PAbandon ( lambda , mu, k , t h e t a ) mu, t h e t a , k ) mu, k ) + ( lambda k * mu) * J ) / (E + lambda * J )
Public Function ErlangA TSF ( lambda , mu, t h e t a , k , time ) Dim J , E , Jt , Gbt J = ErlangA J ( lambda , mu, t h e t a , k ) J t = E r l a n g A J t ( lambda , mu, t h e t a , k , time )
16
E = ErlangA E ( lambda , mu, k ) Gbt = Exp( t h e t a * time ) ErlangA TSF = 1 lambda * Gbt * J t / (E + lambda * J ) End Function Public Function ErlangA PWait ( lambda , mu, t h e t a , k ) Dim J , E J = ErlangA J ( lambda , mu, t h e t a , k ) E = ErlangA E ( lambda , mu, k ) ErlangA PWait = lambda * J / (E + lambda * J ) End Function Number o f a g e n t s needed f o r TSF Public Function ErlangA minAgents ( lambda , mu, t h e t a , TSF , t a r g e t T i m e ) Dim k As Integer With WorksheetFunction k = 1 While ErlangA TSF ( lambda , mu, t h e t a , k , t a r g e t T i m e ) < TSF k = k + 1 Wend End With ErlangA minAgents = k End Function
17