01 · Punto de partida
La misma velocidad media, dos cajas distintas
Dos cajas atienden 30 clientes por hora en promedio. La primera tarda siempre 2 minutos. La segunda tarda 30 segundos con casi todos y 12 minutos con uno de cada diez (el trámite trabado). ¿Cuál deja fila? La segunda, aunque su μ sea idéntico.
Esa es la lección del proceso de servicio: no alcanza con decir “atiendo tantos por hora”. Hay que decir cuántos (μ) y cuán desparejos (variabilidad de S). La tasa μ abre la capacidad; la variabilidad la desperdicia en esperas.
- ¿Cuánto dura una atención (S) y cuántas salen por hora si nadie espera (μ = 1/E[S])?
- ¿Son todas parecidas o hay enanos y gigantes mezclados?
- ¿Cómo paso de tiempos cronometrados a μ y a su dispersión?
- ¿Qué variabilidad asumo si todavía no medí nada?
02 · Definición
Tiempo, tasa y desparejura
Tiempo S
Lo que el servidor dedica a un cliente, sin contar su espera. Se cronometra de inicio a fin de atención.
Tasa μ
Atenciones por unidad si hay trabajo siempre: μ = 1/E[S]. Con c servidores, capacidad = cμ y ρ = λ/(cμ).
Variabilidad Cs²
Cuánto se despareja S: Cs² = Var(S)/E[S]². 0 = clones, 1 = exponencial, >1 = enanos + gigantes.
| Proceso | Cómo son los S | Cs² | Cuándo usarlo |
|---|---|---|---|
| D determinista | Todos iguales: S = 1/μ | 0 | Cajero automático, lavado de 3 min, pieza robotizada |
| M markoviano | Exponenciales: S ~ Exp(μ) | 1 | Caja de banco, request web típico (defecto) |
| Ek Erlang | Suma de k etapas Exp(kμ) | 1/k | Trámite en k ventanillas parecidas, checklists |
| G general / mixto | Cualquiera: lognormal, mezcla, lotes lentos | ≠1 | Soporte (90% rápido + 10% trabado), cirugías, builds |
03 · El corazón: el gigante bloquea
Por qué la varianza de S duele tanto
Cuando un cliente entra a servicio, el simulador sortea su S y agenda su salida en t + S. Si S sale gigante, todos los que esperan pagan ese gigante: es el bloqueo de cabeza de línea. La fórmula de Pollaczek-Khinchine lo resume para M/G/1: Wq crece con (1 + Cs²). Pasar de D (0) a M (1) duplica Wq; una mezcla con gigantes la multiplica.
- 1Cronometrar solo atención.
De “empiezo a atenderte” a “terminé”. La espera en cola (Wq) no es S: mezclarlas infla μ.
- 2Estimar μ y Cs².
μ̂ = N/ΣS (inversa de la media). Cs² = varianza/media². Con [2,2,2] Cs²=0; con [0.5,0.5,12] Cs²≫1.
- 3Sortear el fin.
Con M:
S = -ln(1-U)/μ. Con D:S = 1/μ. Con mezcla: primero el tipo (90/10), luego su Exp. - 4Liberar o encadenar.
En
t+Sel servidor queda libre o toma al siguiente sin pausa. Ese encadenado propaga el atraso del gigante.
- Erlang-k
- Suma de k exponenciales de tasa kμ: media 1/μ pero Cs² = 1/k. Más etapas ⇒ más parejo. k=1 es M, k→∞ es D.
- Sin memoria (solo M)
- Si lleva 5 min atendiendo, lo que falta sigue siendo Exp(μ). Con D o con gigantes no: lo que queda depende de lo que va.
- Mezcla / hiperexponencial
- Con prob. p, S rápido; con 1−p, S lento. Misma media que M pero Cs² > 1: el laboratorio muestra al gigante pintado.
- ρ manda la estabilidad
- ρ = λ/(cμ). Si E[S] sube, μ baja y ρ se acerca a 1: la misma λ que andaba ahora avalancha.
Servicio parejo
Rinde lo que promete
Todos los bloques miden parecido (D, Erlang-k alto). El makespan es predecible y la espera solo nace de λ.
Servicio desparejo
Un gigante paga todo
Enanos rápidos + un trabado ocasional (G). Misma μ, pero cada gigante deja una tanda esperando detrás.
04 · Ejemplos
La misma μ, tres mostradores
- 1Cajero automático (D).
S = 1 min clavado ⇒ μ = 60/h, Cs² = 0. Seis clientes seguidos tardan 6 min exactos, sin sorpresas.
- 2Caja de banco (M).
S ~ Exp con media 2 min ⇒ μ = 30/h, Cs² = 1. Hay de 20 segundos y de 7 minutos: el makespan de 6 ronda 12 ± √.
- 3Soporte con trabados (G).
90% en 1 min + 10% en 11 min ⇒ media 2, μ = 30/h, Cs² ≫ 1. Casi siempre vuela, pero cuando cae el de 11, la fila explota.
| Tiempos medidos S (min) | Media | μ̂ | Lectura |
|---|---|---|---|
| 2, 2, 2, 2 | 2.0 | 30/h | D: clones |
| 0.4, 3.1, 0.9, 3.6 | 2.0 | 30/h | M: pinta exponencial |
| 0.5, 0.5, 0.5, 6.5 | 2.0 | 30/h | G: tres enanos + un gigante |
05 · Representación en Python
De cronometrajes a μ, de μ a futuros
Medir es promediar S e invertir; simular es sortear S. Con random.expovariate(μ) generás M; con una constante, D; con una moneda previa, mezcla G.
Python en tu navegador. El primero estima μ y Cs² desde tiempos; el segundo genera la tanda que alimenta los fines de servicio. Cambiá la mezcla y mirá al gigante.
# Estimar mu y Cs2 desde tiempos de atención S (min)
S = [0.5, 0.5, 0.5, 6.5]
media = sum(S) / len(S)
var = sum((x - media) ** 2 for x in S) / len(S)
print(f"E[S]={media:.2f} mu={1/media:.2f}/min Cs2={var/media**2:.2f}")
# Generar 6 servicios: M puro vs mezcla 90/10 con misma media 2
import random
random.seed(24)
mu = 0.5 # media 2 min
print("M:", [round(random.expovariate(mu), 2) for _ in range(6)])
rap, lento = 1/0.9, 1/0.1 # medias 1.11 y 10 -> mezcla media 2
mez = [(random.expovariate(1/rap) if random.random() < 0.9 else random.expovariate(1/lento)) for _ in range(6)]
print("G:", [round(x, 2) for x in mez])
06 · Exploración
Laboratorio: misma μ, distinto S
Un servidor atiende N trabajos seguidos (cola inicial, sin llegadas nuevas) con S medio fijo. Con Regular todos miden igual; con Exponencial se dispersan; con Mezcla hay enanos y un gigante ocasional (pintado de naranja). La barra inferior es el makespan: misma media, pero el gigante se come la línea.
μ manda el promedio, Cs² manda el bloqueo
μ̂ = N/ΣS · makespan = ΣS
Mueve el régimen para cazar al gigante.
Una sola fila = el servidor; cada bloque = un trabajo con su S. Naranja = el gigante (S máximo). Todos los regímenes comparten el mismo S medio pedido.
Preguntas para explorar
- Con N=6 y S medio 3, ¿makespan en Regular? ¿Y en Exponencial (aprox.)? ¿Por qué rondan lo mismo?
- En Regular, ¿cuánto pesa el máximo sobre el makespan? ¿Y en Mezcla cuando aparece el gigante?
- Si λ = 0.25/min y S medio = 3 (μ ≈ 0.33), ¿ρ con c=1? ¿Y si el gigante duplica E[S] un rato?
Ver respuestas sugeridas
- Regular: 18 exactos (6×3); Exponencial: ~18 ± dispersión (misma media, suma parecida). μ manda el total medio.
- Regular: 3/18 ≈ 17% (todos iguales). Mezcla: el gigante puede pesar 30–50%: un solo S traba a los 5 que siguen.
- ρ = 0.25/0.33 ≈ 0.75 (estable). Si E[S] se duplica a 6, μ cae a 0.167 y ρ ≈ 1.5: avalancha transitoria hasta que pasa el gigante.
07 · Comprensión
Confusiones frecuentes
«μ es qué tan rápido atiendo ahora»
μ es tasa media sostenida (1/E[S]), no velocidad instantánea. Podés atender rapidísimo 5 seguidos y trabarte 10 min en el sexto: μ promedia ambos.
«Promedio los 1/S de cada uno para sacar μ»
Mal: μ = N/ΣS = 1/media(S). Promediar inversos sobrepondera a los rapidísimos y te inventa capacidad que no tenés.
«S incluye la espera en cola»
No: S es solo atención. Si medís “llegó → se fue” obtenés W = Wq + S y calculás una μ falsamente lenta.
«Más μ siempre compensa cualquier variabilidad»
Subir μ ayuda, pero con Cs² alto necesitás mucho más margen (ρ bajo) para la misma Wq. A veces conviene separar la fila de gigantes (caja rápida).
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: estimar μ
Cronometraste S = [2, 1, 3, 2] min. ¿E[S] y μ por hora?
S = [2, 1, 3, 2]
media = sum(S) / len(S)
print(f"E[S]={media} min, mu={60/media:.1f}/h")
Ver solución razonada
E[S] = 2 min ⇒ μ = 0.5/min = 30/h. Con c=2, capacidad 60/h: una λ=45/h da ρ=0.75.
Ejercicio 2: sortear un fin de servicio
Son las t=10 y μ=0.5/min (M). ¿Cuándo termina el que empieza ahora? Compará con D.
import random
random.seed(2)
mu, t = 0.5, 10.0
print("M termina:", round(t + random.expovariate(mu), 2), "vs D:", t + 1/mu)
Ver solución
M puede dar 10.6 o 14.3 (azar); D siempre 12.0. Esa es la agenda que el FEL recibe en cada inicio.
Ejercicio 3: ρ decide con S
λ=0.25/min, S medio 3 (c=1) y luego S medio 5: ¿estable?
Ver una posible respuesta
lam = 0.25
for E in [3, 5]:
print(f"E[S]={E} rho={lam/(1/E):.2f}")
E=3 ⇒ ρ=0.75 estable; E=5 ⇒ ρ=1.25 avalancha. El mismo arribo, otro servicio: ρ decide.
09 · Síntesis
Ideas para recordar
- Servicio = tiempos S; μ = 1/E[S] manda la capacidad, Cs² manda el bloqueo.
- D (0), Erlang (1/k), M (1), G (>1): misma μ, esperas muy distintas (Wq ∝ 1+Cs²).
- En el simulador: al ocupar, sortear S y agendar fin en
t + S. - En Python:
expovariate(μ)para M, constante para D, moneda + Exp para mezcla. - Medí S sin Wq y reportá (μ, Cs²): μ solo no explica la fila.
En el próximo tema pondremos orden en la espera: la disciplina de la cola.