Simulación de Eventos Discretos · Tema 08

Colas

Dónde esperan las entidades cuando el recurso está ocupado — y cómo medir esa espera con longitud, tiempo y disciplina.

01 · Punto de partida

El recurso lleno necesita un “afuera” ordenado

En el Tema 7 el recurso se llenaba y las llegadas “iban a la cola”. Pero ¿qué es exactamente esa cola? No es un número: es un lugar con orden donde cada uno sabe quién está antes y cuánto lleva esperando.

Pensá en el banco con 2 cajas y 5 personas: 2 se sirven, 3 esperan. Esos 3 no están “en el aire”: están en la fila, con C5 primero, C6 segundo y C7 tercero. Si llega C8, va última. Si se libera una caja, entra C5. La cola es la memoria ordenada de la espera.

  • ¿Dónde están los que esperan y en qué orden?
  • ¿Cuántos hay y cuánto llevan esperando?
  • ¿Quién entra primero cuando se libera un lugar?
  • ¿La espera se mide por persona o en promedio?

02 · Definición

Lista, orden y medidas

☰

Contenido

Lista de quienes esperan con su llegada: [C5(4), C6(6), C7(8)]. Sin lista no hay esperas individuales.

⇄

Disciplina

Regla de quién sigue: FIFO, LIFO, prioridades, aleatorio. Se fija una vez y se aplica siempre.

◔

Medidas

Longitud Lq(t) (cuántos) y espera Wq (cuánto). Lo que no se mide no se puede dimensionar.

Distinción crucial que evita la mitad de los bugs: N = en sistema (cola + servicio), Nq = solo en cola. Cuando decimos “la cola tiene 3”, hablamos de Nq; cuando decimos “hay 5 en el banco”, hablamos de N.

Sistema, cola y servicio: tres números distintos.
MedidaQué cuentaEjemplo (2 en servicio + 3 en fila)
N (sistema)Cola + servicio5
Nq (cola)Solo esperando3
OcupadosSolo sirviéndose2
Wq / WEspera / espera + servicioW = Wq + S

03 · Mecánica

Entrar, esperar y salir con orden

llega y no hay lugar → entra→espera en orden→se libera → sale el 1º
  1. 1
    Entrar.

    Si ocupados = c, la llegada se agrega al final (o según prioridad) con su hora: cola.append(C8@11). Nace la espera.

  2. 2
    Esperar.

    La entidad duerme en la lista. Su espera crece Tp − llegada sin código: el tiempo la acumula sola.

  3. 3
    Salir hacia el servicio.

    Al liberarse un lugar, se extrae según disciplina (pop(0) en FIFO), se registra su espera y empieza su servicio.

Disciplina FIFO
Primero en llegar, primero en salir. Justa y predecible; la base de todo el curso hasta el Tema 26.
Capacidad de la cola
Cuántos pueden esperar (finita o infinita). Si está llena, el que llega se pierde. (Tema 27)
Abandono
El que se cansa y se va sin ser atendido. La cola real pierde; la idealizada no. (Temas 27 y 38)
Cola única vs. múltiples
Una fila para 3 cajas (justa, se aprovecha cada hueco) o una fila por caja (rápida de ver, injusta y lenta). La única suele ganar.

Cola como número

Nq nada más

Sabés que hay 3 esperando, pero no desde cuándo ni quién sigue. Alcanza para promedios gruesos.

Cola como lista

Quiénes y desde cuándo

Sabés que C5 espera desde las 4 y sigue él. Habilita Wq individual, prioridades y abandono.

04 · Ejemplos

La misma espera en todos lados

Colas típicas y su disciplina habitual.
SistemaLa cola es…Disciplina
BancoFila con ticketsFIFO (con caja prioritaria a veces)
Servidor webBuffer de requestsFIFO (premium salta con prio)
ImpresoraSpool de trabajosFIFO (el grande bloquea: conviene SJF)
GuardiaSala por triagePrioridades (rojo > amarillo > verde)

05 · Representación en Python

La cola es una lista con protocolo

Con collections.deque: entrar es append, salir es popleft (FIFO). La espera se registra al salir restando la llegada.

Python en tu navegador. El primer bloque opera la cola; el segundo mide la espera al salir. Cambiá el orden y mirá Wq.

from collections import deque
cola = deque()
cola.append({"id": "C5", "llegada": 4.0})
cola.append({"id": "C6", "llegada": 6.0})
print("Nq:", len(cola), "| primero:", cola[0]["id"])
siguiente = cola.popleft()  # FIFO: sale C5
print("atiendo a", siguiente["id"], "| quedan:", len(cola))
from collections import deque
cola = deque([{"id": "C5", "llegada": 4.0}, {"id": "C6", "llegada": 6.0}])
reloj = 10.0
e = cola.popleft()
espera = reloj - e["llegada"]
print(e["id"], "esperó", espera)  # C5 esperó 6.0
print("Nq ahora:", len(cola))

