01 · Punto de partida
Mismo arribo, distinto “lleno”
Un bar deja entrar hasta 30 personas; el que llega 31 se va a otro lado. Un estacionamiento con 20 boxes hace circular al 21. Un router con buffer de 50 paquetes tira el 51. La demanda λ era la misma; el cupo K decidió cuántos entraron y cuántos se perdieron.
Esa es la capacidad de la cola: el tope de clientes en el sistema. Infinita es una idealización cómoda (nadie se pierde, pero la espera puede explotar); finita es lo real (espera acotada, pero hay pérdida que hay que medir).
- ¿Cuántos caben en total (K) y cuántos en espera (K − c)?
- ¿Qué hace el que llega con el sistema lleno: se pierde, reintenta, ve la fila y ni entra?
- ¿Cómo mido perdidos, bloqueo Pb y throughput real?
- ¿Cuándo puedo suponer K = ∞ sin mentir?
02 · Definición
Cupo, espera y pérdida
Capacidad K
Tope en el sistema: K = lugares de espera + c servidores. K = 1 con c = 1 es pérdida pura (sin espera).
Bloqueo Pb
Fracción que llega lleno y se pierde: Pb = perdidos/llegadas. Erlang B la predice en M/M/c/c.
K infinita
Nadie se pierde (Pb = 0), pero con ρ > 1 la cola crece sin cota. Útil si el cupo real nunca se toca.
| Cupo | Qué pasa al lleno | Espera | Dónde vive |
|---|---|---|---|
| K = ∞ | Nadie se pierde | Puede explotar (ρ > 1) | Banco grande, teoría M/M/1 y M/M/c base |
| c < K < ∞ | Se pierde el que llega lleno | Acotada por K − c | Bar, parking, buffer de router, call center con espera |
| K = c | Sin espera: libre o perdido | Cero (pérdida pura) | Líneas telefónicas clásicas (Erlang B), boxes sin fila |
03 · El corazón: perder acota, no regala
Bloqueo, throughput y Little efectiva
El simulador pregunta en cada llegada: si N < K admite (a servicio o a espera); si no, cuenta un perdido y sigue. El sistema pierde trabajo pero gana previsibilidad: la espera queda acotada por K − c lugares. El precio se paga en throughput: salen λef, no λ.
- 1Fijar K total.
Incluye a los en servicio: con c = 1 y 3 sillas, K = 4. Confundir sillas con K es el error clásico.
- 2Preguntar al llegar.
si N < K: admitir; si no: perdidos += 1. La llegada que cae justo en un fin entra (la salida libera primero). - 3Contar tres flujos.
Llegadas, admitidas y perdidas. Pb = perdidas/llegadas; λef = admitidas/T.
- 4Auditar con λef.
Little finita:
L ≈ λefW(solo los que entraron viven W). Con λ cruda, la auditoría falla.
- Erlang B (M/M/c/c)
- Pérdida pura sin espera: Pb = ErlangB(c, λ/μ). La referencia para dimensionar líneas con Pb objetivo (1–2%).
- Balking
- Ve la fila y ni entra (bar lleno). El arribo “potencial” supera al que golpea la puerta: λ medida ya trae el descuento.
- Reneging / abandono
- Entra pero se cansa y se va (call center). Parecido a pérdida, pero ocupó espera un rato: Tema 39.
- Reintento (retrial)
- El perdido vuelve a llamar. Ojo: λ efectiva a la puerta supera a λ fresca y Pb se realimenta.
K infinita
Nadie se pierde, todo espera
Ideal para teoría y para cupos que nunca se tocan. Con ρ > 1 miente por exceso: predice colas eternas que en la calle serían fuga.
K finita
Espera acotada, fuga visible
Realista en espacios y buffers. Obliga a reportar Pb y λef: perder 2% puede ser mejor negocio que esperar 40 min.
04 · Ejemplos
Cuatro llenos cotidianos
- 1Bar K = 30.
El 31 ve la fila y se va (balking). Pb alta un sábado no es fracaso: es puerta girando.
- 2Parking K = 20, c = 20.
Pérdida pura: o hay box o seguís de largo. Sin espera posible.
- 3Router buffer 50.
El paquete 51 se descarta (drop-tail). TCP lo reintentará: pérdida con reintento.
- 4Call center 5 agentes + 3 en espera (K = 8).
El noveno escucha “ocupado”. Tres esperan, cinco hablan, el resto pierde.
05 · Representación en Python
El cupo es un if a la entrada
Todo lo demás (reloj, FEL, FIFO) sigue igual. La única línea nueva es preguntar N < K antes de admitir y contar al que se va.
Python en tu navegador. El primero admite o pierde una tanda; el segundo audita Little con λef. Cambiá K y mirá Pb.
# Cupo K=3, c=1, S=2: ¿quién entra y quién se pierde?
K, S = 3, 2.0
fines, perd = [], 0 # fines = salidas programadas (largo = N en sistema)
for t in [0, 0.5, 1.0, 1.5, 5.0]:
fines = [f for f in fines if f > t] # salen los terminados (libera antes)
if len(fines) < K:
ini = max(t, fines[-1]) if fines else t
fines.append(ini + S)
print(f"t={t} N={len(fines)-1} -> entra, sale en {fines[-1]}")
else:
perd += 1
print(f"t={t} N={K} -> PIERDE (perdidos={perd})")
# De conteos a Pb, lambda efectiva y Little
lleg, perd, T = 100, 12, 20.0
Pb = perd / lleg
lam_ef = (lleg - perd) / T
L, W = 2.2, 0.5 # medidos solo con admitidos
print(f"Pb={Pb:.0%} lam_ef={lam_ef:.2f} lam_ef*W={lam_ef*W:.2f} vs L={L}")
06 · Exploración
Laboratorio: achicar K, ver la fuga
Arribos Poisson de tasa λ, servicio fijo S, un servidor y cupo total K (T = 20 min). La escalera es N(t) en el sistema; la línea punteada es K; cada ✕ roja es un cliente perdido. Achicá K y subí λ: la espera se aplasta contra el techo y la fuga se dispara.
El techo que convierte espera en fuga
Pb = perdidas / llegadas · λef = admitidas/T
Achicá K para convertir espera en fuga.
Escalera lima = N(t); techo punteado = K; ✕ rojas = arribos perdidos. Con K = 1 no hay escalón 2: o hay uno en servicio o se pierde.
Preguntas para explorar
- Con λ=0.5, S=2 (ρ=1.0) y K=4, ¿hay perdidos? ¿Y con K=1? ¿Qué cupo “salva” la ρ=1?
- Subí λ a 1.0 con K=4: ¿Pb? ¿Throughput crece igual que λ o se aplasta?
- ¿Por qué Little se audita con λef y no con λ? ¿Qué error da usar λ cruda con Pb=20%?
Ver respuestas sugeridas
- K=4 pierde poco (colchón de 3 en espera absorbe rachas); K=1 pierde ~todo choque (Pb ≈ 40–50%). El colchón, no la media, salva ρ≈1.
- Pb se dispara (30–50%) y λef se aplasta cerca de μ=0.5: el servidor no da más y el resto es fuga.
- Los perdidos no viven W: usar λ cruda infla λW un 1/(1−Pb) (≈25% con Pb=20%). La auditoría solo cierra con λef.
07 · Comprensión
Confusiones frecuentes
«K es el largo de la fila»
K es sistema completo (espera + servicio). Fila de 3 con 1 servidor puede ser K=3 o K=4 según cuentes al que se atiende.
«Con K finita no vale Little»
Vale con λef (admitidos). Falla solo si la auditás con λ cruda que incluye a los que nunca entraron.
«K grande siempre es mejor»
K grande baja Pb pero sube Wq (todos esperan). A veces conviene perder 2% rápido que retener 40 min a todos.
«Pb = 1 − ρ»
No hay fórmula lineal: Pb depende de K, c y variabilidad. Se simula o se usa Erlang; no se resta.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: K con c=1
Un servidor y 3 sillas de espera. ¿K? ¿Cuántos esperan como máximo?
c, sillas = 1, 3
K = sillas + c
print(f"K={K}, esperan hasta {K - c}") # K=4, 3 en espera
Ver solución razonada
K = 4 total; 3 en espera + 1 en servicio. El quinto que llega con N=4 se pierde.
Ejercicio 2: de perdidos a Pb
Llegaron 200, se perdieron 10 en T=10 h. ¿Pb y λef?
lleg, perd, T = 200, 10, 10.0
print(f"Pb={perd/lleg:.0%} lam_ef={(lleg-perd)/T:.1f}/h")
Ver solución
Pb = 5%, λef = 19/h (no 20). El servidor dimensiona por 19, no por 20.
Ejercicio 3: pérdida pura K=c
5 líneas sin espera (M/M/5/5), λ=4/h, μ=1/h. Estimá Pb con Erlang B.
Ver una posible respuesta
import math
a, c = 4.0, 5
num = a**c / math.factorial(c)
den = sum(a**k / math.factorial(k) for k in range(c + 1))
print(f"ErlangB={num/den:.1%}") # ~8%: el laboratorio con K=5 replica el orden
~8% de bloqueo: 8 de cada 100 escuchan ocupado. Para Pb<2% harían falta más líneas (Tema 46).
09 · Síntesis
Ideas para recordar
- K = espera + servicio; lleno ⇒ el que llega se pierde (Pb).
- K = ∞ idealiza (nadie pierde, Wq puede explotar); K finita realista (Wq acotada, fuga visible).
- En el simulador:
si N < K admitir, si no perdidos += 1. - Throughput es λef = λ(1 − Pb); Little finita usa λef.
- Dimensionar K es elegir entre espera y fuga: ni techo bajísimo ni sala infinita.
En el próximo tema juntaremos λ, μ y c en el caso base: los sistemas de un servidor.