# Simulación con réplicas

Con la excepción del experimento de **Simulation**, todos los experimentos de AnyLogic se pueden simular con réplicas. La **Simulation**, que es el tipo seleccionado por default del programa debe usarse cuando desee ejecutar su modelo con la animación gráfica activa.

En esta sección, utilizaremos el experimento de **Parameters Variation** con réplicas y analizaremos la salida del modelo por muestreo. Si esta es su primera experiencia con la simulación, puede que no quede claro qué son las réplicas y para qué sirven, por lo que aquí hay una explicación muy básica: como hay aleatoriedad en el sistema (por ejemplo, el servicio al cliente no siempre tiene la misma duración - AnyLogic dibuja un valor para cada una de las operaciones, según la distribución que hemos definido), no sería apropiado sacar conclusiones sobre el desempeño de la sucursal bancaria después de una sola ejecución del modelo. En estos casos, se debe ejecutar el modelo repetidamente y analizar el conjunto de resultados obtenidos. Las réplicas son simplemente ejecuciones del mismo escenario, es decir, del mismo modelo con los mismos parámetros de entrada (y diferentes semillas para generar números aleatorios).

Por ejemplo, considere que desea estimar la ocupación promedio de los centros de llamadas y que ha estimado que 10 réplicas es una cantidad adecuada para sacar sus conclusiones. En este caso, utilizará los 10 valores de ocupación promedio (cada réplica genera un resultado) para calcular su promedio, interpretando este resultado como representativo de la operación real. En otras palabras, hará un análisis de muestra y su tamaño de muestra es *n*= 10.

Antes de ensuciarse las manos, una advertencia de algo interesante: AnyLogic ejecuta experimentos con replicaciones con **procesamiento paralelo**, de modo que desencadena una replicación por núcleo disponible en la CPU de su computadora.&#x20;

Crear nuevos experimentos es intuitivo, solo use la secuencia de comandos del menú desplegable **File> New> Experiment:**