06 · Exploración

Laboratorio: ver la cola respirar

Llega uno cada A, atención S, 1 caja, horizonte 12. La escalera lima es N(t), la banda teal marca cuándo hay cola (Nq>0) y la tabla lista quién espera en Tp con su espera acumulada. Separá N de Nq con tus ojos.

EXPERIMENTO 08

N, Nq y quiénes esperan

Nq(t) = N(t) − ocupados(t) · Wq = inicio − llegada

Los resultados numéricos aparecen debajo.
N en Tp (sistema)0
Nq en Tp (cola)0
Máx. Nq (0–12)0
En cola en Tp—

Mueve Tp para inspeccionar la cola.

Escalera: N(t). Banda teal inferior: hay cola en ese tramo. Línea blanca: Tp. La ficha dice quiénes esperan y cuánto llevan.

Preguntas para explorar

  1. Con A=2, S=3 y Tp=6, ¿cuánto valen N y Nq? ¿Quiénes forman la Nq?
  2. Buscá un Tp sin cola pero con N>0. ¿Qué significa (quién está y dónde)?
  3. Con A=1, S=3, ¿la banda teal se apaga alguna vez? ¿Qué dice eso de Lq?
Ver respuestas sugeridas
  1. N=3 (uno en servicio + dos en fila), Nq=2: por ejemplo C2 y C3 esperando con esperas 2 y 0. N ≠ Nq.
  2. N=1, Nq=0: hay uno solo y está en servicio, nadie espera. Sistema ocupado sin cola: el mejor estado operativo.
  3. Casi nunca: la cola vive llena y el máximo Nq crece. Lq alta sostenida = capacidad insuficiente (ρ>1).

07 · Comprensión

Confusiones frecuentes

«N y Nq son lo mismo»

N incluye servicio; Nq solo espera. Informar N como “cola” infla Lq y arruina la Ley de Little (L ≠ Lq).

«W y Wq son lo mismo»

Wq es solo espera; W = Wq + S incluye servicio. Un banco con Wq=2 y S=3 tiene W=5: el cliente vive 5 en el sistema.

«La cola decide quién sigue»

La lista alberga; la disciplina + liberación deciden. Separar datos de regla evita lógica escondida.

«Guardar solo el conteo alcanza»

Para Lq media sí; para Wq individual, prioridades o abandono necesitás la lista con llegadas.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: N vs Nq

Con N=5 y 2 en servicio, ¿cuánto vale Nq? Generalizalo.

def en_cola(N, ocupados):
    return N - ocupados

print(en_cola(5, 2))  # 3
print(en_cola(1, 1))  # 0: ocupado sin cola
Ver solución razonada

3 y 0. El segundo caso es clave: sistema ocupado sin espera, el ideal operativo que el laboratorio muestra como banda apagada con N=1.

Ejercicio 2: Wq al salir

C5 llegó en 4 y empieza en 10. ¿Cuánto esperó? ¿Y su W si S=3?

llegada, inicio, S = 4.0, 10.0, 3.0
wq = inicio - llegada
print("Wq:", wq, "| W:", wq + S)
Ver solución

Wq=6.0, W=9.0. La espera sola ya duplica el servicio: señal de capacidad escasa.

Ejercicio 3: FIFO con deque

Entran C5(4), C6(6), C7(8) y se libera dos veces en t=10 y t=13. ¿Quiénes salen y con qué Wq?

Ver una posible respuesta
from collections import deque
cola = deque([{"id": "C5", "llegada": 4.0}, {"id": "C6", "llegada": 6.0}, {"id": "C7", "llegada": 8.0}])
for reloj in [10.0, 13.0]:
    e = cola.popleft()
    print(e["id"], "Wq =", reloj - e["llegada"], "| quedan:", len(cola))

C5 con Wq=6.0 y C6 con Wq=7.0; queda C7. FIFO puro: el orden de llegada manda.

09 · Síntesis

Ideas para recordar

  • Cola = lista ordenada de espera + disciplina; mide Lq (cuántos) y Wq (cuánto).
  • N = cola + servicio; Nq = N − ocupados; W = Wq + S.
  • En Python: deque con append/popleft y entidades completas adentro.
  • La lista alberga, la regla decide: separar datos de disciplina.
  • Sin lista hay promedios; con lista hay justicia, prioridades y abandono.

En el próximo tema veremos las actividades: lo que ocurre entre dos eventos con duración conocida.