Simulación de Eventos Discretos · Tema 51

Proyecto de simulación

Un simulador de colas completo en Python — los 50 temas ensamblados, validados e informados.

01 · Punto de partida

De 50 lecciones a un sistema que decide

El proyecto integra el curso: un simulador de colas por eventos con motor FEL, M/M/c con fila única, prioridades, cupo con pérdida, estadísticas con warmup, réplicas pareadas y doble auditoría (Little + Erlang). Entrega: código replicable + informe que dimensiona un caso real (banco, guardia o web).

Se construye por hitos validables: cada hito corre, audita y decide antes del siguiente. Sin big-bang final.

  • ¿Qué incluye la v1 y qué queda fuera?
  • ¿Cómo se valida cada hito?
  • ¿Qué experimentos comparan y deciden?
  • ¿Qué contiene el informe que se defiende?

02 · Definición

Alcance, arquitectura y terminado

▣

Alcance v1

M/M/c, FIFO/PRIO no expulsivas, K finita, SLA, réplicas. Fuera: redes con bloqueo, expulsivas, GUI.

⚙

Arquitectura

Motor FEL + generadores + políticas (key) + estadísticas + auditoría + CLI/config. Regla separada del motor.

✓

Terminado

Corre con semilla, audita (Little/Erlang), replica, compara con IC e informa (λ, S, c, T, t₀, N).

Módulos y su responsabilidad (un archivo cada uno alcanza).
MóduloHaceSe valida con
Motor FELReloj, heap, rutinas llegada/salida, cierre TM/M/1 vs fórmulas (Tema 31)
Políticaskey FIFO/PRIO, c servidores, K cupoErlang C/B, tablas 25–27
StatsÁreas, vidas, U, warmup, réplicas, ICLittle L=λW (Tema 37)
CLI/informeConfig, escenarios, tablas, veredictoRe-correr con semilla da igual

03 · El corazón: cuatro hitos

Integrar temprano, validar siempre

H1 M/M/1→H2 M/M/c→H3 PRIO+K→H4 informe
  1. H1
    Motor + M/M/1 válido.

    FEL heap, Exp(λ, μ), áreas y vidas. Criterio: Little <5%, Wq vs teoría <10% con ρ = 0.5–0.8.

  2. H2
    M/M/c con pooling.

    libre_en[c], primero libre, fila única. Criterio: vs Erlang C <10% en c = 2–4.

  3. H3
    Prioridades + K finita.

    key (prio, arr), Pb y λef. Criterio: Little por clase + Erlang B en K = c.

  4. H4
    Escenarios + informe.

    Réplicas pareadas R ≥ 8, IC de diferencias, tabla de dimensionamiento y veredicto con costo.

Semilla fija
Cada experimento declara semillas: re-correr da bit a bit lo mismo. Sin esto no hay defensa posible.
Definición de terminado
Hito = código + auditoría en verde + mini-informe. Sin verde no se avanza: el bug se muda con el código.
Informe replicable
Parámetros, (L, Wq, U, Pb), errores Little/Erlang, IC del duelo y decisión con precio. (Temas 38, 46–47).
Fuera de v1
Redes con bloqueo, expulsivas, animación: se anotan como trabajo futuro, no se colan en la entrega.

Por hitos

Integra temprano

Cada semana algo corre y audita. El riesgo se ve en H1, no la víspera.

Big-bang

Apuesta final

Todo junto al final: el bug del motor contamina prioridades y el informe nace muerto.

04 · Ejemplos

Tres casos a elegir (uno alcanza)

  1. 1
    Banco con turnos.

    λ por ventana, S mixto, SLA Wq ≤ 4, dotación pico/valle + caja rápida. Duelo 3 vs 4.

  2. 2
    Guardia con triage.

    3 clases PRIO + abandono de leves: Wq por clase, Little por clase, dotación por turno.

  3. 3
    API con autoscaling.

    rps × latencia, pool por Little, SLA p95, tormenta de reintentos y regla de escala.

05 · Representación en Python

Esqueleto + suite de validación

El main en config y los asserts que hacen de juez: si esto corre en verde, el proyecto existe.

Python en tu navegador. El primero es el pipeline; el segundo, la suite que lo audita. Todo determinista.

# Esqueleto del proyecto: config -> simular -> auditar -> decidir
CONFIG = {"lam": 0.9, "mu": 0.5, "c": 3, "T": 500, "t0": 50,
          "semillas": [101, 102, 103], "sla": (2.0, 0.8)}
