Es importante comenzar comentando la definición de sistema, dado que es el objetivo del cursso de simulación de la licenciatura en Ingeniería Industrial comprender los diferentes sistemas que integran las actividades productivas, en este sentido, podemos definir sistema como:
El conjunto ordenado de normas y procedimientos, relacionados entre si, que regulan el funcionamiento de un conjunto de elementos.
Por ejemplo:
Es una técnica numérica para conducir experimentos en una computadora digital. Estos experimentos comprenden ciertos tipos de relaciones matemáticas y lógicas, las cuales son necesarias para describir el comportamiento y la estructura de los sistemas complejos del mundo real a través de largos periodos de tiempo (Coss Bu, 2005).
Shannon nos ofrece una segunda definición, la cual dice que la simulación es el proceso de diseñar y desarrollar un modelo computarizado de un sistema o proceso y conducir experimentos con este modelo, con el propósito de entender el comportamiento del sistema o evaluar varias estrategias con las cuales se puede operar el sistema (Shannon, Robert E., 1975).
Como es de observarse, ambas definiciones tienen puntos en común, las dos hablan de la generación de modelos matemáticos cuyo objetivo es modelar el problema real mediante abstracciones, y el segundo punto en común es la utilización de programas de cómputo para el análisis y conducción de los experimentos.
La simulación es una técnica de gran utilidad en la actualidad, sin embargo, también es necesario conocer sus limitaciones, en este sentido, la principales ventajas de la simulación son:
El principal inconveniente puede ser el tiempo de computación necesario, aunque gracias a la gran potencia de cálculo de los computadores actuales, se puede obtener rápidamente una solución aproximada en la mayor parte de los problemas susceptibles de ser modelizados.
Es aquella simulación en la que se ven implicadas variables de tipo discreto, es decir, variables enteras, generalmente mayores o iguales que cero que están separadas en el tiempo, una característica importante de estas variables es que los eventos pueden ser contados.
Es aquella simulación en la que se ven implicadas variables de tipo continuo, es decir, variables que cambian continuamente en el tiempo, una característica importante de estas variables es que los eventos pueden ser medidas.
La simulación resulta de utilidad en multitud de contextos diferentes. Los principales campos de aplicación son:
Como ya se ha mencionado anteriormente, los eventos que implican variables aleatorias enteras y espaciadas en el tiempo se pueden englobar en los algoritmos de simulación discreta, para este caso, citemos algunos ejemplos:
Todas ellas tienen algo en común, todos son eventos que son susceptibles de contarse, dado que, por la naturaleza del fenómeno que los genera, deben ser considerados como números enteros para modelarse de manera adecuada.
En el caso de que la variable aleatoria analizada pueda considerarse como un número decimal, racional, fraccionado, etc, caeremos en el caso de la simulación de eventos continuos. La principal característica de este tipo de eventos es que puede medirse, y por lo tanto, considerarse que pueden variar de manera constante en el tiempo, por ejemplo:
Todos ellos tienen la característica antes mencionada, sus unidades no están limitadas a eventos contables.
Para establecer adecuadamente el listado de software comercial para simulación, les sugiero accesar a a la siguiente liga:
La modelización es una etapa presente en la mayor parte de los trabajos de investigación, especialmente en las ciencias experimentales. El modelo debería considerar las variables más relevantes para explicar el fenómeno en estudio y las principales relaciones entre ellas. La inferencia estadística proporciona herramientas para estimar los parámetros y contrastar la validez de un modelo estocástico a partir de los datos observados. La idea es emplear el modelo, asumiendo que es válido, para resolver el problema de interés. Si se puede obtener la solución de forma analítica, esta suele ser exacta (aunque en ocasiones solo se dispone de soluciones aproximadas, basadas en resultados asintóticos, o que dependen de suposiciones que pueden ser cuestionables) y a menudo la resolución también es rápida. Cuando la solución no se puede obtener de modo analítico (o si la aproximación disponible no es adecuada) se puede recurrir a la simulación. Nos centraremos en el caso de la simulación estocástica: las conclusiones se obtienen generando repetidamente simulaciones del modelo aleatorio. Muchas veces se emplea la denominación de método Monte Carlo como sinónimo de simulación estocástica, pero realmente se trata de métodos especializados que emplean simulación para resolver problemas que pueden no estar relacionados con un modelo estocástico de un sistema real. Para esto, es necesario considerar la utilización de números aleatorios, los cuales se caracterizan por que no existe ningún regla o plan que nos permita conocer sus valores. Normalmente, son obtenidos por medios físicos (loterías, ruletas, etc.) y se almacenan en tablas de dígitos aleatorios (Fernández Casal, Rubén, 2022).
El principal inconveniente para su aplicación en el campo de la Estadística (y en otros casos) es que los valores generados deberían ser independientes e idénticamente distribuidos con distribución conocida, algo que resulta difícil (o imposible) de garantizar. Siempre está presente la posible aparición de sesgos, principalmente debidos a fallos del sistema o interferencias. Por ejemplo, en el caso de la máquina RAND, fallos mecánicos en el sistema de grabación de los datos causaron problemas de aleatoriedad (Hacking, 1965, p. 129).
Debido a esta limitante, y con apoyo de de las computadoras, cada vez más potentes, a partir de 1960 empezó a resultar ser más eficiente generar valores mediante software en lugar de leerlos en tablas. Se distingue entre dos tipos de secuencias:
La mayoría de los métodos de simulación se basan en la posibilidad de generar números pseudoaleatorios que imiten las propiedades de generaciones independientes de una distribución 𝒰(0, 1). El procedimiento habitual para obtiener estas secuencias es emplear un algoritmo recursivo denominado generador:
\[x_i=f(x_{i-1},x_{i-2},...,x_{i-k})\]
donde:
La longitud del ciclo o periodo es la longitud de la secuencia antes de que vuelva a repetirse. Lo denotatremos por p.
Los números de la sucesión serán predecibles, conociendo el algoritmo y la semilla.
Sin embargo, si no se conociesen, no se debería poder distinguir una serie de números pseudo aleatorios de una sucesión de números verdaderamente aleatoria (utilizando recursos computacionales razonables). En caso contrario esta predecibilidad puede dar lugar a serios problemas.
Como regla general, por lo menos mientras está desarrollando un programa, interesa fijar la semilla de aleatorización.
Todo generador de números pseudoaleatorios mínimamente aceptable debe comportarse como si se tratase de una muestra genuina de datos independientes de una 𝒰(0, 1). Otras propiedades de interés serán:
Existen diferentes métodos para generar números aleatorios, existen diferentes métodos, que si bien sus resultados no pueden ser considerados como números totalmente aleatorios, imitan de manera aceptable el comportamiento estadístico requerido, es decir, que sena números que se comporten bajo una distribución uniforme con valor mínimo de cero y máximo de uno. Los métodos que se abordarán en este estudio son:
Este algoritmo no congruencial fue propuesto en la década de los cuarenta del siglo XX por Von Neumann y Metrópolis, requiere un número entero detonador (llamado semilla) con D dígitos, el cual es elevado al cuadrado para seleccionar del resultado los D dígitos del centro. El procedimiento para obtener números pseudoaleatorios bajo este procedimiento es (García Dunna, Eduardo, García Reyes, Heriberto, & Cárdenas Barrón, Leopoldo E., 2013):
Nota: Si no es posible obtener los D dígitos del centro del número \(Y_i\), agregue ceros a la izquierda del número.
Una alternativa para seleccionar los D dígitos centrales de cada iteración es la propuesta por Fernández Casal y Cao (2022), misma que se representa con la siguiente expresión:
\[x_{i+1}=Z(\dfrac{x_i^2-Z[\dfrac{x_i^2}{10^{(2k-\frac{k}{2})}}]{10^{(2k-\frac{k}{2})}}}{10^{\frac{k}{2}}})\]
Donde la variable \(Z\) indica que el número pertenece al conjunto de los números enteros. Esta expresión es de importancia cuando es necesario desarrollar un algoritmo computacional para generar números pseudoaleatorios.
Una situación importante a resaltar acerca de este algoritmo es que generalmente es incapaz de generar una secuencia de \(r_i\) con periodo de vida \(n\) grande, es decir, su periodo \(p\) es corto, lo que ocasionará que en un número relativamente pequeño de repeticiones de la secuencia entre en periodicidad, es decir, que comience a repetir la secuencia de \(r_i\) números anteriormente generada.
La mecánica de generación de números pseudoaleatorios de este algoritmo no congruencial es similar a la del algoritmo de cuadrados medios. La diferencia entre ambos radica en que el algoritmo de productos medios requiere dos semillas, ambas con D dígitos; además, en lugar de elevarlas al cuadrado, las semillas se multiplican y del producto se seleccionan los D dígitos del centro, los cuales formarán el primer número pseudoaleatorio \(r=0.D\) dígitos. A continuación se presentan con más detalle los pasos del método para generar números con el algoritmo de producto medios:
Para la selección de los dígitos centrales, podrá recurrirse también a la fórmula enunciada en el método anterior.
Este algoritmo no congruencial es similar al algoritmo de productos medios. Los siguientes son los pasos necesarios para generar números pseudoaleatorios con el algoritmo de multiplicador constante:
Para la selección de los dígitos centrales, podrá recurrirse también a la fórmula enunciada en el método de Cuadrados Medios.
Este algoritmo congruencial fue propuesto por D. H. Lehmer en 1951. Según Law y Kelton, no ha sido el más usado. El algoritmo congruencial lineal genera una secuencia de números enteros por medio de la siguiente ecuación recursiva:
\[{x_{i+1}={(a{x_i}+c)}mod(m)}~~i=0,1,2,...,n\] Donde \(x_0\) es la semilla, \(a\) es la constante multiplicativa, \(c\) es una constante aditiva y \(m\) es el módulo. \(x_0>0\),\(a>0\), \(c>0\) y \(m>0\) deben ser números enteros. La operación \(mod(m)\) significa multiplicar \(x_0\) por \(a\) para sumar \(c\) y dividir el resultado entre \(m\) para obtener el residuo \(x_{i+1}\). Es importante mencionar que la ecuación recursiva del algoritmo congruencial lineal genera una secuencia de números enteros \(S=\{0,1,2,3,...,{m-1}\}\), y que para obtener el número pseudoaleatorio en el intervalo \({\mathcal {U}}(0,1)\) se requiere la siguiente ecuación:
\[{r_i}={\frac{x_i}{m-1}}\]
El algoritmo congruencial multiplicativo surge del algoritmo congruencial lineal cuando \(c=0\). Entonces la ecuación recursiva es:
\[x_{i+1}=(ax_i)mod(m)~i=0,1,2,3,...,n\] En comparación con el algoritmo congruencial lineal, la ventaja del algoritmo multiplicativo es que implica una operación menos a realizar. Los parámetros de arranque de este algoritmo son\(x_0\),\(a\) y \(m\), los cuales deben ser números enteros y mayores que cero. Para transformar los números \(x_i\) en el intervalo (0,1) se usa la expresión antes comentada, es decir:
\[r_{i}=\frac{x_i}{m-1}\] Las condiciones que deben de cumplir los parámetros para wue el algoritmo congruencial multiplicativo alcance su máximo periodo \(N\), son:
\[m=2^g\] \[a=3+8k~~o~~a=5+8k\] \[k=0,1,2,3,...\] \[x_0~debe~ser~un~número~par\] \[g~debe~ser~entero\] A partir de estas condiciones se logra un periodo de vida máximo de \(N=\frac{k}{4}=2^{g-2}\).
Este algoritmo requiere una secuencia previa de \(n\) números enteros \({x_1},{x_2},{x_3},...,{x_n}\) para generar una nueva secuencia de números enteros que empieza en \({x_{n+1}},{x_{n+2}},{x_{n+3}},...\), su ecuación recursiva queda definida por:
\[x_i=(x_{i-1}+x_{i-n})mod(m)~~i=n+1,n+2,n+3,...,N\] Los números \(r_i\) pueden ser generados mediante la ecuación:
\[r_i=\frac{x_i}{m-1}\]
La variabilidad de eventos y actividades se representa a través de funciones de densidad para fenómenos continuos, y mediante distribuciones de probabilidad para fenómenos de tipos discreto. La simulación de estos eventos o actividades se realiza con la ayuda de generación de variables aleatorias.
Los principales métodos para generar las variables aleatorias son:
El método de la transformada inversa puede utilizarse para simular variables aleatorias continuas, lo cual se logra mediante la función acumulada \(F(x)\) y la generación de números pseudo aleatorios \(r_i\sim{\mathcal {U}}(0,1)\). La metodología se presenta mediante la siguiente secuencia:
El método de la transformada inversa también puede emplearse para simular variables aleatorias de tipo discreto, como en las distribuciones de Poisson, de Bernoulli, Binomial, Geométrica, discreta general, etc. La generación se lleva a cabo a través de la probabilidad acumulada \(P(x)\) y la generación de números pseudoaleatorios \(r_i\sim{\mathcal {U}}(0,1)\). El método consiste en:
Es importante comentar que el método visto anteriormente es útil cuando la función de densidad de la distribución a simular está dada, es decir la expresión:
\[F(x)=\int_{-\infty}^{\infty}{f(x)dx}\] está definida y genera como resultado una expresión matemática de la cual es posible despejar a la variable aleatoria \(x\).
Sin embargo, en muchos casos, esto no es posible, como en el caso de la distribución normal, cuya función de densidad esta dada por:
\[f(x)={\frac{1}{2{\pi}{\sigma^2}}}{e^{\frac{(x-\mu)^2}{2{\sigma^2}}}}\] Por la naturaleza de esta expresión, no es posible obtener una función matemática \(F(x)\) de la cual despejar a la variable aleatoria para implementar el método de la transformada inversa, aunque se pueden obtener aproximaciones mediante integración numérica, esta información no es útil para estimar a la variable aleatoria mediante el método antes mencionado.
Esta situación se extiende a otras distribuciones de como:
Sin embargo, es posible generar estas distribuciones por medio de la suma de otras variables aleatorias, mediante la siguiente expresión:
\[Y=X_1+X_2+\dotsb+X_k\] Donde \(X_k\) es ña \(k-ésima\) variable aleatoria que, sumada, dará como resultado a la variable aleatoria deseada. Para esto mencionaremos algunos ejemplos, como la distribución K-Erlang, la cual puede ser generada mediante la suma de variables aleatorias exponeciales con media \(\frac{1}{k{\lambda}}\), de la siguiente manera:
\[Y=X_1+X_2+\dotsb+X_k\] \[Y=-{\frac{\ln(1-r_1)}{k{\lambda}}}-{\frac{\ln(1-r_2)}{k{\lambda}}}-\dotsb-{\frac{\ln(1-r_k)}{k{\lambda}}}\] Factorizando la expresión tenemos que:
\[Y=-{\frac{1}{k{\lambda}}}[{\ln(1-r_1)}+{\ln(1-r_2)}+\dotsb+\ln(1-r_k)]\] Aplicando propiedades de los logaritmos, finalmente escribimos que:
\[Y=-{\frac{1}{k{\lambda}}}{\ln{\prod_{i=1}^{k}{(1-r_k)}}}\]
Otro ejemplo de distribución de probabilidad que puede atenderse mediante esta metodología es la distribución Normal, aplicando la metodología propuesta se tiene: