Simulación de Eventos Discretos · Tema 37

Ley de Little

L = λW y su potencia para validar simulaciones — la auditora universal que no perdona áreas ni vidas mal contadas.

01 · Punto de partida

Dos medidas, la tercera de regalo (o la alarma)

Mediste L = 2.0 (área) y W = 4 min (vidas) con λ = 0.5/min: λW = 2.0 cierra y dormís tranquilo. Te da L = 2.0 con λW = 2.6: algo está mal —área mal integrada, vidas truncadas, λ cruda con pérdidas o T cortísimo. Esa es la Ley de Little: no predice nada y audita todo.

Vale para M/M/1, M/G/c, prioridades y redes, con supuestos mínimos. Por eso es el chequeo que abre cada validación del curso.

  • ¿Qué iguala L = λW y qué su gemela Lq = λWq?
  • ¿Qué λ, qué W y qué T exige la auditoría?
  • ¿Cómo diagnostico un error del 30%?
  • ¿Dónde más aparece (hilos = throughput × latencia)?

02 · Definición

Enunciado, gemela y condiciones

L=λW

Sistema

Nivel medio = tasa × vida media. Área bajo N(t) igual a suma de vidas: la misma moneda contada de dos formas.

Lq

Cola

Lq = λWq con la misma λ: área en cola contra vidas en cola. Doble auditoría cruzada.

✓

Condiciones

Régimen (ρ < 1 o ventana estable), conservación (sin fuga no contada) y T largo con warmup.

Little en números: tres sistemas, la misma cuenta.
Sistemaλ × WLLectura
Banco (λ=20/h, W=6 min)20/60 × 6 = 2.02.0Cierra: medidas consistentes
Web (λ=100/s, W=0.05 s)5.0 workers5.0Concurrencia = throughput × latencia
Bar con fuga (λ=20, λef=19, W=0.5 h)19 × 0.5 = 9.59.5Solo cierra con λef

03 · El corazón: el área son las vidas

La misma moneda, dos conteos

área N(t)=Σ vidas→/T = (N/T)·media

Cada cliente aporta su vida al área total: el área bajo N(t) es la suma de vidas. Dividir por T da L a la izquierda y (llegadas/T) × vida media a la derecha. Sin distribuciones, sin Markov, sin FIFO: contabilidad, no probabilidad.

  1. 1
    Medir L por área.

    Integrar N(t) en T con warmup. Solo admitidos ocupan área: los perdidos no existen.

  2. 2
    Medir W por vidas.

    fin − arr de completados. Con T corto faltan las vidas largas: alargar T o sesga.

  3. 3
    Usar λ de admitidos.

    λef = admitidas/T. Con K finita o abandono, λ cruda infla el producto.

  4. 4
    Comparar y diagnosticar.

    Error <5% pasa; 5–15% sospecha (T, warmup); >15% bug (área, ceros, unidades).

Little por clase
Li = λiWi por prioridad o tipo: audita cada fila por separado (VIP y común cierran cada una).
Little por tramo
Vale en cada caja negra estable: en cola, en servicio (a = λE[S]) y en red completa. Tres auditorías por el precio de una.
Concurrencia
Workers = throughput × latencia: el “dimensionador” de sistemas. 100 req/s × 0.05 s = 5 workers ocupados.
Horizonte y warmup
Con T chico o arranque vacío, L y W miran ventanas distintas (vidas que cruzan el borde). Alargar T y descartar inicio.

Little

Audita siempre

Vale en G/G/c con prioridades si hay régimen y conservación. No dice cuánto vale L: dice si tus L y W son coherentes.

Erlang / PK

Predice a veces

Dicen el valor, pero solo donde valen sus supuestos. Little los audita a ellos también.

04 · Ejemplos

Cuatro auditorías de rutina

  1. 1
    Banco.

    L = 2.0, λ = 1/3/min, W = 6: 0.333 × 6 = 2.0 ✓. Si tu sim da L = 2.4, a depurar.

  2. 2
    Web.

    λ = 100/s, W = 0.05 s ⇒ L = 5 workers: si medís 8, la latencia real es mayor (o hay reintentos).

  3. 3
    Call center con fuga.

    L = 9.5 con λ = 20 y Pb = 5%: cierra con λef = 19, no con 20.

  4. 4
    Soporte por clases.

    VIP: L1 = 0.2 = λ1W1; común: L2 = 3.0 = λ2W2. Cada clase cierra sola.

05 · Representación en Python

little() que audita corridas

Una función de tres líneas que usás al final de cada simulación del curso.

Python en tu navegador. El primero audita un trío; el segundo audita tu tanda de vidas + área. Exigí <5%.

# Auditor Little universal
def little(L, lam, W):
    err = abs(L - lam*W) / L * 100 if L else 0
    return err, "PASA" if err < 5 else ("MIRAR" if err < 15 else "BUG")

print(little(2.0, 1/3, 6.0))   # (0.0, 'PASA')
print(little(2.0, 0.5, 5.2))   # error 30%: BUG
# Auditar tanda: área L contra vidas W (admitidos, T=20)
L, lam = 2.2, 0.5
vidas = [4.0, 5.0, 3.5, 4.5]  # fin-arr de completados
W = sum(vidas)/len(vidas)
print(little(L, lam, W))

06 · Exploración

Laboratorio: la auditora contra el horizonte

Simulamos M/M/1 con c = 1 (semilla fija 37) y medimos L por área contra λW por vidas de completados. Movè el horizonte T: con T = 15 el error es grande (vidas truncadas, arranque); con T = 200 se derrite. Las barras deben empatar: si no, la medición —no Little— falla.

EXPERIMENTO 37

L contra λW: que empaten

error = |L − λW| / L · c=1

Los resultados numéricos aparecen debajo.
L (área/T)0
λW (vidas/T)0
Error Little0%
Completados N0

Alargá T para derretir el error.

Barras lima (L) y teal (λW): gemelas en régimen con T largo, separadas con T corto o ρ alta. El % es el veredicto.

Preguntas para explorar

  1. Con ρ=0.5 y T=150: ¿error? ¿Y con T=15?
  2. Con ρ=0.875 y T=50: ¿error? ¿Por qué T=50 no alcanza ahí?
  3. ¿Qué tres remedios aplicarías ante un error del 25% en régimen?
Ver respuestas sugeridas
  1. T=150: ~1–3% (pasa); T=15: ~10–20% (mirá): pocas vidas y arranque pesan.
  2. ~10–20%: con ρ alta las vidas largas no caben en T=50 y faltan del promedio (truncamiento).
  3. Alargar T, descartar warmup y usar λ de admitidos con vidas de completados bien cerradas (o Lq = λWq).

07 · Comprensión

Confusiones frecuentes

«Little predice L con solo λ»

No: relaciona tres, no crea dos de uno. Con solo λ necesitás W (medida o fórmula) para hallar L.

«Vale con λ de puerta aunque haya fuga»

Con pérdidas se usa λef (admitidas/T): los perdidos no aportan área ni vida. Con λ cruda el error es Pb/(1−Pb).

«Con T=12 debe dar exacto»

Es ley de largo plazo: con T corto hay borde (vidas que cruzan) y arranque. Exactitud pide T largo + warmup.

«Solo vale en M/M/1»

Vale en G/G/c con prioridades y redes, con conservación y régimen. M/M/1 es donde además hay fórmulas del valor.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: auditar el banco

L=2.0, λ=1/3/min, W=6.0. ¿Pasa? ¿Y con W=7.8?

# Pasa con 6.0 (0%); con 7.8 el error es 30%: BUG (vidas o área)
for W in [6.0, 7.8]:
    print(W, (abs(2.0 - (1/3)*W)/2.0*100))
Ver solución razonada

0% pasa; 30% no cierra: o el área cuenta de más (N mal) o las vidas están infladas (S contado doble).

Ejercicio 2: workers por Little

λ=1000/s, latencia W=0.2 s. ¿Workers ocupados? ¿Y si W sube a 0.5?

for W in [0.2, 0.5]:
    print(f"W={W} -> L={1000*W:.0f} workers")
Ver solución

200 y 500: Little dimensiona concurrencia sin simular. Cada ms de latencia se paga en hilos.

Ejercicio 3: diagnosticar 25%

L=2.5, λ=0.5, W=6.25 (error 25%). Nombrá 3 causas y cómo aislarlas.

Ver una posible respuesta
# 1) T corto -> alargar T y ver si el error cae. 2) Warmup -> descartar inicio.
# 3) Fuga con lam cruda -> usar lam_ef. 4) Vidas truncadas -> solo completados + T largo.
print("Aislar de a una: T, warmup, lam_ef, cierre de vidas")

El orden es T → warmup → λef → cierre: lo barato primero, el bug al final.

09 · Síntesis

Ideas para recordar

  • L = λW y Lq = λWq: área contra vidas, misma moneda.
  • Audita con error %: <5% pasa, >15% se depura.
  • Usá λef, T largo, warmup y vidas de completados.
  • Vale en casi todo lo estable: Erlang predice, Little verifica.
  • Workers = throughput × latencia: Little dimensiona concurrencia.

En el próximo tema cerraremos el círculo simulando: simulación de una cola completa en Python.