Simulación de Eventos Discretos · Tema 17

Generación de eventos

De dónde salen los futuros — llegadas que se sortean afuera y fines que se agendan adentro — con semilla para repetir.

01 · Punto de partida

Nadie agenda el futuro gratis

Cada futuro del calendario nació en algún lado. La próxima llegada nace de un sorteo (“el próximo cliente viene en X minutos”); la próxima salida nace de un inicio (“si empezó ahora y dura S, termina en t+S”). Una viene de afuera (proceso de llegadas), la otra de adentro (actividad que termina).

Si el sorteo está mal —sin semilla, con distribución equivocada o encadenado roto— toda la simulación mide otro mundo. Generar bien es la mitad de simular bien.

  • ¿Este futuro se sortea o se calcula?
  • ¿Con qué distribución y qué media?
  • ¿Quién lo agenda y en qué momento exacto?
  • ¿Puedo repetir la misma secuencia mañana?

02 · Definición

Dos fábricas de futuro

⚄

Exógena (llegadas)

Sorteo de afuera: próxima = ahora + X con X de una distribución (fija o exponencial). Cada llegada agenda la siguiente: cadena infinita.

⚙

Endógena (fines)

Cálculo de adentro: fin = inicio + S al iniciar el servicio. Sin sorteo nuevo si S es fijo; con sorteo de S al iniciar si es aleatorio.

⛓

Encadenar

Cada evento agenda sus hijos: llegada → próxima llegada (+ eventual salida); salida → próxima salida del siguiente. El futuro nunca se seca por olvido.

Quién genera qué y cuándo.
FuturoOrigenCuándo se agendaFórmula
Próxima llegadaExógeno (proceso de llegadas)Al inicializar y en cada llegadat + X (sorteado)
Fin de servicioEndógeno (actividad)Al iniciar cada servicioinicio + S
Stop / finParámetroAl inicializarT fijo

03 · Métodos

Fijos, exponenciales y encadenados

sortear X→agendar t+X→al llegar, repetir
  1. 1
    Tiempos fijos (didácticos).

    Cada A exacto: 2, 4, 6… Predecibles, ideales para validar a mano. Irreales para clientes.

  2. 2
    Exponenciales (markovianos).

    X = −media·ln(1−U) con U uniforme: la “falta de memoria” de llegadas telefónicas y requests. Base de M/M/1 (Tema 31).

  3. 3
    Encadenamiento.

    La llegada en t agenda la de t+X inmediatamente, antes de hacer otra cosa. Si se olvida, la cadena muere y el futuro se seca.

Semilla (seed)
Número que inicia el generador: misma seed = misma secuencia. Se fija por réplica y se publica.
Tasa λ y media A
A = 1/λ: llegan λ por unidad en promedio. Con A=2, λ=0.5/min. (Tema 23)
Truncado por horizonte
Lo sorteado más allá de T se descarta (o se anota como “fuera”). No se procesa, no contamina stats.
Sorteo al iniciar
La S aleatoria se sortea al empezar el servicio y viaja con la entidad, nunca al terminar. (Tema 9)

Fijo

Reloj suizo

Llegadas cada 2.0 exactos: validable con lápiz, incapaz de ráfagas y silencios reales.

Exponencial

Mundo real

Ráfagas y huecos con media A: el sistema sufre picos aunque “en promedio” dé abasto.

04 · Ejemplos

Qué se sortea en cada mundo

Generadores típicos por sistema.
SistemaSe sortea (exógeno)Se calcula (endógeno)
BancoEntre-llegadas exponencial media 2Fin = inicio + 3
WebArribos por segundo (Poisson)Fin = inicio + Exp(media 0.12 s)
TallerLlegadas de piezasFin en A y en B con sus S

05 · Representación en Python

Sortear, encadenar y agendar

El patrón son tres líneas en cada llegada: sortear X, agendar t+X, seguir. La exponencial sale de random.expovariate(1/media).

Python en tu navegador. El primero encadena fijas; el segundo sortea exponenciales con semilla. Cambiá la seed y mirá otra historia repetible.

import heapq, itertools
fel, seq = [], itertools.count()
A = 2.0
heapq.heappush(fel, (A, 1, next(seq), "llegada", {}))
# En cada llegada (t): heapq.heappush(fel, (t + A, 1, next(seq), "llegada", {}))
print("cadena fija:", [A, 2 * A, 3 * A])
import random
random.seed(7)
media = 2.0
t, llegadas = 0.0, []
for _ in range(5):
    X = random.expovariate(1 / media)  # entre-llegada exponencial
    t += X
    llegadas.append(round(t, 2))
