{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0a93a868",
   "metadata": {},
   "source": [
    "# Diseño de producto para la piel — la barra de sueros personalizados (cola M/M/1)\n",
    "\n",
    "**Objetivo.** Calcular analíticamente las métricas de desempeño de una cola M/M/1 y verificarlas con código, para decidir si conviene abrir una segunda estación de atención.\n",
    "\n",
    "Curso: Modelado de Sistemas bajo Incertidumbre · Universidad de los Andes · 2026-20\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7726d5be",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aa8568bf",
   "metadata": {},
   "source": [
    "## Datos del problema\n",
    "\n",
    "Una barra de sueros personalizados tiene **una sola** esteticista. Los clientes llegan Poisson con $\\lambda = 9$ clientes/hora; el tiempo de diagnóstico + mezcla es exponencial con media 5.5 minutos ($\\mu = 60/5.5$ clientes/hora)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9463f159",
   "metadata": {},
   "source": [
    "## Definiciones necesarias\n",
    "\n",
    "Notación de Kendall: **M/M/1**\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30aa499f",
   "metadata": {},
   "source": [
    "## Implementación\n",
    "\n",
    "Escribe una función que reciba $\\lambda$ y $\\mu$ y devuelva un diccionario con $\\rho, P_0, L, L_q, W, W_q$ (W y Wq en minutos)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e9ef9c39",
   "metadata": {},
   "outputs": [],
   "source": [
    "def metricas_mm1(lam, mu):\n",
    "    \"\"\"Calcula las métricas de una cola M/M/1. Retorna W y Wq en minutos.\"\"\"\n",
    "    # TODO: rho = \n",
    "    # TODO: P0 = \n",
    "    # TODO: L = \n",
    "    # TODO: Lq = \n",
    "    # TODO: W = \n",
    "    # TODO: Wq = \n",
    "    # TODO: retorna dict(rho=rho, P0=P0, L=L, Lq=Lq, W=W, Wq=Wq)\n",
    "    raise NotImplementedError(\"Implementa metricas_mm1\")\n",
    "\n",
    "lam, mu = ## lam, ##mu\n",
    "m = metricas_mm1(lam, mu)\n",
    "for k, v in m.items():\n",
    "    print(f\"{k:5s} = {v:.4f}\")\n",
    "\n",
    "assert m[\"rho\"] < 1, \"el sistema no es estable\"\n",
    "print(\"\\nOK: el sistema es estable (rho < 1).\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71b10e5b",
   "metadata": {},
   "source": [
    "## Sensibilidad: ¿qué pasa si más clientes llegan?\n",
    "\n",
    "Calcula $L$ y $W_q$ para $\\lambda$ entre 1 y 10.5 (con $\\mu$ fijo en 10.9091), y grafícalos para ver qué tan rápido crecen cuando $\\lambda$ se acerca a $\\mu$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "158e5c53",
   "metadata": {},
   "outputs": [],
   "source": [
    "lams = np.linspace(1, 10.5, 200)\n",
    "# TODO: calcula Ls \n",
    "# TODO: calcula Wqs\n",
    "\n",
    "# TODO: arma una figura 1x2: en el primer eje grafica lams vs Ls, en el segundo lams vs Wqs\n",
    "# TODO: marca con una línea vertical el valor actual de lam en ambos ejes\n",
    "# TODO: etiqueta los ejes y pon un título general\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12e49ce5",
   "metadata": {},
   "source": [
    "## Conclusión\n",
    "\n",
    "_¿Qué tan sensible es el sistema a un aumento en λ? ¿Recomendarías abrir una segunda estación? Justifica con la gráfica anterior._"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
