Ciencias

Category Archive Ciencias

Simulación en Python usando Simpy: llegadas y servicio

Realizaremos una simulación en Python usando Simpy de eventos discretos (simulación de llegadas y servicio). 

El ejemplo que vamos a utilizar es el siguiente: Una peluquería tiene un peluquero que se demora entre 15 y 30 minutos por corte. La peluquería recibe en promedio 3 clientes por hora (es decir, uno cada 20 minutos). Se desea simular las llegadas y servicios de 5 clientes. 

Una vez realizado el código, podremos variar cualquiera de éstos parámetros (tener varios peluqueros, cambiar el tiempo que se demoran por corte, simular para n clientes o para un tiempo específico como una cierta cantidad de minutos, etc).

Antes de realizar la simulación en Python usando Simpy, vamos a hacer los cálculos manuales de acuerdo a las técnicas de Simulación. Esto nos permitirá tener un modelo matemático que nos confirme los resultados de nuestra simulación.

Simulación de eventos discretos

El tiempo entre llegadas de los clientes a la peluquería es exponencial con media de 20 minutos.

La peluquería es atendida por un solo peluquero y se lleva entre 15 y 30 minutos, distribuidos de una manera uniforme, para realizar un corte de pelo. 

Los clientes son atendidos con base en la disciplina FIFO (primero en llegar, primero en salir).

De modo que las llegadas son calculadas de acuerdo a la siguiente fórmula:

T_LLEGADAS = \lambda ln(R)

Donde:

\lambda es el promedio de llegadas, en nuestro ejemplo es de 20 minutos.

Ln es la operación de Logaritmo Natural

R es un número pseudoaleatorio

Los tiempos de servicio son calculados de acuerdo a la siguiente fórmula:

tiempo_corte = TIEMPO_CORTE_MIN + (TIEMPO_CORTE_MAX – TIEMPO_CORTE_MIN) R

Esto es: el mínimo de tiempo que se demora el peluquero, en nuestro ejemplo es 15, más la diferencia entre el máximo y el mínimo, en nuestro ejemplo serían 15 minutos (30 menos 15), multiplicado por un número pseudoaleatorio. El resultado nos dará un número entre 15 y 30.

Los números pseudoaleatorios que utilizaremos serán los siguientes:

0.5391, 0.2892, 0.6536, 0.2573, 0.6416, 0.0300, 0.2100, 0.3972, 0.9888, 0.4615

Utilizaremos los primeros 5 para calcular las llegadas y los últimos 5 para calcular los tiempos de servicio.

Cálculo de los tiempos de llegada:

Cliente 1.  -20  * ln(0.5391) = 12.36

Cliente 2. -20 * ln(0.2892) = 24.81  (le sumamos 12.36 el resultado es: 37.17)

Cliente 3. -20 * ln(0.6536) = 8.50  + 37.17 = 45.67

Cliente 4. -20 * ln (0.2573) = 27.15 + 45.67 = 72.83

Cliente 5. -20 * ln(0.6416) = 8.87   + 72.83 = 81.70

Breve explicación: Entre el minuto 0 y la llegada del cliente 1 pasaron 12.36 minutos. Entre el minuto 12.36 y la llegada del cliente 2 pasaron 24.81 minutos, por lo que el cliente 2 llegó en el minuto 37.17.

Cálculo de los tiempos de servicio:

Cliente 1. 15 + (15 * 0.0300) = 15.45

Cliente 2. 15 + (15 * 0.2100) = 18.15

Cliente 3. 15 + (15 * 0.3972) = 20.96

Cliente 4. 15 + (15 * 0.9888) = 29.83

Cliente 5. 15 + (15 * 0.4615) = 21.92

Breve explicación: El cliente 1 demoró 15.45 minutos, el cliente 2 demoró 18.15 minutos. El cliente que más demoró fue el 4, demoró 29.83 minutos. Como puedes notar, el tiempo de servicio va de 15 a 30 minutos.

Con éstos datos podemos construir la siguiente tabla: 

simulacion en python usando simpy

Resultados de la simulación

Aplicando las fórmulas correspondientes podemos calcular la longitud promedio de la cola, el tiempo de espera promedio, y el uso promedio de la instalación.