![](https://lh5.googleusercontent.com/q45ZK9kPVEJ2zT7UsLAkg3j89WxwCX9MO0gkGJMippO5vsZpMK4TOIMfBEbO9300-6HfsLiXH9gHL1stTWMsrq-M-NA23tTdC-vbxCALFzYkXX_RS5o7ktfy8989amGmSZokLxxU)

El primer paso es crear elementos de recopilación de datos (**Dataset**, **Statistics**, **Histogram Data** etc.), a partir de los cuales puede se pueden extraer las distribuciones de los parámetros de salida. Aunque ya hemos creado varias salidas para el modelo, todas se crearon en el experimento de **Simulation**. En el experimento **ParametersVariation: Main**, todavía no hay una sola salida.&#x20;

Usaremos dos salidas en el análisis: el tiempo promedio en el sistema y el uso promedio de cajeros. Por lo general, cuando simulamos un modelo con réplicas, tenemos uno o más valores de salida del modelo y queremos estimar las estadísticas descriptivas de estos valores. AnyLogic ofrece varias opciones para esto, pero para este primer contacto con la herramienta, sugiero comenzar con el bloque **Statistics** en la paleta **Analysis**.&#x20;

Después de un poco de práctica, un conjunto de pasos es simple:

* Determinar la estadística de interés (en este caso, el uso de cajeros);
* Cree un bloque de **Statistics** con la opción de actualizar los valores **Data update** en la opción **Do not update data automatically**;
* Al final de cada réplica, agregue al bloque Statistics el valor de la estadística de interés y el resultado de la réplica, utilizando el campo **After simulation run** en ventana **Properties** del experimento.

Empecemos por crear un bloque **Statistics** con el nombre **usoDeCajeros**:

![](https://lh3.googleusercontent.com/BUmmPH82ulOzk0gDvfRmC4iX-KR9nh9lmMx0deM8ncJD_8sgxmNDoBBuW3rYzNMpHzxunM1N-njjq_iE_Ko5z4RiQT4KSmHA5CH1XiA06W8zat8fLDrT6gvh3bSqphkhxxJyU7H5)

Deje la opción de actualizar datos en la opción **Do not update data automatically**:

![](https://lh4.googleusercontent.com/mcWR52NqkEEhayO6_qSo8P_biL51sREIv9lay_uZMe75tbLBRj5A9vMxSnNIJ8xWFGM7ZtHZKBYg-vONYr0YsHJDoJXzUSGoU2po0SYlN_1zjKvaqema9of3IGU8C6e9vcxOtTD2)

Nuestro objetivo es agregar, al final de cada réplica realizada, los resultados de la respectiva réplica en el bloque **usoDeCajeros**. Vuelva a la pestaña **Projects**, seleccione **ParametesVariation: Main** y, en la ventana **Properties**, ubique la línea **After simulation run**, en el menú de **Java actions**:&#x20;

![](https://lh4.googleusercontent.com/ME16q1zQXfrzh_L9WUVy3plvNoYUIbeVOgROmcNDfcbPNFtqNJlnj77vOhwoTaGPgLThry46BX7xGSfuM7xTJnA3Prg4j2rUtTC24qFskEYr6-E2i0H9myaU1DRpiPxZ9bTfBDbN)

Esta línea de comando (que actualmente está vacía) siempre se ejecuta cuando AnyLogic termina de simular una réplica.&#x20;

El bloque **Statistics** tiene la función **`add()`** exactamente para esto, por lo que la expresión para agregar un valor al bloque **usoDeCajeros** sería algo como:

* `usoDeCajeros.add (... algunas estadísticas ...)`&#x20;

o (acostumbrarse al comando **Crtl + espacio**):

![](https://lh4.googleusercontent.com/vji_gL-_AKuR2QLOaAsksHedytHRgye_5fWA9nHTBM0LQOGC85v2PH81NLP-hE6BPNWbXlkDyFMLwzran5bJURAbXTCVey2HSlsVg0Xs4Vc4a3IskQBngTQvj8SMj8MoFGw7G6k-)

Nuestro modelo ya calcula la ocupación promedio de los cajeros, dentro del bloque **Resource Pool** (el que está en nuestro **Main** y la **cajasDeAsistencia**), mediante una función llamada `utilization()`. Por lo tanto, para acceder a él, simplemente escriba:  `cajasDeAsistencia.utilization()`.&#x20;

Pero hay un detalle más: si apoya el ratón sobre la pequeña lámpara amarilla en la línea **After simulation run**, recibirá la pista de la palabra `root`.

![](https://lh4.googleusercontent.com/bZadLTg_-3E287aczj1SFjzo-KYBo3APLQw4lSgYbvCFxqTHRRXOencjJvv3wtiWDFjUxka-_OeiKeQZhEQGiOy3AcMPskHbUwMLeXlJSOJQbN8PvZQc5udHG2786MyZblyX66md)

Con el comando `root`, accede a cada réplica tan pronto como finaliza. Vea en la figura cómo se comandó completo (en cada punto escrito, Crtl + espacio, **no olvide el punto y coma al final**):

![](https://lh5.googleusercontent.com/1bIwPVFM9HN-qFnden7a9G0rJHK9n018adGYbpVxXIiIt3nuV6-4MJw1TRfeWOdz_8k7iayipa1arlxvfw9be08RWPtQ8fUxboeH-3bnxY5vpGoU09qM1q6lHqPDo1dkxITPBSvz)

Un breve resumen de lo que hemos hecho hasta ahora:

1. Hemos creado un bloque **Statistics usoDeCajeros** dentro de **Parameters Variation;**
2. En las propiedades del experimento de **Parameters Variation**, colocamos en el campo **After simulation run** de la pestaña de  **Java actions**, el comando:&#x20;

`usoDeCajeros.add (root.cajasDeAsistencia.utilization ())`

Ahora debe dirigir su atención a la ventana de propiedades del experimento, en la barra Replications:

![](https://lh5.googleusercontent.com/cVG25xMRn_VAyzk7Q0t5jPMEikS0N3DPpsUI9Pv3elkocrp7RJiE_TPQZxVPXwFi4-nKV2C6d4W2w6Rm14aDU0EtibpK0zY9XRLBXEyb8L_tI3w23wKD3zDQkf8sl_9h6vV4SqSd)

La opción **Use Replications** abre el resto de las opciones de la ventana:

* **Fixed number of replications** para realizar un número fijo de replicaciones;
* **Varying number of…** para realizar un número de repeticiones de modo que se asegure que el **intervalo de confianza** para un dado **valor** (parámetro **of expression**) sea un porcentaje (parámetro **Error percent**) de su valor promedio.

Otra cosa importante: **el valor&#x20;*****default*****&#x20;de anylogic es mantener la semilla de  números aleatorios fijos**, asegurando que los resultados de las simulaciones con mismo valor semilla sean siempre iguales (incluso si se ejecutan en diferentes computadoras, por ejemplo). Esto se aplica incluso entre réplicas, lo que nos obliga a informar a AnyLogic que queremos una semilla diferente para cada simulación. Esto se hace en la pestaña **Randomness**, cambiando la opción semilla a **Random seed**:

![](https://lh5.googleusercontent.com/9JaJOpmbUode2FYJSKUwFkDJ4E8t-gJWus8S7Sb5Xa5OC4fFUGqRn8IAJLE-er_VO2CY9iSvFH39UKaFQeGjpZj49hGI2bY_v7MbkHF2_NYgRY61zw7Kc9ZK1mTFawMGCQt9Wyw0)

Ahora simplemente simula y tendrá el resultado de la simulación para el número deseado de repeticiones.&#x20;

**Observaciones**:

* El bloque **Statistics** tiene varias funciones para extraer la media, el valor más pequeño, la varianza, etc. [¡Vea las opciones en Ayuda!](https://help.anylogic.com/topic/com.anylogic.help/html/analysis/statistics.html?resultof=%22%53%74%61%74%69%73%74%69%63%73%22%20%22%73%74%61%74%69%73%74%22%20)
* La secuencia de pasos anterior también se puede utilizar para el bloque **Dataset**. ¿Cuándo debería usar **Dataset**? Cuando desee almacenar la muestra, los resultados de cada replicación (por el contrario, el bloque **Statistics** no conserva la muestra utilizada en los cálculos);
* El Experimento de **Parameters Variation**, permite simular con variación de parámetros. Por ejemplo, podríamos simular nuestra sucursal bancaria para valores del número de casillas abiertas iguales a 1, 2, 3, 4… En este caso hay que tener cuidado, ya que un solo bloque de **Statistics** no sería suficiente. Necesitaríamos un bloque de estadísticas para cada parámetro de entrada diferente. Se escapa del espíritu de este tutorial, pero una buena alternativa en este caso sería utilizar [Colecciones.](https://help.anylogic.com/topic/com.anylogic.help/html/data/collection-variables.html?resultof=%22%63%6f%6c%6c%65%63%74%69%6f%6e%22%20%22%63%6f%6c%6c%65%63%74%22%20)