PIPELINE = ["motor(H1)", "mmc(H2)", "prio+K(H3)", "duelo+informe(H4)"]
print(CONFIG)
print(" -> ".join(PIPELINE))
# Suite: M/M/1 exacto + Little del informe (tolerancias del Tema 43)
import math
def check(nombre, sim, teo, tol):
    err = abs(sim-teo)/teo
    print(f"{nombre}: {'OK' if err < tol else 'FALLA'} (err {err:.1%})")

check("Wq M/M/1", 2.02, 0.25/(0.5*0.25), 0.10)
check("Little", 2.0, (1/3)*6.0, 0.05)
print("Erlang C c=3 tabla 8.5/0.9/0.2: ver Temas 29-32")

06 · Exploración

Laboratorio: el dimensionador integrador

Tres casos del curso con su demanda, servicio y SLA. Elegí el caso, tu c y el crecimiento esperado: las barras dan P(SLA) por c = 1…6 con tu crecimiento aplicado; la corona es el mínimo que cumple y la banda el recomendado. Es el Tema 46 con los tres casos adentro.

EXPERIMENTO 51

Un laboratorio, tres defensas

P(Wq≤t) por c · con crecimiento

Los resultados numéricos aparecen debajo.
λ con crecimiento0
P(SLA) con tu c0%
c mínimo / rec.0
ρ con tu c0

Elegí el caso y dimensioná con crecimiento.

Barras = P(SLA) por c con tu crecimiento; recta = objetivo; corona = mínimo; banda = recomendado +1.

Preguntas para explorar

  1. Banco con +20%: ¿cmín? ¿Tu c=3 cumple? ¿Recomendado?
  2. Guardia con +20%: ¿mínimo? ¿Qué cambia vs banco (t y objetivo)?
  3. Web con +50%: ¿mínimo? ¿Por qué el SLA duro encarece?
Ver respuestas sugeridas
  1. λ ≈ 1.08 (a ≈ 2.16): tu c=3 da ~77% (debajo del 80% por poco); cmín=4 (~97%), rec 5. El +20% se comió el margen.
  2. cmín=2 (~94%), rec 3: el t laxo (5 min) perdona aunque el objetivo sea 90%.
  3. λ = 1.65: cmín=6 (~96%), rec 6 (tope): el SLA duro 95% ≤ 1 min con rps altos pide pool sobrado.

07 · Comprensión

Confusiones frecuentes

«Más features, mejor nota»

La nota está en auditoría + veredicto + informe. Un M/M/1 validado con duelo sólido supera a una red sin números.

«Valido solo la media global»

Sin P0/L/Wq/Pb por clase no hay defensa: el jurado pregunta por el VIP, el pico y la fuga.

«Semillas después»

Sin semillas fijas no hay réplica ni pareo ni re-corrida: el experimento no existe para el jurado.

«El informe es el código comentado»

El informe decide (compra/no-compra) con tablas e intervalos: el código es el anexo que lo respalda.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: alcance v1

Listá qué entra y qué no en 4 semanas. ¿Redes con bloqueo? ¿GUI?

# Entra: motor+M/M/c+PRIO+K+SLA+réplicas+informe. Fuera: bloqueo, expulsivas, GUI
print("v1 decidida: lo demás es futuro, no deuda")
Ver solución razonada

Ajusta a H1–H4: lo demás se anota como trabajo futuro con su experimento propuesto.

Ejercicio 2: matriz de validación

¿Qué chequeo por hito y con qué tolerancia?

# H1: Little<5%, Wq<10% | H2: ErlangC<10% | H3: Little/clase+B | H4: IC decide
print("Cada hito verde antes del siguiente")
Ver solución

La tabla de la sección 02 hecha checklist ejecutable (la suite del bloque Python).

Ejercicio 3: informe de una corrida

Escribí el encabezado replicable de tu caso.

Ver una posible respuesta
print("lam=0.9 mu=0.5 c=3 T=500 t0=50 sem=[101,102,103] N=430")
print("L=2.33 W=2.59 Wq=0.59 U=0.60 Little 1.2% Erlang 3% -> c=3 cumple 80/2")

Una línea que replica y decide: el resumen que el jurado lee primero.

09 · Síntesis y cierre

Ideas para llevarse del curso

  • Eventos + reloj + FEL + rutinas = cualquier sistema discreto.
  • λ, μ, c, K, disciplina: medir, clasificar (Kendall), predecir o simular.
  • Little audita, Erlang predice, réplicas deciden, el costo firma.
  • Warmup, T largo, semillas, informe: sin esto no hay número creíble.
  • El proyecto es el curso compilado: motor, políticas, auditoría, veredicto.

Del evento observado al sistema dimensionado: a simular. ¡Buen proyecto!