Simulación de Eventos Discretos · Tema 41

Período de calentamiento

Descartar el arranque para medir bien — el vacío inicial miente y el régimen se hace esperar.

01 · Punto de partida

El vacío inicial no es el sistema

Abrís el banco vacío a las 9:00 y medís L de 9:00 a 9:15: da 0.8. El régimen real es L = 4. ¿Mintió el simulador? No: mediste el arranque, cuando el sistema todavía se llena. Todo experimento que nace vacío (o lleno) arrastra un transitorio inicial que sesga las medias a la baja (o al alza).

El período de calentamiento [0, t0) se descarta: se simula pero no se mide. Solo [t0, T] cuenta.

  • ¿Cuánto descarto (t0) y cómo lo detecto?
  • ¿Qué sesgo mete el arranque en L, Wq y U?
  • ¿Warmup o más T: qué conviene?
  • ¿Cuándo el warmup no alcanza?

02 · Definición

Transitorio, régimen y corte

0→

Transitorio

El arranque: N(t) sube desde el estado inicial hacia el régimen. Depende de dónde nació (vacío, lleno).

≈

Régimen

La zona donde la media acumulada aplana y las fórmulas valen. Solo ahí se mide.

t₀

Warmup

El corte: [0, t0) se simula y se tira. Regla: t0 ≈ 5–10 × W o hasta estabilizar la media móvil.

Mismo sim M/M/1, ρ=0.8, T=150: el corte acerca a L = 4.
t₀ descartadoL medidaSesgoLectura
0 (nada)≈ 3.4−15%El vacío tira abajo
20≈ 3.9−3%Corte razonable
100 (mucho)≈ 4.1 ± ruidook pero ±Sin sesgo, poca muestra

03 · El corazón: detectar el corte

Mirar la media acumulada, no un instante

simular largo→media acumulada→cortar donde aplana

El método de Welch: promediar N(t) entre réplicas por ventana, suavizar con media móvil y cortar donde aplana. En la práctica del curso: graficar la media acumulada L̂(t) y fijar t0 donde deja de subir (arranque vacío) y oscila en banda.

  1. 1
    Simular largo con traza.

    Guardar [(t, N)] con arranque declarado (vacío es el defecto).

  2. 2
    Graficar media acumulada.

    L̂(t) = área[0,t]/t: sube desde 0 hacia L. El codo marca el fin del transitorio.

  3. 3
    Fijar t0 y re-medir.

    L̂ = área[t0,T]/(T−t0). Un t0 común para todas las réplicas del experimento.

  4. 4
    Chequear costo.

    Si t0 se come >20% de T, alargar T: warmup sin muestra es cambiar sesgo por ruido.

Sesgo inicial
Arrancar vacío subestima L/Wq; arrancar lleno los sobrestima. El signo delata el arranque.
Welch
Promedio entre réplicas por instante + media móvil: aplana el ruido y muestra la tendencia. El estándar para fijar t0.
MSER (regla)
Minimizar error estándar con truncado óptimo: automatiza el corte. Útil; el gráfico manda igual.
Calentamiento físico
Caché fría, turno que hereda cola: el sistema real también calienta. No confundir con el estadístico (este tema).

Sin warmup

Sesgado

Más muestra, media tirada por el arranque. Con ρ alta el sesgo dura decenas de W.

Con warmup

Insesgado (con costo)

Menos muestra, media centrada. Si T ≫ t0, el costo es despreciable.

04 · Ejemplos

Cuatro arranques con historia

  1. 1
    Banco que abre vacío.

    Primera media hora subestima: t0 ≈ 30 min con W ≈ 6.

  2. 2
    Turno que hereda cola.

    Arranca lleno: sin warmup sobrestima. Mismo remedio, signo opuesto.

  3. 3
    Deploy con caché fría.

    Latencia alta al inicio: warmup físico + estadístico juntos.

  4. 4
    Sim con ρ = 0.9.

    El transitorio dura ~10× W ≈ 100+: t0 = 10 sería decorativo.

05 · Representación en Python

Medir desde t₀ con la traza

El área parcial es el mismo bucle con otra ventana: dos líneas separan medir de calentar.

Python en tu navegador. El primero mide L con/sin corte; el segundo dibuja la media acumulada (el codo). Cambiá t0.

# L con y sin warmup desde traza [(t, N)]
def L_ventana(traza, T, t0=0.0):
    area = 0.0
    for (t0_, n0), (t1, n1) in zip(traza[:-1], traza[1:]):
        a, b = max(t0_, t0), min(t1, T)
        if b > a:
            area += n0 * (b - a)
    return area / (T - t0)