Longitud promedio de la cola = 37.51 / 128.03  =  0.29

Tiempo de espera promedio = 37.51 / 5  = 7.50 minutos

Uso promedio de la instalación = 106.31 / 128.03  = 0.83 (La peluquería trabaja un 83% del tiempo total)

Simulación en Python usando Simpy de una peluquería

Considero que el lector ya ha utilizado Python, por lo que no incluyo la explicación de la programación en Python, y nos centraremos en las instrucciones propias de Simpy y la lógica del programa.

Instalación de Simpy para Simulación en Python

Descarga Simpy desde su sitio web:

https://pypi.python.org/pypi/simpy#downloads

Una vez descargado, guarda el archivo en una ubicación accesibe. 

Abre esa ubicación (desde Windows escribe cd  seguido de la ruta donde guardaste la carpeta de Simpy).

$ cd donde/colocaste/simpy/

Ahora escribe el siguiente comando

$ python setup.py install

Programa de simulación en Python usando Simpy

Primera parte: Bibliotecas a utilizar

 

Usaremos random para generar números pseudoaleatorios, math para usar la función de logaritmo natural que utilizaremos para obtener las llegadas de los clientes a la peluquería, y simpy para tener un entorno de simulación.

Segunda parte: Constantes y variables a utilizar

 

El valor SEMILLA puede ser cualquiera, el que estamos utilizando nos proporciona los números pseudoaleatorios que utilizamos en la simulación manual.

La constante TIEMPO_SIMULACION no la utilizaremos en este ejemplo, pero nos puede servir más adelante si, en vez de simular 5 clientes, queremos simular una cantidad de tiempo (120 minutos, por ejemplo).

Tercera parte: Procedimientos 

 

El primer procedimiento invocado es el de principal, que a su vez manda a llamar a cliente, que a su vez manda a llamar a cortar.

El procemiento cortar, calcula el tiempo que se demora con cada cliente. El procedimiento cliente muestra el minuto en que el cliente llega, espera a ser atendido, el minuto en que el cliente comienza a ser atendido, y el minuto en el que termina de ser atendido y deja la instalación.

El procedimiento principal hace un ciclo para n cantidad de clientes, en nuestro ejemplo, 5, y calcula las llegadas (que siguen una distribución exponencial).

Cuarta parte: Programa principal

 

El programa inicia con un mensaje de Bienvenida, y crea un entorno de simulación. Crea los recursos, en este caso la cantidad de él o los peluqueros, y manda a llamar al proceso principal lo que da inicio a la simulación

Quinta parte: Calculo de indicadores

 

Calculamos los indicadores utilizando las fórmulas ya menciondas.

Resultado de la ejecución de la simulación en Python usando simpy

Ejecución de la simulación en Python usando Simpy

Ejecución de la simulación en Python usando Simpy

Como podemos observar, debido a que se utilizaron los mismos números pseudoaleatorios obtenemos los mismos resultados. Podemos ahora variar a nuestro gusto los parámetros proporcionados al programa,  por ejemplo, la cantidad de clientes, la cantidad de Peluqueros, o cuánto se demoran éstos en un corte de cabello.

Otras instrucciones

Si deseamos que la simulación se ejecute durante un tiempo específico, en vez de hacerlo para n clientes:

En la línea env.run cambiamos la llamada a la siguiente orden:

env.run(until = TIEMPO_SIMULACION)

Donde TIEMPO_SIMULACION es una variable declarada al principio del programa.

Tambien debemos ajustar el procedimiento llamado principal. En vez de: for i in range(TOT_CLIENTES): 

Usaremos un ciclo infinito:

While True:

Si deseamos que el programa se ejecute en tiempo real, cambiemos la línea env = simpy.Environment() por

env = simpy.rt.RealtimeEnvironment(factor=1.0)

Conclusión

La presente simulación en Python usando Simpy es una herramienta para obtener resultados en forma más sencilla que si lo hiciéramos manualmente. Es tambien muy flexible y se pueden crear programas más elaborados que si utilizáramos una hoja de cálculo.

Python es un lenguaje multiplataforma, ademas, es software libre, por lo que es ideal para cualquier proyecto académico.

