Modelos y Simulación · Tema 50

Proyecto introductorio

Un mini-simulador completo en Python: de la pregunta a la decisión defendible.

01 · Punto de partida

Todo el curso en un programa

Elegiste tu sistema escuela en el Tema 49. Ahora toca cruzar el río completo: pregunta, modelo mínimo, motor con traza, diseño con réplicas, ejecución con warm-up, análisis con dispersión, verificación con testigos, validación con datos, escenarios, sensibilidad y reproducibilidad. No de a pedazos: todo junto, funcionando de punta a punta.

El proyecto aprueba si otro puede correrlo, repetirlo y entender tu decisión. No si es grande: si es mínimo, completo, verificado y honesto (Tema 30).

  • ¿Qué decisión debe tomar quién con tu resultado?
  • ¿Tu modelo mínimo responde esa pregunta?
  • ¿Otro repite idéntico con tu traza?
  • ¿Tu conclusión declara rango y supuestos?

02 · Plano del proyecto

Pregunta, modelo y evidencia

?

Pregunta

Decisión concreta con umbral: ¿alcanza con 2 cajas si la espera debe bajar de 8?

⚙

Modelo

Arquetipo del Tema 49 con parámetros nombrados, supuestos y rango escritos.

▤

Evidencia

Réplicas con semillas, medias con error, escenarios contra la base y traza completa.

Lista de entrega del mini-simulador.
FaseEntregableTema
PreguntaDecisión, umbral y supuestos27–28
Modelo + motorFunciones puras, traza y testigos30–31, 35
Diseño + ejecuciónPlan, réplicas, warm-up, tabla32–33
LecturaMedias con error, escenarios, sensibilidad34, 39–40
CierreRango, reproducibilidad y decisión36, 41, 43

03 · Tres reglas

Cómo aprobar sin naufragar

  1. 1
    Chico y entero.

    Un sistema, una pregunta, un umbral: lo que corre de punta a punta y se verifica.

  2. 2
    Evidencia con error.

    Ninguna media sin dispersión, n y semillas: lo del Tema 34, siempre.

  3. 3
    Decisión con rango.

    «Conviene con demanda ≤ 8 en días normales»: supuestos y límites escritos.

Proyecto vitrina

Grande y mudo

Mucho código, sin pregunta clara ni traza: nadie puede repetirlo ni decidir con él.

Proyecto que decide

Chico y elocuente

Poco código con pregunta, umbral, réplicas y rango: otro lo repite y el decisor entiende.

Mini-simulador
Ciclo completo en poco código, de la pregunta a la decisión.
Umbral
Valor que separa aprobar de rechazar: espera menor a 8.
Defensa
Presentación de evidencia, rango y supuestos ante quien decide.
Cierre
Traza, versión y rango que dejan el proyecto repetible.

04 · Protocolo

El río en cinco cruces

Pregunta→Modelo→Motor→Evidencia→Decisión

Cada cruce deja su entregable de la tabla: pregunta con umbral, modelo con testigos, motor con traza, evidencia con error y decisión con rango.

05 · En Python

El mini-simulador entero

Transición, corrida con azar propio y traza: el corazón del proyecto en quince líneas.

Python en tu navegador. Todo el curso, sin librerías externas.

import random

def espera(demanda, cajeros, semilla, reps=20):
    vals = []
    for r in range(reps):
        rng = random.Random(semilla + r)
        vals.append(max(0, 2 + 1.2 * (demanda - 2.5 * cajeros)
                        + rng.choice([-1, 0, 1])))
    media = sum(vals) / len(vals)
    return {"media": round(media, 2), "n": reps,
            "semilla": semilla, "version": "v1", "estado": "OK"}


print(espera(8, 1, 7000))
print(espera(8, 2, 7000))

Decidir con umbral escrito

La decisión es código, no improvisación: compara contra el umbral y declara.

UMBRAL = 8

def decidir(demanda, cajeros, semilla=7000):
    r = espera(demanda, cajeros, semilla)
    veredicto = "APROBADO" if r["media"] < UMBRAL else "RECHAZADO"
    return f'{veredicto}: espera {r["media"]} vs umbral {UMBRAL}'

print(decidir(8, 1))
print(decidir(8, 2))

06 · Exploración