traza = [(0, 0), (5, 2), (10, 4), (20, 4)]
print(f"sin={L_ventana(traza, 20):.2f} con t0=10: {L_ventana(traza, 20, 10):.2f}")
# Media acumulada L(t): el codo delata el transitorio
traza = [(0, 0), (5, 2), (10, 4), (20, 4)]
area = 0.0
for (t0, n0), (t1, n1) in zip(traza[:-1], traza[1:]):
    area += n0 * (t1 - t0)
    print(f"L({t1})={area/t1:.2f}")  # sube 0 -> 1 -> 2.2: aún no aplanó

06 · Exploración

Laboratorio: mover el corte y ver el sesgo

Simulamos M/M/1, ρ = 0.8 (λ = 0.4, S = 2), T = 200, arranque vacío, semilla = réplica. La escalera es N(t); la línea vertical es tu t0; la curva teal es la media acumulada desde t0. Movè t0: con 0 la media queda baja; con 30 se pega a L = 4; con 150 tiembla por falta de muestra.

EXPERIMENTO 41

El corte que centra la media

L̂ = área[t₀,T]/(T−t₀) · ρ=0.8

Los resultados numéricos aparecen debajo.
L cruda (t₀=0)0
L con warmup0
L teórica0
Sesgo sin corte0%

Mové t₀ para centrar la media.

Lima = N(t); línea blanca vertical = t₀; punteada = L teórica; teal = media acumulada desde t₀.

Preguntas para explorar

  1. Con ρ=0.8 y t0=0: ¿L cruda vs 4? ¿Sesgo?
  2. Con t0=30: ¿L con warmup? ¿Y con t0=150?
  3. Cambiá de réplica con t0=30: ¿cuánto tiembla L? ¿Y con t0=150?
Ver respuestas sugeridas
  1. ~3.3–3.6 (−10/−18%): el vacío inicial pesa en T=200 con ρ alta.
  2. t0=30: ~3.8–4.2 (centrada); t0=150: ~3.5–4.5 (centrada pero ruidosa: queda poca muestra).
  3. Con 30 tiembla ±0.3; con 150 tiembla ±0.8: descartar de más cambia sesgo por varianza.

07 · Comprensión

Confusiones frecuentes

«Descarto el 10% siempre»

El 10% con ρ = 0.5 sobra y con ρ = 0.95 no alcanza. t0 se fija por gráfico/W, no por porcentaje mágico.

«Warmup arregla T corto»

No: con T = 30 y t0 = 15 quedan 15 de muestra ruidosa. Warmup pide T ≫ t0 o es maquillaje.

«Corto donde más me gusta el número»

Elegir t0 mirando el resultado sesga a favor. Se fija por media acumulada/Welch antes de comparar configuraciones.

«Cada réplica con su t₀»

El t0 es del experimento (común a réplicas): cortes distintos mezclan ventanas y rompen la comparación.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: sesgo del arranque

Traza [(0,0),(10,4),(20,4)], T=20. ¿L cruda vs con t0=10?

# cruda: (0*10 + 4*10)/20 = 2.0; con t0=10: 4.0
print(f"cruda={(0*10+4*10)/20:.1f} warmup={4*10/10:.1f}")
Ver solución razonada

2.0 vs 4.0: el arranque vacío parte la media. El corte la duplica (bien).

Ejercicio 2: regla 5–10×W

M/M/1 con W = 10 (ρ=0.8, S=2). ¿t0 sugerido? ¿% de T=200?

W, T = 10.0, 200.0
print(f"t0={5*W:.0f}-{10*W:.0f} ({5*W/T:.0%}-{10*W/T:.0%} de T)")
Ver solución

t0 ≈ 50–100 (25–50% de T): con ρ alta el warmup muerde; conviene T mayor (Tema 42–43).

Ejercicio 3: costo de descartar

T=200, t0=150. ¿Muestra útil? ¿Qué harías?

Ver una posible respuesta
T, t0 = 200, 150
print(f"muestra={T-t0} ({(T-t0)/T:.0%}): alargar T a 500+ o aceptar varianza")

25% útil: alargar T (lo correcto) o bajar t0 si el gráfico lo permite.

09 · Síntesis

Ideas para recordar

  • El arranque sesga: vacío subestima, lleno sobrestima.
  • L̂ = área[t0,T]/(T−t0); t0 por media acumulada/Welch, ≈ 5–10×W.
  • t0 común al experimento; reportar (T, t0, %).
  • Warmup quita sesgo, no crea muestra: T ≫ t0.
  • No arregla ρ ≥ 1, T corto ni bugs de medición.

En el próximo tema miraremos ese arranque de frente: el estado transitorio.