Simulación de Eventos Discretos · Tema 27

Capacidad de una cola

Cola finita, infinita y clientes perdidos — cuántos caben, qué pasa al llenarse y cómo contar a los que se van.

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

K

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.

Tres cupos de manual (letra K de Kendall).
CupoQué pasa al llenoEsperaDónde vive
K = ∞Nadie se pierdePuede explotar (ρ > 1)Banco grande, teoría M/M/1 y M/M/c base
c < K < ∞Se pierde el que llega llenoAcotada por K − cBar, parking, buffer de router, call center con espera
K = cSin espera: libre o perdidoCero (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

llega→¿N < K?→entra o se pierde

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 λ.

  1. 1
    Fijar K total.

    Incluye a los en servicio: con c = 1 y 3 sillas, K = 4. Confundir sillas con K es el error clásico.

  2. 2
    Preguntar al llegar.

    si N < K: admitir; si no: perdidos += 1. La llegada que cae justo en un fin entra (la salida libera primero).

  3. 3
    Contar tres flujos.

    Llegadas, admitidas y perdidas. Pb = perdidas/llegadas; λef = admitidas/T.

  4. 4
    Auditar 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

  1. 1
    Bar K = 30.

    El 31 ve la fila y se va (balking). Pb alta un sábado no es fracaso: es puerta girando.

  2. 2
    Parking K = 20, c = 20.

    Pérdida pura: o hay box o seguís de largo. Sin espera posible.

  3. 3
    Router buffer 50.

    El paquete 51 se descarta (drop-tail). TCP lo reintentará: pérdida con reintento.

  4. 4
    Call 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.

EXPERIMENTO 27

El techo que convierte espera en fuga

Pb = perdidas / llegadas · λef = admitidas/T

Los resultados numéricos aparecen debajo.
Llegadas0
Perdidos0
Pb bloqueo0%
Throughput λef0

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

  1. Con λ=0.5, S=2 (ρ=1.0) y K=4, ¿hay perdidos? ¿Y con K=1? ¿Qué cupo “salva” la ρ=1?
  2. Subí λ a 1.0 con K=4: ¿Pb? ¿Throughput crece igual que λ o se aplasta?
  3. ¿Por qué Little se audita con λef y no con λ? ¿Qué error da usar λ cruda con Pb=20%?
Ver respuestas sugeridas
  1. 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.
  2. Pb se dispara (30–50%) y λef se aplasta cerca de μ=0.5: el servidor no da más y el resto es fuga.
  3. 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.