Laboratorio: defendé tu decisión

Tu proyecto: ¿alcanzan los cajeros ante la demanda pico? El umbral es espera menor a 8, con 20 réplicas y error a la vista. Movete los mandos y buscá la configuración que aprueba con margen.

EXPERIMENTO 50

La defensa

umbral: espera < 8

Los resultados numéricos aparecen debajo.
Espera media0
Error ±0
Umbral8,00
VeredictoAprobado

Con 2 cajeros en pico 8, la espera aprueba con margen.

Barra con error frente a la línea del umbral 8. Aprueba solo si la barra entera queda abajo.

Preguntas para explorar

  1. Con pico 8 y 1 cajero, ¿la barra queda arriba del umbral? ¿El veredicto es rechazado?
  2. Con 2 cajeros, ¿la barra entera (no solo la media) queda bajo 8? ¿Por qué importa?
  3. Cambiá la semilla del 1 al 9 con 2 cajeros. ¿El veredicto se mantiene? ¿Qué prueba eso?
Ver respuestas sugeridas
  1. Sí: la media ronda 8,6 y el error no la baja de 8. Rechazado honesto, con números.
  2. Sí: media ~5,6 ± 0,5, entera bajo el umbral. Importa porque decidir por la media sola es el apuro del Tema 45.
  3. Sí: con 20 réplicas el veredicto sobrevive a las semillas. Eso es evidencia, no suerte.

07 · Comprensión

Confusiones frecuentes

«Grande impresiona, chico aprueba»

Al revés: el proyecto grande sin traza reprueba; el chico repetible con decisión aprueba.

«La media bajo el umbral alcanza»

No: la barra entera con su error debe quedar abajo. La media sola es apuro.

«La defensa es el código»

Es pregunta, evidencia, rango y decisión contadas en idioma del decisor. El código va adjunto, no en vez.

«Terminé cuando dio»

Terminás cuando otro lo repite, el rango está escrito y la decisión cita supuestos. Antes es borrador.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: escribir la pregunta

Empaquetá decisión, umbral y supuestos en un dict que encabeza tu proyecto.

pregunta = {"decision": "¿abrir 2da caja en pico?",
            "umbral": "espera < 8",
            "supuestos": ["días normales", "demanda 5–8"]}
print(pregunta["decision"], pregunta["umbral"])
Ver solución razonada

La pregunta manda al modelo: sin umbral ni supuestos, el simulador no sabe cuándo aprobar.

Ejercicio 2: correr la evidencia

Compará 1 contra 2 cajeros en pico 8 con las mismas semillas.

import random

def espera(demanda, cajeros, semilla, reps=20):
    vals = []
    for r in range(reps):
        rng = random.Random(semilla + r)
        vals.append(max(0, 2 + 1.2 * (demanda - 2.5 * cajeros)
                        + rng.choice([-1, 0, 1])))
    return round(sum(vals) / len(vals), 2)

print("1 caja:", espera(8, 1, 7000))
print("2 cajas:", espera(8, 2, 7000))
Ver solución

Dan cerca de 8,6 y 5,6: el pico con 1 caja roza el rechazo; con 2 aprueba con margen.

Ejercicio 3: cerrar con traza

Firmá tu corrida con versión, semilla y rango, como exige el Tema 41.

Ver una posible respuesta
cierre = {"version": "v1", "semilla": 7000, "reps": 20,
          "rango": "demanda 5–8, días normales",
          "decision": "abrir 2da caja en pico"}
print(cierre)

Con ese cierre otro repite idéntico y sabe hasta dónde vale tu aprobado.

09 · Síntesis

Ideas para recordar y cierre del curso

  • El proyecto es el ciclo entero en poco código: pregunta, modelo, motor, evidencia, decisión.
  • Chico y entero le gana a grande y mudo: traza, testigos y réplicas mandan.
  • Ninguna media sin error; ningún aprobado sin barra entera bajo el umbral.
  • Toda decisión cita rango y supuestos: días normales, demanda 5–8.
  • En Python: funciones puras, random.Random(semilla) y umbral como dato.

Curso completo: del sistema (Tema 1) a la decisión defendible. Felicitaciones: ya pensás en sistemas y experimentás con código antes de intervenir la realidad.