print("exponenciales (seed 7):", llegadas)

06 · Exploración

Laboratorio: reloj suizo vs. mundo real

Generamos llegadas hasta t=12 con media A: en modo fijo caen cada A exactos; en exponencial se sortean con la seed elegida. Compará: mismo promedio, distinta música — ráfagas y huecos que el fijo jamás produce.

EXPERIMENTO 17

La misma media, otra historia

fijo: A, 2A… · Exp: t += −A·ln(1−U)

Los resultados numéricos aparecen debajo.
Llegadas generadas0
Intervalo medio real0
Mín / máx intervalo—
Primera / última—

Cambiá a exponencial para ver ráfagas.

Tallos verdes: llegadas generadas. Con fijo son equidistantes; con exponencial se apelotonan y se separan aunque la media coincida.

Preguntas para explorar

  1. Con A=2 fijo, ¿cuántas llegadas hay hasta 12? ¿Y su intervalo medio?
  2. Pasá a exponencial (seed 7): ¿el conteo coincide? ¿Y el mín/máx?
  3. Cambiá la seed 7→3: ¿cambia la media mucho o poco? ¿Y la historia concreta?
Ver respuestas sugeridas
  1. 6 (2,4,6,8,10,12), medio exacto 2.0, mín=máx=2.0: orden perfecto.
  2. El conteo ronda 6 pero varía (5–7); el mín puede ser 0.3 y el máx 5: ráfagas y huecos con igual media. Esa varianza castiga las colas.
  3. La media apenas se mueve (ley de los grandes números en miniatura); la historia concreta sí: otras ráfagas en otros momentos. Por eso se reporta con varias seeds.

07 · Comprensión

Confusiones frecuentes

«Generar es solo las llegadas»

También son los fines (inicio+S), las fallas y el stop. Todo futuro nace de algún generador explícito.

«Exponencial es solo otra campana»

La exponencial es asimétrica y sin memoria: muchos intervalos cortos y pocos larguísimos. La campana (normal) es simétrica y puede dar tiempos negativos si se usa mal.

«La seed da igual si promedio muchas»

Sin seed no podés repetir el caso que falló ni publicar resultados auditables. Promediar no sustituye reproducir.

«Agendar la siguiente puede esperar al final»

Si la rutina falla antes de agendar, la cadena muere. Se agenda primero, se atiende después.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: cadena fija

Generá llegadas cada 2 hasta 8 encadenando.

t, A, T, lista = 0.0, 2.0, 8.0, []
t += A
while t <= T:
    lista.append(t)
    t += A  # cada una agenda la siguiente
print(lista)  # [2.0, 4.0, 6.0, 8.0]
Ver solución razonada

El t += A dentro del bucle es el encadenamiento: cada llegada engendra la próxima. Fuera del bucle, la cadena no existe.

Ejercicio 2: primera exponencial

Sorteá 3 entre-llegadas de media 2 con seed 7 y acumulalas.

import random
random.seed(7)
t = 0.0
for _ in range(3):
    t += random.expovariate(1 / 2.0)
    print(round(t, 2))
Ver solución

Tiempos irregulares pero repetibles con seed 7: otra seed, otra historia; misma seed, misma historia siempre.

Ejercicio 3: fin endógeno

Inicio en 10 con S sorteada de media 3 (seed 1): ¿fin?

Ver una posible respuesta
import random
random.seed(1)
S = random.expovariate(1 / 3)
print("S =", round(S, 2), "| fin =", round(10 + S, 2))

S se sortea al iniciar y el fin queda fijado: el futuro endógeno nace calculado, no adivinado.

09 · Síntesis

Ideas para recordar

  • Llegadas (exógenas) se sortean y encadenan: cada una agenda la siguiente.
  • Fines (endógenos) se calculan al iniciar: fin = inicio + S.
  • Fijo para validar a mano; exponencial para mundo real (media A, tasa λ=1/A).
  • Semilla por réplica: sin ella no hay depuración ni publicación.
  • Agendar primero, atender después: la cadena no debe cortarse.

En el próximo tema veremos el procesamiento de eventos: qué hace cada rutina al recibir su evento.