Es posible adaptar este programa para resolver diferentes problemas y se puede ampliar para obtener más datos cuya solución manual o matemática pudiera ser complicada.

Deja tus dudas y comentarios, y califica este artículo. Si estás utilizando este artículo para algún trabajo académico no olvides citarnos:

García (2018). Simulación en Python usando Simpy: llegadas y servicio. Disponible en [http://naps.com.mx/blog/simulacion-en-python-usando-simpy/] consultado el [7-Jun-2018].

En twitter hablamos de muchos otros temas: @napsmx

Tags, ,

Toma de desiciones utilizando el Proceso de Jerarquía Analítica (PJA)

En el análisis y toma de decisiones se utilizan procesos racionales para seleccionar alternativas. Uno de esos procesos es el Proceso de Jerarquía Analítica (PJA), diseñado para cuantificar las ideas, sentimientos y emociones para obtener una escala numérica (Taha, 2004).

Como ejemplos de las decisiones que se pueden tomar utilizando el Proceso de Jerarquía Analítica están los siguientes (Eppen, 2000):

Tags, , Read More

Aprende a realizar la prueba de varianza en Java

Prueba de varianza en números pseudoaleatorios

Una vez que se cuenta con un conjunto de números pseudoaleatorios se tienen que realizar pruebas para determinar la independencia y uniformidad de los números. A continuación se presentan la prueba de medias y prueba de varianza en números pseudoaleatorios.

Tags, , , Read More

Aprende a instalar la biblioteca de clases Math Commons

Instalar Math Commons Math: La biblioteca de clases para matemáticas

Math Commons es una biblioteca (library) de clases para Java que se emplea para realizar operaciones matemáticas.

La biblioteca de clases Math Commons nos permite utilizar clases para realizar operaciones de estadística, álgebra lineal, análisis numérico, números complejos, fracciones, geometría, optimización, algoritmos genéticos, machine Learning, entre otras.

Veamos cómo descargarlo y utilizarlo en un proyecto en Java.

Tags, , Read More

algoritmo congruencial multiplicativo

Algoritmo Congruencial Multiplicativo para la generación de números pseudo aleatorios: Implementación en Java

El algoritmo congruencial multiplicativo se utiliza para generar números pseudo aleatorios. Veamos a continuación una explicación de en qué consiste así como su implementación en Java.

algoritmo congruencial multiplicativo

Aprende a implementar el algoritmo congruencial multiplicativo en Java

Tags, , Read More

Algoritmo de Cuadrados Medios para la generación de números Pseudoaleatorios: Implementación en Java

Veremos el Algoritmo de Cuadrados Medios y cómo implementarlo utilizando el lenguaje de programación Java.

algoritmo de cuadrados medios imagen articulo

Aprende a implementar en Java el algoritmo de cuadrados medios

Tags, , Read More

Programación por metas: explicación y ejemplo

La Programación por Metas en Investigación de Operaciones es un tipo de Programación Lineal. En este artículo se dará una sencilla explicación de sus bases, y se concluirá con un ejemplo. Para comenzar veremos un poco lo que es la Programación Lineal.

aprende programacion por metas

Aprende Programacion por Metas

Tags, , Read More

Metodología de Simulación: Etapas de un proyecto de Simulación

Establecer una Metodología de Simulación es necesario para que un proyecto de simulación tenga buenos resultados. En este artículo analizaremos una  Metodología de Simulación propuestas por expertos en el tema.

metodologia de simulacion

Aprende los pasos de una Metodología de Simulación

Tags, , Read More

Tecnicas de conteo

Técnicas de conteo en Probabilidad y Estadística

Las Técnicas de conteo son utilizadas en Probabilidad y Estadística para determinar el número total de resultados. En este artículo analizamos: Principio de multiplicación, regla factorial, permutaciones, permutación circular y permutaciones con repeticiones.

 Tecnicas de conteo

Aprende Técnicas de Conteo

Tags, , Read More

Niveles de medición de datos en estadística

En estadística existen formas de clasificar a los datos. Una de ellas es usando cuatro niveles de medición de datos. Son los siguientes:

niveles de medición de datos

Cuáles son los niveles de medición de datos…

Tags, , Read More