Simulación en Python usando Simpy: llegadas y servicio

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

¿Qué te pareció este artículo?
  • Excelente 
  • Interesante 
  • Regular 
  • No era lo que buscaba 
  • Poco informativo 
(Visto 108 veces)
Facebooktwittergoogle_plusmail

Tu comentario

opiniones

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *