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
Sistema
Nivel medio = tasa × vida media. Área bajo N(t) igual a suma de vidas: la misma moneda contada de dos formas.
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.
| Sistema | λ × W | L | Lectura |
|---|---|---|---|
| Banco (λ=20/h, W=6 min) | 20/60 × 6 = 2.0 | 2.0 | Cierra: medidas consistentes |
| Web (λ=100/s, W=0.05 s) | 5.0 workers | 5.0 | Concurrencia = throughput × latencia |
| Bar con fuga (λ=20, λef=19, W=0.5 h) | 19 × 0.5 = 9.5 | 9.5 | Solo cierra con λef |
03 · El corazón: el área son las vidas
La misma moneda, dos conteos
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.
- 1Medir L por área.
Integrar N(t) en T con warmup. Solo admitidos ocupan área: los perdidos no existen.
- 2Medir W por vidas.
fin − arr de completados. Con T corto faltan las vidas largas: alargar T o sesga.
- 3Usar λ de admitidos.
λef = admitidas/T. Con K finita o abandono, λ cruda infla el producto.
- 4Comparar 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
- 1Banco.
L = 2.0, λ = 1/3/min, W = 6: 0.333 × 6 = 2.0 ✓. Si tu sim da L = 2.4, a depurar.
- 2Web.
λ = 100/s, W = 0.05 s ⇒ L = 5 workers: si medís 8, la latencia real es mayor (o hay reintentos).
- 3Call center con fuga.
L = 9.5 con λ = 20 y Pb = 5%: cierra con λef = 19, no con 20.
- 4Soporte 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.
L contra λW: que empaten
error = |L − λW| / L · c=1
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
- Con ρ=0.5 y T=150: ¿error? ¿Y con T=15?
- Con ρ=0.875 y T=50: ¿error? ¿Por qué T=50 no alcanza ahí?
- ¿Qué tres remedios aplicarías ante un error del 25% en régimen?
Ver respuestas sugeridas
- T=150: ~1–3% (pasa); T=15: ~10–20% (mirá): pocas vidas y arranque pesan.
- ~10–20%: con ρ alta las vidas largas no caben en T=50 y faltan del promedio (truncamiento).
- 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.