Post on 16-Apr-2017
PROYECTO DE GRADO
Presentado ante la ilustre UNIVERSIDAD DE LOS ANDES como requisito parcial para
obtener el Título de INGENIERO DE SISTEMAS
SIMULACIÓN DE LINEAS DE PRODUCCIÓN Y SERVICIOS
MEDIANTE EL USO DE PYTHON-SIMPY.
Por
Br. Pedro Rafael Bohórquez Mejías
Tutor: Prof. Sebastián Medina
Mayo de 2009
©2009 Universidad de Los Andes Mérida, Venezuela
ii
SIMULACIÓN DE LINEAS DE PRODUCCIÓN Y SERVICIOS MEDIANTE EL
USO DE PYTHON-SIMPY.
Resumen.
El presente proyecto consiste en realizar una librería de simulación que será utilizada en el desarrollo
de modelos de simulación de procesos productivos y de prestación de servicios. Dicha librería esta
conformada por varios módulos, los cuales representen las características que son comunes a los
procesos de producción y servicios en general, como por ejemplo llegadas de órdenes y procesamiento
de una pieza ó de una solicitud de servicio. Cualquier modelo de simulación de procesos de producción
y servicios, puede hacer uso de uno o varios módulos de la librería, esto dependiendo de la
configuración del modelo de simulación de cada proceso. Para el desarrollo de esta librería se utilizó el
paquete de simulación SimPy, el cual fue desarrollado bajo el lenguaje de programación de alto nivel
Python. Los módulos que representan las características de los procesos de producción y servicios
presentes en la librería son: máquina, transporte, generadores de números aleatorios para los tiempos de
proceso (uniformes y exponenciales), servicio, generaciones de llegadas, depósitos. También se
incluyen objetos propios del lenguaje SimPy utiles para simular procesos de producción. Los diferentes
módulos de la librería requieren como entrada los parámetros o atributos correspondientes al sistema en
particular a simular y la librería devuelve la declaración de variables que son necesarias en la
construcción del modelo de simulación.
Durante la construcción de cada módulo de la librería, se realizaron pruebas mediante ejemplos
sencillos de procesos de producción y servicios para evaluar el funcionamiento de dicho módulo. Una
vez terminados y probados todos los módulos de la librería se utilizaron para desarrollar la simulación
de un proceso de producción, se tomo el caso de la Planta Productora de Alimentos Lactos Santa Rósa.
iii
Palabras Claves.
� Procesos
� Simulación
� Programación
� Simulación de procesos productivos
� Simulación por eventos discretos
� SimPy
iv
Indice General
Capítulo 1
1. Introducción ………………………………………………………….. 1
1.1. Antecedentes ……………………………………………………. 2
1.2. Planteamiento del Problema ……………………………………. 3
1.3. Justificación …………………………………………………….. 4
1.4. Objetivos ………………………………………………………... 4
1.4.1. Objetivo General ……...…………………………………... 4
1.4.2. Objetivos Especificos …………………………..…………. 4
1.5. Metodología …………………………………………………….. 5
1.6. Alcance del Proyecto…………………………………………… 6
1.7. Estructura del proyecto ….…………………….……………….. 6
Capítulo 2
2. Marco Teórico……………………………..………………………….. 8
2.1. Conceptos Básicos ……………………..……………………….. 8
2.1.1. Sistema ……………………………..…………………….... 8
2.1.2. Modelos ……………………………..…………………….. 11
v
2.1.3. Simulación …………………………..……………………. 14
2.1.3.1. Campos y áreas de aplicación de la simulación …..... 17
2.1.3.2. Metodología de un estudio de Simulación ………..... 18
2.2. Simulación de Sistemas Orientados a Eventos Discretos ……... 20
2.3. Estrategias de Simulación de Sistemas Orientados a Eventos
Discretos…………………………………………………….…... 21
2.3.1. Programación de eventos ……………………………....… 21
2.3.2. Exploración de Actividades …………………………….... 24
2.3.3. Interacción de Procesos ………………………………….. 25
2.4. Simulación Orientada a Objetos ………………...….….….…... 26
2.5. Software de Simulación ………………………………..…...… 26
2.6. Python ………………………………………………………… 28
2.7. SimPy (Simulador en Python) ……………………...………… 28
2.7.1. Concepto …………….…………………………………... 29
2.7.2. Características Generales ………………………………... 29
2.7.3. Enfoque para la implantación de un Modelo en SimPy …. 30
2.8. Procesos Productivos …………………………………………. 31
2.8.1. El proceso ………………………………………………... 32
2.8.2. Clasificación de los Procesos y Características ………….. 34
2.8.2.1. Proceso Lineal o por Producto …………………….. 34
2.8.2.2. Proceso Intermitente (Talleres de Trabajo) ………... 35
2.8.3. Medidas de comportamiento en Procesos Productivos .…. 35
2.8.4. Cómo se organiza un sistema Productivo ……………….. 36
2.8.5. Componentes de un Proceso Productivo ………………… 37
2.8.6. Actividad Productiva …………………………………….. 38
2.8.7. Función de producción …………………………………... 38
2.8.8. Sistemas de manipulación de materiales ………………… 39
vi
2.8.9. Transporte ………………………………………………... 40
2.8.10. Ejemplo simple de un proceso productivo ……………… 41
2.9. Librería de Programación ……………………………………... 42
Capítulo 3
3. Desarrollo de la Librería de Simulación ………………………….… 44
3.1. Módulo Máquina ……………………………………………… 45
3.2. Módulo Transporte ……………………………………………. 47
3.3. Simulación de una Línea de Producción ……………………… 48
3.4. Módulo Tiempo Uniforme ……………………………………. 54
3.5. Módulo Tiempo Exponencial ………………………………… 55
3.6. Módulo de Servicio …………………………………………... 56
3.7. Simulación de un sistema de Servicio ………………………... 57
3.8. Módulo de Generación de Llegadas ………………………….. 62
3.9. Simulación de un sistema de Servicio ………………………... 63
3.10. Módulo de Depósito ……………………………...…………... 68
3.11. Módulo de Tally ……………………………….…………….. 70
3.12. Módulo de Monitor ………………………….………………. 70
3.13. Módulo de almacenes (Store) ……………….………………. 71
3.14. Simulación de una Línea de Producción ……….…………… 73
3.15. Contenido completo de la Librería de Simulación …….……. 77
vii
Capítulo 4
4. Simulación de Procesos de Producción de Lácteos Santa Rosa …. 81
4.1. Simulación del Proceso de Producción de Queso Semiduro .. 82
4.2. Simulación del Proceso de Producción de Mantequilla …..... 87
4.3. Simulación del Proceso de Producción de Yogurt ………….. 92
4.4. Simulación de los 3 Procesos Simultáneamente ………….. . 95
4.5. Módulo Menú ……………………………………………… 98
Capítulo 5
5. Conclusiones y Recomendaciones ……………………..……...... 101
5.1. Conclusiones ………………………………………..……... 101
5.2. Recomendaciones …………………………………..……... 102
Apendice A
A.1 Proceso de Producción de Queso Semiduro ………………........ 104
A.2 Proceso de Producción de Mantequilla …..………………........ 108
A.3 Proceso de Producción de Yogurt ….……………….................. 111
A.4 Simulación de los 3 Procesos Simultáneamente ………………. 115
Bibliografia ………………………………………………………… 124
viii
Indice de Figuras
Figura 2.1: Proceso de manufactura como sistema …………………….. 9
Figura 2.2: Correspondencia entre un sistema y un modelo …...……… 12
Figura 2.3: Formas de estudiar un sistema ……………………………. 16
Figura 2.4: Etapas en un estudio de Simulación ………………………. 20
Figura 2.5: Línea flexible de fabricación ……………………………… 42
Figura 4.1: Salida de la corrida de menu.py …………………………. 99
Figura 4.2: Salida de la corrida de menu.py …………………………. 99
Indice de Tablas
Tabla 2.1: Aplicaciones de la Simulación ……………………………. 17
Tabla 2.2: Código ejecutivo de la programación de eventos ……….... 23
Tabla 2.3: Código de evento de la programación de eventos ………... 24
CAPITULO 1
1
Capítulo 1
Introducción.
En el campo de la industria de la Producción y la Prestación de Servicios ha surgido la necesidad de
tener ventajas competitivas, además de enfrentar cambios tanto en los Sistemas de Producción como en
la Prestación de Servicios y también la necesidad de prepararse ante posibles eventualidades que
puedan ocurrir en las empresas.
Todo esto, complementado con la creciente capacidad en las computadoras y la creciente investigación
en el campo de la Ciencia de la Computación, ha llevado a diseñar herramientas que puedan apoyar el
proceso de toma de decisiones en distintas disciplinas, áreas de diseño y manejo de la industria, siendo
una de estas herramientas la Simulación.
La simulación es una metodologia muy importante en el mundo de la computación, actualmente se
simulan los comportamientos de hasta las partes más pequeñas de un mecanismo, las plantas
productivas, sucursales bancarias, crecimiento de poblaciones de especies de animales y procesos
productivos, para mencionar unos pocos ejemplos de las aplicaciones de esta poderosa herramienta.
La simulación es de gran utilidad en la Investigación de operaciones y en sus aplicaciones industriales,
ya que mediante su uso no es necesario experimentar con el sistema real, y permite imitar y descubrir
comportamientos de sistemas que ya están implantados para así mejorarlos o que se desean implantar
para predecir su comportamiento futuro.
Un caso particular de simulación es la Simulación por Eventos Discretos, en este caso se realiza la
simulación de sistemas en los cuales las propiedades de interés de dicho sistema cambian únicamente
en cierto instante de tiempo o secuencias de instantes de tiempo y estos cambios llevan a un cambio en
estado del sistema.
CAPITULO 1
2
Los Sistemas de Producción y de Prestación de Servicios tienen un comportamiento que puede ser
simulado por eventos discretos, ya que estos son secuencias de actividades en la que se producen
cambios en instates de tiempos puntuales.
La simulación de procesos productivos y de servicios permite mejorar la competitividad detectando
ineficiencias motivadas por la descoordinación entre secciones de una misma planta, puede anticipar lo
que pasaría en producción si se cambian variables importantes del proceso.
En los procesos productivos y de servicios ocurren eventos que pueden ser simulados como eventos
discretos mediante la utilización de herramientas de simulación implementadas bajo la filosofía de
software libre, ya que existen herramientas de este tipo, como Python-SimPy, que es una herramienta
muy versátil en cuanto a la Simulación por Eventos Discretos, y debido a que es un lenguaje de
simulación orientado por objetos permite la creación de librerías particulares para simulaciones
especificas. Por tal motivo, es posible la realización de librerías de simulación específicamente para
simular procesos productivos y de servicios.
Otro beneficio que tiene la herramienta Python-SimPy esta implementado en software libre, y por lo
tanto trae consigo diversos beneficios como por ejemplo que ayuda a reducir los gastos en el desarrollo
de programas, y brinda la libertad de poder modificar las aplicaciones de acuerdo a la necesidad que
tenga algún usuario.
1.1 Antecedentes.
Para la simulación de sistemas productivos se han diseñado algunas herramientas o paquetes de
simulación, entre ellos podemos citar el Software de Simulación Arena de Rockwell Software Inc, la
cual es una herramienta de tipo general, es decir, que puede ser usada para realizar cualquier modelo de
simulación de cualquier tipo. Este tipo de software es de gran utilidad para visualizar y estudiar de qué
modo se están llevando a cabo los diferentes procesos; pero es importante resaltar las privaciones que
trae consigo, como por ejemplo que es un software de uso propietario que solo puede ser usado pero no
puede ser modificado por los usuarios y también que es altamente costoso, lo que impide a la mayoría
de los usuarios la utilización del mismo.
SimPy es una herramienta computacional que ha permitido simular sistemas complejos del mundo real.
Según Muller (2003) [12] fue desarrollado originalmente por Muller y Vignaux en el año 2002, es un
CAPITULO 1
3
paquete de simulación de código abierto (software libre) y es uno de los pocos paquetes para
simulación de eventos discretos existentes de código abierto.
En la escuela de Ingeniería de Sistemas de la universidad de Los andes se han realizado diversas
investigaciones utilizando la herramienta de simulación SimPy, podemos citar el trabajo especial de
grado de Briceño (2007) [22], quien realizó un Estudio Comparativo del Paquete de Simulación
Orientado a Eventos Discretos SimPy, comparando distintos modelos en SimPy con modelos
desarrollados con GLIDER y ARENA, y desarrolló un Manual de Usuario con Ejemplos Resueltos, el
cual es una buena fuente de información en relación del uso de la herramienta de simulación SimPy.
También podemos citar el trabajo de Santiago (2008) [23], en la cual se utilizó SimPy para hacer la
Simulación de la línea de producción de los Pasaportes Electrónicos del Servicio Autónomo de
Identificación, Migración y Extranjería (SAIME). También se puede citar el trabajo Perdomo (2009)
[24] donde se utilizó SimPy para el Modelado y Simulación por Eventos Discretos mediante Redes de
Petri. Rivas (2008) [25] usó Simpy para realizar su proyecto de grado en el cual se desarrolló un
Modelo de Simulación para el Sistema Automatizado de Identificación Dactilar (AFIS) del Servicio
Autónomo de Identificación, Migración y Extranjería (SAIME). Podemos citar también el trabajo de
Pacheco (2008) [26] quien trabajó con Optimización de Modelos de Simulación en SimPy utilizando la
Metaheurística de Recocido Simulado, y Avendaño (2007) [27] trabajó con Optimización de Modelos
de Simulación en SimPy realizando modelos donde se usa la Aplicación de la Metodología de
Superficie de Respuesta.
1.2 Planteamiento del Problema.
SimPy es una herramienta muy útil para la simulación por eventos discretos, y cada día está siendo
utilizada por más desarrolladores a nivel mundial. Sin embargo esta herramienta no cuenta con librerías
de simulación con clases y funciones que puedan ser reutilizadas al momento de hacer la simulación de
procesos de producción y sistemas de servicios.
Por tal motivo los usuarios de SimPy tienen que reescribir fragmentos de código cada vez que
desarrollan una aplicación de simulación de este tipo, lo que hace un poco extensa y repetitiva la
programación de los modelos de simulación.
CAPITULO 1
4
1.3 Justificación.
Cada día se observa una incrementada migración hacia los paquetes de software que están orientados al
software libre, y esto es debido a que estos poseen las características de ser gratuitos, de fuente abierta,
potentes y que brindan ciertas libertades que no se encuentran en paquetes de software de tipo
propietario o privativo, es por esta razón que es muy importante el desarrollo de aplicaciones de
simulación bajo el enfoque de software libre. En este sentido el desarrollo de este proyecto permitirá
contar con un software de simulación de procesos de producción y de servicios bajo el enfoque de
simulación de eventos discretos con todos los beneficios que brinda el software libre, ya que el
lenguaje de Simulación SimPy no cuenta con librerías especificas utiles para realizar simulación de
procesos de producción y servicios.
1.4 Objetivos.
1.4.1 Objetivo General.
Desarrollar una librería para la simulación de líneas de producción en sistemas de fabricación y de
prestación de servicios, mediante el uso del paquete de simulación Python-SimPy.
1.4.2 Objetivos específicos.
• Revisar los conceptos de Sistemas de Producción y Servicios.
• Revisar los conceptos de Líneas de Producción.
• Revisar los conceptos de Simulación por Eventos Discretos.
CAPITULO 1
5
• Creación de módulos de SimPy que permitan modelar los componentes de sistemas de
producción y servicios.
• Desarrollar clases de SimPy para cada uno de los diferentes aspectos presentes en sistemas
producción y servicios.
• Probar las clases desarrolladas mediante la simulación de sistemas de producción y servicios
sencillos.
• Utilizar la librería de código Python para el modelado y la simulación de un sistema productivo
real y complejo.
1.5 Metodología.
Antes de comenzar con el desarrollo de la librería de simulación de sistemas de producción y servicios
fue necesario realizar algunas actividades previas al inicio del desarrollo de esta, ya que son de gran
importancia y aportan el conocimiento necesario para realizar la programación de un modelo de
simulación, y específicamente de una librería de código reutilizable.
En primer lugar se realizo la revisión bibliográfica y búsqueda en internet sobre temas relacionados con
simulación, procesos de producción en general y procesos de prestación de servicios, y también
simulación por eventos discretos debido a que según lo observado acerca de procesos de producción y
servicios, estos procesos tienen un comportamiento que se corresponde con eventos discretos. También
fue necesario realizar un estudio sobre el lenguaje de programación Python y el lenguaje de simulación
SimPy, con la finalidad de comprender como pueden utilizarse dichos lenguajes para el desarrollo de
modelos de simulación de procesos de producción y servicios y para el desarrollo de la librería de
código reutilizable que permita simplificar el desarrollo de dichos modelos de simulación.
Además de la revisión de distintos contenidos sobre procesos de producción y servicios, fueron de gran
importancia las observaciones realizadas en visita técnica a algunas empresas de producción y de
servicios, en las cuales se recibió la explicación del funcionamiento, la organización y como están
constituidos los sistemas de producción y de servicios, y así comprender cuales son las características
de estos procesos y saber cuáles variables se van a utilizar para la construcción de los distintos módulos
CAPITULO 1
6
que conformaran la librería simulación y de los distintos modelos de sistemas de producción y
prestación de servicios.
Luego de estudiar múltiples sistemas de producción y servicios se extrajeron las características
comunes a estos procesos, las cuales estarán representadas en los distintos módulos que conformaran
la librería de simulación como son: máquinas, transporte, depósitos, generación de llegadas, generación
de números aleatorios y servicio y cada módulo de la librería se utilizara para realizar las prueba
mediante ejemplos sencillos de procesos de producción y servicios..
1.6 Alcance del Proyecto.
La librería de simulación implementada en Simpy esta conformada por diversos módulos que modelan
los elementos o características comunes a todos los sistemas de producción o servicio. Por tal motivo es
posible utilizar la librería para simular cualquier tipo de proceso de producción o de servicio en general
que incluya elementos presentes en la misma. Desde procesos sencillos como la elaboración de un
pieza por una máquina, hasta procesos más complejos en los cuales estén presentes muchas máquinas,
muchos sistemas de transporte, almacenes, depósitos temporales y muchos recursos y entidades en el
sistema.
Con la librería desarrolla se puede simular procesos de servicio y de producción tanto de elementos
indiduales como de procesos en simultaneo en los que se elaboran o se atienden varios tipos de
elementos al mismo tiempo.
1.7 Estructura del Proyecto.
El presente trabajo está constituido por cinco (5) capítulos y un anexo, los cuales se describen a
continuación:
Capítulo 1. En este capítulo se expone una breve introducción, además de los antecedentes del
proyecto desarrollado, el planteamiento del problema, la justificación del problema, el alcance del
proyecto, el objetivo general y los objetivos específicos y la metodología utilizada para el desarrollo del
proyecto.
CAPITULO 1
7
Capítulo 2. En este capítulo se desarrollan los elementos teóricos que son utilizados para la
elaboración del proyecto, conceptos básicos de sistemas, modelos, simulación, así como la simulación
de eventos discretos y la definición de procesos productivos y sistemas de servicio. También se da una
breve explicación de los lenguajes utilizados para el desarrollo de las librerías.
Capítulo 3. En este capítulo se desarrolla la librería de simulación de procesos de producción y
prestación de servicios utilizando para ello algunos ejemplos de este tipo de procesos.
Capítulo 4. En este capítulo se muestran las aplicaciones desarrolladas de simulación de procesos de
producción estudiados durante la visita a lácteos Santa Rosa, en los cuales se utiliza la librería de
simulación de procesos de producción y servicios. Se muestran los modelos de simulación
desarrollados y los resultados de la simulación de estos procesos.
Capítulo 5. En este capítulo se muestran las conclusiones obtenidas del proyecto y las
recomendaciones planteadas para futuros estudios de esta investigación.
Apendice A. En esta parte se muestran los códigos completos de los modelos desarrollados en SimPy.
CAPITULO 2
8
Capítulo 2
Marco Teórico.
Este capítulo tiene por finalidad presentar los fundamentos teóricos necesarios para el desarrollo del
presente proyecto y el alcance de los objetivos planteados. Es por ello que se hace necesario abordar las
siguientes áreas de estudio: conceptos relacionados con sistemas, modelos y tipos de modelos,
simulación junto con sus diferentes enfoques, haciendo énfasis en la simulación de eventos discretos;
además de los conceptos de procesos productivos, así como también información del software utilizado
para llevar a cabo las simulaciones.
2.1 Conceptos básicos.
2.1.1 Sistema.
La palabra Sistema es muy empleada en diferentes contextos, es por ello que se hace difícil dar una
definición concreta; pero en el área de Investigación de Operaciones algunos autores la definen como:
� Según Barceló (1996) [1] un sistema es un conjunto de cosas que ordenadamente relacionadas
entre sí contribuyen a determinado objeto.
� Law y Kelton (2000) [7]; “un sistema es una colección de entidades como por ejemplo
personas o máquinas, que actúan e interaccionan juntos entre sí, hacia el cumplimiento de un
CAPITULO 2
9
objetivo”.
� En el portal de Ingeniería Informática www.isa.cie.uva.es sobre Simulación y Optimización [2]
se define un sistema como una combinación de elementos o componentes interrelacionados y
relacionados con el entorno, que actúan juntos para lograr un cierto objetivo.
Es de hacer notar en estas definiciones lo siguiente, para que un sistema esté concebido necesariamente
debe estar formado por varias partes (objetos); los cuales, a su vez, deben estar interconectados por
varias relaciones. De acuerdo a lo expuesto por Barceló (1996) [1], hoy día existen una diversidad de
sistemas tan complejos, que se hace un tanto difícil establecer relaciones entre sus partes, es por ello
que conviene realizar una descomposición en partes más pequeñas (subsistemas), permitiendo
simplificar su estudio. Ejemplo de esto son los sistemas de manufactura compuestos de varios
departamentos, sistemas de transporte, logísticos, de gestión de recursos y otros (ver figura 2.1).
Figura 2.1: Proceso de manufactura como sistema.
Para realizar un estudio sobre un sistema es necesario el conocimiento de algunos conceptos como
entidad, entidades permanentes, atributos, relación, recursos, estado y evento, los cuales se detallan a
CAPITULO 2
10
continuación:
• Entidad: Según el portal de la Universidad de Buenos Aires. http://materias.fi.uba.ar (2005)
[3], una entidad es algo (objeto), que tiene realidad física u objetiva y que posee un conjunto de
características (atributos) distinguibles de los demás, por ejemplo: productos, departamentos,
piezas, clientes moviéndose en un restaurante, empleados, etc.
• Entidades temporales: De acuerdo a lo expuesto por Guash et al. (2005) [8] son todos aquellos
objetos que se procesan en el sistema, como por ejemplo las piezas en un sistema de
manufactura, los clientes en un banco.
• Actividades: Son las tareas o acciones que tienen lugar en el sistema. Están encapsuladas entre
dos eventos. Por ejemplo, la reparación de una máquina, el procesado de una pieza o el
transporte de un cliente. Según Guash et al. (2005) [8] las actividades generalmente tienen
duración temporal y, normalmente, precisan del uso de recursos.
• Atributos: Según Barceló (1996) [1] son un conjunto de propiedades que caracterizan a las
entidades que forman parte del sistema, por ejemplo: cantidades de pedidos, número de
máquinas de un tipo dado, color, prioridad, etc.
• Relación: Según Hoeger (2000) [4] es la manera en que las propiedades de una o más entidades
dependen entre sí; causando de esta manera que un cambio en la propiedad de una entidad
ocasiona un cambio en una propiedad de otra entidad; ejemplo: En la entidad: departamento de
producción, sus cambios pueden afectar a los departamentos de compra y ensamblaje.
• Recursos o entidades permanentes: Son una clase de entidades las cuales son los medios para
ejecutar las actividades. Según Guash et al. (2005) [8] los recursos definen quien o quienes
ejecutan la actividad. Los recursos presentan características como capacidad, velocidad, averías
y reparaciones. Ejemplo de recursos son las máquinas en un sistema de manufactura, los
mecanismos de transporte o los operadores.
CAPITULO 2
11
• Estado: De acuerdo a Barceló (1996) [1] son los valores y/o condiciones de los atributos de las
entidades en un instante dado, después de suscitarse un evento; de forma que se puede saber si
una acción se puede ejecutar o si se puede elegir entre varias. Ejemplo: el número de clientes en
una cola, los procesos de manufactura en cada departamento de una fábrica, etc.
• Evento: Según Racero (2004) [5] son los diferentes hechos que ocurren en instantes de tiempo,
para dar lugar a cambios en el estado del sistema y así identificar qué es lo que origina el
cambio y cuando se origina. Ejemplo: Una llegada, una salida de una entidad.
Una clasificación para los eventos se muestra a continuación:
• Eventos condicionados: para que se activen es necesario que se cumpla una o más
condiciones.
• Eventos no condicionados: son los que están planificados para su ejecución y que no
dependen de condiciones para su ejecución.
• Eventos internos: ocurren por condiciones que impone el mismo sistema.
• Eventos externos: ocurren por condiciones externas al modelo.
2.1.2 Modelos.
Luego de haber revisado los conceptos de sistema, se puede afirmar que un sistema esta conformado
por varios componentes, y los componentes que conforman un sistema pueden ser descritos o
representados matemáticamente. Esta representación puede hacerse mediante el uso de modelos con el
objetivo de estudiar el comportamiento de dicho sistema.
Según lo afirma Barceló (1996) [1], dado que uno de los requerimientos básicos de un modelo es que
este debe describir al sistema para realizar predicciones sobre el comportamiento del mismo, es decir
CAPITULO 2
12
las características del modelo deben corresponder a características del sistema bajo estudio y operar en
un rango de trabajo específico, explicación que puede representarse a través de la figura 2.2.
Figura 2.2: Correspondencia entre un sistema y modelo.
Tipos de modelos.
Debido a que el campo del modelado es muy amplio, y dado que en este proyecto no se abordará en
profundidad este punto, solo se hará una breve descripción (características más relevantes) de los
diferentes tipos de modelos. Según Hoeger (2000) [4] de acuerdo a la realidad que representen y la
perspectiva que le dé el analista, los modelos se clasifican en:
•••• Modelos de Tiempo Continuo: Son aquellos en los cuales las variables de estado del sistema
evolucionan en el tiempo de forma continua. Se pueden representar mediante ecuaciones
diferenciales.
•••• Modelos de Tiempo Discreto: Son aquellos en los cuales el estado del sistema se define sólo
para instantes particulares de tiempo, por ejemplo, el número de clientes que visitan el banco
un día determinado.
CAPITULO 2
13
•••• Modelos de Estado Continuo o de Eventos Continuos: Representan sistemas cuyos cambios
de estado son graduales. Las variables que intervienen son continuas. Modelos representados
por ecuaciones diferenciales donde una de las variables de estado representa una cantidad que
cambia continuamente, por ejemplo, la corriente en una bobina.
•••• Modelos de Estado Discreto o de Eventos Discretos: Son modelos dinámicos, estocásticos y
discretos en los que las variables de estado cambian de valor en instantes no periódicos de
tiempo, sin estar dirigidos por un reloj. Estos instantes de tiempo se corresponden con la
ocurrencia de un evento.
•••• Modelos Determinísticos: Son aquellos donde la solución para determinadas condiciones es
única y siempre la misma. Ejemplo de este tipo, son los modelos de optimización lineal donde
la solución está determinada unívocamente por el conjunto de ecuaciones y/o inecuaciones que
se suministran como restricciones.
•••• Modelos Probabilísticos o Aleatorios: Son aquellos donde las características del sistema se
representan por variables aleatorias. Por ejemplo los simuladores de colas, donde las llegadas a
estas se produce a través de una función de distribución de probabilidades.
•••• Modelos Estáticos: Utilizados para representar sistemas cuyo estado es invariable a través del
tiempo. Por ejemplo la cantidad de materia en energía E = m * c2.
•••• Modelos Dinámicos: Contrario a los anteriores, en estos las variables de salida si varían en el
tiempo, muy empleados en el área de control para modelar la dinámica de un sistema físico a
través de ecuaciones diferenciales dependientes del tiempo.
•••• Modelos Lineales: Son aquellos cuya salida del sistema se representa por una línea recta,
ejemplo de estos son los modelos de regresión lineal y = aX + b.
•••• Modelos No Lineales: Empleados para representar sistemas en donde las salidas no sean
CAPITULO 2
14
lineales, por ejemplo, la solución en el tiempo de una ecuación diferencial de segundo orden.
•••• Modelos Abiertos: Si los datos de entrada son externos al modelo e independientes de él,
ejemplo los sistemas de cola de un banco donde las llegadas son externas al modelo.
•••• Modelos Cerrados: Estos no disponen de una entrada del exterior, ejemplo de ellos son los
modelos de control en su estado natural (No hay entrada presente).
•••• Modelos Estables: Son aquellos donde la variable de salida converge a un valor (independiente
del tiempo), ejemplo cuando el intervalo de llegada de clientes es mayor que el tiempo de
servicio.
•••• Modelos Inestables: Cuando el comportamiento del sistema cambia constantemente, al
contrario del anterior no hay tendencia a un valor estable, ejemplo de estos modelos son los
sistemas de colas en un banco, donde el intervalo entre llegadas es menor que el tiempo de
servicio.
Es de hacer notar que algunas veces los modelos y los sistemas no pertenecen al mismo tipo, ejemplo
de ello según el portal de la Universidad de Buenos Aires (2005) [3] es el estudio del fluido por una
cañería (dinámica de fluido) el cual corresponde a un sistema continuo. Sin embargo si el fluido se
discretiza dividiéndolo en gotas y se construye un modelo discreto por el cual circulan gotas de agua
(una, dos, diez, cien, mil), se está representando un sistema continuo por un modelo discreto.
2.1.3 Simulación.
De acuerdo a la opinión de Guash et al. (2005) [8] la simulación digital es una técnica que permite
imitar (o simular) en un computador el comportamiento de un sistema real o hipotético según ciertas
condiciones particulares de operación. Para analizar, estudiar y mejorar el comportamiento de un
sistema mediante las técnicas de simulación digital es necesario, primero describir bajo un cierto
CAPITULO 2
15
formalismo el conocimiento que se tiene sobre las dinámicas de interés (modelo conceptual), y luego
codificarlo en un entorno de simulación para poder realizar experimentos y analizar los resultados.
Aunque la simulación digital es una técnica relativamente reciente y en constante evolución, el uso de
la simulación como metodología de trabajo es una actividad muy antigua, y podría decirse que
inherente al proceso de aprendizaje del ser humano. Es el caso, por ejemplo, de un niño jugando con
unos objetos que no son más que representaciones, a escala, de objetos reales. Para poder comprender
la realidad y toda la complejidad que un sistema puede conllevar, ha sido necesario construir
artificialmente objetos y experimentar con ellos dinámicamente antes de interactuar con el sistema real.
La simulación digital puede verse como el equivalente computarizado a este tipo de experimentación.
Para ello será necesario construir objetos (modelos) que representen la realidad, de tal modo que
puedan ser interpretados por un computador.
Según el portal de la Universidad Del Valle sobre Simulación Discreta (2008) [6] simulación implica
crear un modelo que aproxima cierto aspecto de un sistema del mundo real y que puede ser usado para
generar historias artificiales del sistema, de forma tal que nos permite predecir cierto aspecto del
comportamiento del sistema. Mediante el uso de la simulación para el estudio de algún sistema se
pueden hacer algunas suposiciones, más o menos precisas, acerca de su operación. El conjunto de
representaciones de las características de un sistema, con frecuencia toman una forma matemática o de
relaciones lógicas, y constituyen el modelo conceptual. Este modelo sirve para entender mejor el
sistema, y posiblemente estudiar el impacto de ciertas modificaciones, lo cual es, básicamente, la razón
del inicio de la simulación.
Según Law y Kelton (2000) [7] la simulación consiste en una evaluación numérica del modelo a través
de un computador, durante un período determinado de tiempo, tomando medidas y experiencias durante
este tiempo para hacer posible la descripción de su comportamiento. Estas definiciones de simulación
permiten plantear suposiciones del sistema bajo estudio en cualquiera de sus etapas, para así evaluar
distintos escenarios, encontrar repuestas a preguntas del tipo “qué pasara sí” y así entender o mejorar el
sistema.
Barceló (1996) [1] afirma que la simulación permite realizar diversos ensayos mediante diferentes
CAPITULO 2
16
corridas de la misma con algunos cambios en el los parámetros del sistema y así probarlos en el
modelo, con la finalidad de elegir la mejor alternativa.
Con respecto al sistema, modelo y simulación, Law y Kelton (2000) [7] señalan:
“luego de definir el sistema de interés, se hacen experimentos con el sistema, sí implica mucho
costo, se diseña un modelo y se experimenta con él para obtener un modelo físico o matemático; y en
caso de este último, emplear las técnicas analíticas y/o de simulación”. (Pag, 4)
Tal y como se muestra en la Figura 2.3
Figura 2.3: Formas de estudiar un sistema.
Así, en definitiva la simulación se entiende como una técnica con la que se puede estudiar el
comportamiento de un determinado sistema, mediante la experimentación con el modelo de dicho
sistema y la implementación de este modelo en algún lenguaje de simulación mediante el uso de un
computador, con la finalidad de generar resultados artificiales con los cuales se pueden tomar
decisiones para realizar o no cambios en el sistema.
CAPITULO 2
17
2.1.3.1 Campos y áreas de aplicación de la simulación.
Los campos y áreas de aplicación de la simulación son extensos, sin embargo, se intentará presentarlos
de manera resumida en la tabla 2.1, tomada de Racero (2004) [5].
CAMPOS APLICACIÓN
Computación
Redes de ordenadores, componentes, programación,
bases de datos, fiabilidad.
Manufactura Manejo de materiales, líneas de montaje, equipos de
almacenamiento, control de inventario,
mantenimiento, distribución en planta, diseño de
máquinas.
Negocios Análisis de existencias, política de precios,
estrategias de marketing, estudios de adquisición,
análisis de flujo de caja, predicción, alternativas del
transporte, planificación de mano de obra.
Gobierno Armamento y su uso, tácticas militares, predicción de
la población, uso del suelo, prevención de incendios,
servicios de policía, justicia criminal, diseño de vías de
comunicación, servicios sanitarios.
Ecología y medio ambiente
Contaminación y purificación del agua, control de
residuos, contaminación del aire, control de plagas,
predicción del tiempo, análisis de sismos y tormentas,
exploración y explotación de minerales,
Sistemas de energía solar, explotación de cultivos.
Sociedad y comportamiento Estudios de alimentación de la población, políticas
educativas, estructuras organizativas, análisis de
sistemas sociales, sistemas de asistencia social,
administración universitaria.
Biociencias Rendimiento en el deporte, control de epidemias,
ciclos de vida biológicos, estudios biomédicos.
Tabla 2.1: Aplicaciones de la Simulación
Según la tabla anterior, la aplicación de la simulación a diferentes tipos de sistemas combinada con los
diferentes enfoques de estudio, conducen a una gran variedad de maneras en que se puede realizar un
estudio de simulación. No obstante, hay determinados pasos o etapas básicas, los cuales se denominan:
“Metodología de un estudio de Simulación”, las cuales serán explicadas en detalle a continuación:
CAPITULO 2
18
2.1.3.2 Metodología de un estudio de Simulación.
Las ideas aquí planteadas han sido tomadas de Guash et al. (2005) [8].
1. Definición del problema y planificación del estudio.
En esta etapa se definen los objetivos perseguidos por el planteamiento del problema. Si estos
objetivos no se definen con claridad existirá el peligro de no abordar correctamente el
problema, para el cual se ha solicitado la técnica de simulación, como vía para su posible
solución.
2. Recogida de datos.
La recopilación de datos e información deben ser de fuentes creíbles, y a su vez, cuestionables.
Como en el campo de trabajo esto sucede muy poco, se debe responder a las preguntas
planteadas del problema, realizando hipótesis razonables en colaboración con el usuario final.
3. Formulación del modelo conceptual.
Conocidos los objetivos del problema, existirá la posibilidad (tentación) de comenzar la
construcción del modelo de simulación inmediatamente en el computador. Ello conduce a
obtener modelos de difícil mantenimiento; es por esto que se recomienda plantear un modelo
conceptual con un nivel de abstracción superior al planteado en el código, este contemplará las
relaciones estructurales más importantes del sistema y la coordinación de la sucesión de
actividades que ocurrirán.
CAPITULO 2
19
4. Construcción del modelo.
Para esto se plantearán varios modelos simplificados que caractericen las partes más esenciales
del sistema, para así avanzar rápidamente a la consecución de los objetivos planteados, y así
obtener un posible modelo general (decimos posible ya que un modelo tiene que estar en
constante mantenimiento y verificación).
5. Verificación, validación y pruebas.
Una de las etapas más importantes en la técnica de la simulación, ya que, con una buena
cantidad de pruebas se verificará que el modelo se ejecuta correctamente y según las
especificaciones (modelo conceptual) y validaremos que las hipótesis planteadas, la teoría
empleada y otras suposiciones son correctas; esto favorece que nuestro modelo tenga un
comportamiento lo más parecido posible a la realidad.
6. Diseño de los experimentos de simulación.
Se decidirá que características del sistema se mostraran a través de las estadísticas, la duración
de cada simulación, las condiciones iníciales y el número de ejecuciones (replicas); para así
inferir y tomar decisiones con mayor seguridad.
7. Análisis de los resultados.
Se estudiarán los resultados obtenidos, observando carencias y mejoras, realizando un estudio
de sensibilidad de las variables de estado.
8. Documentación e implementación.
En las etapas precedentes, es muy importante mantener un documento que muestre el estado del
proyecto de simulación, su evolución en paralelo de cada etapa. La implementación consistirá
CAPITULO 2
20
en tomar decisiones como fruto del estudio de simulación realizado.
Como se puede apreciar en la Figura 2.4, estos pasos en general no son secuenciales, sino iterativos, ya
que, algunos de los pasos pueden tener que repetirse en función de los resultados intermedios.
Figura 2.4: Etapas en un estudio de Simulación.
2.2 Simulación de Sistemas Orientados a Eventos Discretos.
Según el articulo de Law y Kelton (2000) [7], el comportamiento discreto de un sistema permite la
implementación del mismo en un programa computacional mediante una lista de sucesos futuros, un
reloj que salte en el tiempo hacia el siguiente suceso, las variables de salida que miden el
comportamiento del sistema y unos acumuladores estadísticos que tomen un registro de los valores de
las variables de estado.
CAPITULO 2
21
2.3 Estrategias de Simulación de Sistemas Orientados a Eventos
Discretos.
De acuerdo a la información encontrada en el texto de Barceló (1996) [1], los lenguajes y paquetes para
la simulación de sistemas orientados a eventos discretos, fundamentalmente se elijen de acuerdo a lo
atractivo de sus características, sin embargo hay una de ellas que resulta determinante e impone su
filosofía, es la estrategia enfoque o visión del mundo, utilizada para la selección del suceso siguiente y
la gestión del tiempo durante la simulación. Según Kiviat (1971) [13] estas estrategias o enfoques se
clasifican en:
• Programación de eventos (Event Schedulling).
• Exploración de actividades (Activity Scanning).
• Interacción de Procesos (Process Interaction).
2.3.1 Programación de eventos.
El enfoque de Programación de Eventos (Event Schedulling), es una técnica que envuelve una
secuencia de eventos incondicionados (eventos que están planificados para su ejecución y no dependen
de condiciones) a lo largo del tiempo de simulación. Es por ello que los modelos de simulación
expresados a través de esta técnica, se basan en considerar las operaciónes del sistema como una
secuencia temporal y ordenada de eventos incondicionales.
Los eventos son acciones instantáneas que pueden cambiar el estado del modelo. Estos instantes
coinciden normalmente con el inicio o final de las actividades (por ejemplo, el inicio del transporte de
una pieza y el final del transporte). Según Guash et al. (2005) [8] la principal característica de esta
estrategia de simulación es que tan sólo pueden codificarse las rutinas de tratamiento de eventos no
CAPITULO 2
22
condicionados. Puesto que los sistemas que se quieren simular presentan tanto eventos no
condicionados como eventos condicionados, el código asociado a estos últimos se deberá incluir en el
código de tratamiento de eventos no condicionados.
Después de inicializar el modelo, el código ejecutivo explora todos los futuros eventos no
condicionados y mueve el reloj de la simulación hasta el evento no condicionado más cercano en el
tiempo (el próximo evento). A continuación, llama al código asociado al evento para efectuar los
cambios en el modelo provocados por el evento. Estas acciones incluyen efectuar los cambios
derivados del evento, que pueden corresponder al inicio de una actividad y a la planificación de un
evento no condicionado asociado al final de la actividad.
El mecanismo para garantizar que todos los eventos se ejecutan en orden cronológico se basa en el
mantenimiento de la lista de eventos futuros (LEF). Esta lista contiene una entrada para todos los
eventos no condicionados que tienen planificada su ejecución en el futuro. En la realidad, la mayoría de
eventos no condicionados no se planifican, simplemente ocurren: por ejemplo la rotura de una máquina
o el fin del servicio a un cliente a una entidad bancaria; en el modelo, estos eventos representan el fin
de una actividad cuya duración está representada por una distribución estadística.
La longitud y el contenido de la LEF cambian continuamente a medida que la simulación progresa y,
por tanto, una buena gestión de la lista es fundamental para asegurar la eficiencia de la simulación. Las
operaciones principales que se realizan en la lista son la eliminación del evento no condicionado que se
acaba de ejecutar (el primero de la lista), la adición de un evento no condicionado y, ocasionalmente, la
eliminación de un evento no condicionado.
Algoritmo:
En la tabla siguiente se muestra el pseudocódigo ejecutivo para un algoritmo de programación de
eventos. El primer bloque de código corresponde a la inicialización de la simulación. Los aspectos
principales que se deben inicializar son:
1. El tiempo de inicio y final de la simulación respecto al tiempo 0 de referencia.
CAPITULO 2
23
2. El reloj de la simulación al tiempo de inicio.
3. Cálculos para obtener el estado inicial.
4. La LEF, almacenando en ella los eventos no condicionales iniciales.
5. Extraer el primer evento de la LEF y avanzar el reloj hasta el tiempo de este evento.
El segundo bloque corresponde al código repetitivo consistente en ejecutar el código asociado al evento
extraído, extraer el nuevo evento más inminente de la LEF y en avanzar el reloj de la simulación hasta
el tiempo de este nuevo evento.
Tabla 2.2: Código ejecutivo de la programación de eventos Las tareas usuales que ejecuta el código para cada tipo de evento son:
• Actualizar el estado del sistema.
• Obtener información sobre el comportamiento del sistema para actualizar las estadísticas.
• Generar nuevos eventos no condicionados, actualizar la LEF y activar eventos condicionados. Los
eventos no condicionados pueden ser, por ejemplo, el final de la actividad. Estos eventos precisan,
generalmente, la obtención del tiempo futuro en que ocurrirá el evento a partir de las distribuciones
CAPITULO 2
24
de probabilidad. Si se activan eventos condicionados, la ejecución del evento se puede hacer desde
este mismo bloque de código o se puede llamar a otro bloque de código (rutina) que maneja el
evento condicionado.
Tabla 2.3: Código de evento de la programación de eventos
2.3.2 Exploración de Actividades.
En este enfoque se presta mayor atención al conjunto de actividades que tienen que ejecutar cada una o
lote de entidades (personas, mensajes, piezas) presentes en el sistema, identificando así el conjunto de
condiciones que permiten que suceda la actividad y la naturaleza de estas. Bajo este esquema el
modelador, se concentra en el conjunto de condiciones que permite iniciar una actividad.
Según Pooch y Wall (2000) [14], una de las debilidades principales de este enfoque es la necesidad de
tener un incremento de tiempo reducido ya que; en caso contrario, eventos que están separados en el
tiempo puedan aparecer simultáneamente en el simulador. Por tanto, este incremento de tiempo tiene
que ser lo suficientemente pequeño para que dos eventos separados en el tiempo también aparezcan
separados en la simulación. Debido a ello y otros factores, este enfoque ha evolucionado hacia la
denominada estrategia de tres fases, la cual combina el incremento de tiempo propio de la
programación de eventos con la exploración de actividades. En la actualidad, esta evolución se sintetiza
en los siguientes pasos:
• Extraer de la lista de eventos futuros el evento más próximo a suceder, avanzar el reloj de la
simulación hasta ese tiempo y extraer el resto de eventos de la lista de eventos futuros que
tienen el mismo tiempo.
CAPITULO 2
25
• Ejecutar todos los eventos extraídos, del paso anterior. Recordar que estos eventos son
incondicionales. En esta fase se pueden liberar recursos y/o cambiar el estado del sistema.
• Buscar todas aquellas actividades asociadas a eventos condicionados para ejecutar las que
cumplen todas las condiciones. Esta búsqueda se repite hasta que no haya ninguna actividad
adicional.
Es de notar que, a través de esta nueva visión de tres fases, del enfoque de exploración de actividades,
se separan claramente las actividades ligadas a eventos incondicionados de los condicionados.
2.3.3 Interacción de Procesos.
Aquí el enfoque se basa en la entidad que fluye por el proceso. En donde, el proceso es definido como
todo el ciclo de vida de la entidad que fluye a través del sistema. En esta técnica, se diferencian las
entidades temporales (piezas, clientes, mensajes) que se mueven en el sistema, de las entidades
permanentes o también llamadas recursos (grúas, máquinas, cajeros).
A través de este paradigma el analista define la situación (modelo) a resolver, desde el punto de vista de
las entidades temporales que llegan al sistema, demandando múltiples recursos de capacidad limitada,
esperando en colas si los recursos están ocupados o retardándose cierta cantidad de tiempo en la
utilización del recurso.
Según Guash et al. (2005) [8], la popularidad de este enfoque radica en describir el modelo de
simulación con bloques de alto nivel en los cuales la interacción de los procesos es tratada directamente
por la herramienta de simulación, para así ahorrar gran cantidad de tiempo en la etapa de implantación
del modelo. Estas herramientas manipulan los eventos incondicionales de la lista de eventos futuros, tal
como se realiza en el enfoque de programación de eventos (explicada previamente).
En el desarrollo de este proyecto se utilizará el enfoque basado en la interacción de procesos, por ser
este el pilar fundamental en el cual está sustentado el simulador SimPy, a través del Método de
CAPITULO 2
26
Ejecución de Procesos (PEM Process Execution Method)
2.4 Simulación Orientada a Objetos.
Recientemente ha comenzado un gran interés por la Simulación Orientada a Objetos. Esto,
probablemente, como consecuencia del gran interés en general por la programación orientada a objetos.
Según Law y Kelton (2000) [7] la programación y la Simulación Orientada a Objetos, nacieron de
SIMULA: que es un lenguaje de simulación orientado a objeto, creado en los años de 1960, por Kristen
Nygaard y Ole-Johan Dahl del Centro Noruego de Computación en Oslo, y según Fernández (2005) [9]
su desarrollo se extendió desde 1962 a 1967.
Partiendo de las ideas planteadas con la creación de Simula, la Simulación Orientada a Objetos,
considera que el sistema a simular, está compuesto de objetos (por ejemplo clientes), los cuales
interaccionan con otros objetos a través del tiempo. En el sistema, pueden existir varias instancias de
ciertos tipos de objetos (por ejemplo entidades), actualmente presentes durante la ejecución de la
simulación. Estos objetos contienen datos (atributos) que se emplean para describir su estado en un
punto particular en el tiempo. También poseen métodos; estos describen las acciones que son capaces
de ejecutar los objetos. De acuerdo a Law y Kelton (2000) [7] los datos de un objeto únicamente
pueden cambiar a través de sus propios métodos. Lo antes expuesto es lo que se conoce hoy día como
el paradigma de programación orientada a objetos.
2.5 Software de Simulación.
Destacando el orden de ideas antes expuestas sobre las características que deben presentar los
simuladores de sistemas orientados a eventos discretos, es posible pensar que, cualquier lenguaje de
programación podría ser utilizado para simular el comportamiento de estos sistemas, aunque ello va a
depender en alto grado de la estrategia adoptada y de las virtudes presentadas por el lenguaje
seleccionado. Es por ello, que la mayoría de las herramientas de simulación actuales ofrecen los
módulos de simulación necesarios para programar de forma rápida y habilidosa un modelo. Según
Zeigler et al. (2000) [10] las características como programación de eventos, exploración de actividades
CAPITULO 2
27
e interacción de procesos presentes en los diferentes paquetes de simulación actuales reducen
considerablemente el tiempo de programación del modelo y en añadidura el mantenimiento del mismo
se ve enormemente simplificado.
En virtud de lo anterior, en la rama de la simulación de sistemas orientados a eventos discretos, existen
los llamados “Lenguajes de Propósito General”, que son los lenguajes de programación
convencionales (por ejemplo Pascal, Fortran, C++, Python). “Lenguajes de Simulación de Propósito
General”, al igual que el anterior son lenguajes de programación, con la distinción que ya poseen
módulos programados con características específicas para la simulación (por ejemplo GPSS, Simscript,
Siman,), que aparecieron a partir de 1960.
“Paquetes de Simulación de Propósito General”, aparte de poseer módulos específicos para
simulación, estos integran capacidades de animaciones para la simulación e informes de resultados
(informes estándar o específicos, tabulares o gráficos, accesos a muestras individuales), permiten
definir el modelo empleando un dialogo. A pesar de todas estas ventajas que pueden presentar los
paquetes de simulación, estos poseen un elevado costo de adquisición (licencia para su uso). Debido a
la gran popularidad que ha tomado la simulación en el campo empresarial, ciertas corporaciones se han
dedicado a la construcción y mantenimiento de estas herramientas, haciéndolas privativas y de difícil
acceso para el ámbito académico.
A pesar que los lenguajes de programación disponen de librerías de simulación completas para
implantar cualquier tipo de modelo (continuo o discreto) por complejo que este sea, requieren de una
gran inversión de tiempo y además de un conocimiento exhaustivo por parte del analista (modelador)
sobre el lenguaje empleado. Por su parte, según Hoeger (2000) [4] los lenguajes y paquetes de
simulación tienen como objetivo primordial facilitar el uso de la simulación en la etapa de
programación del modelo y permiten al analista concentrarse en aspectos específicos del sistema. El
código de estos es modular, fácil de leer y proveen herramientas para la depuración de errores, a través
del trazado de sus corridas y experimentos con el modelo.
El constante desarrollo que han presentado los lenguajes de simulación desde su creación, se
caracteriza por la variedad de opciones que muestran, ya que son empleados para fines específicos.
CAPITULO 2
28
Entre los más conocidos se pueden mencionar: General Purpose Simulation System (GPSS
desarrollado por G. Gordon en la IBM en el año de 1961), Simulation Analysis (SIMAN, creado a
mediados de 1960 por el centro Noruego de Computación), SIMULA67 (Creado por los mismos
autores de Simula Kristen Nygaard y Ole Johan Dahl), GLIDER (Creado durante los años 1991-1996,
en la Universidad de los Andes por IEAC & CESIMO), Simscript II.5 y SLAM por mencionar algunos.
2.6 Python.
De acuerdo con Wikipedia (2009) [11] Python es un lenguaje de programación creado por Guido van
Rossum en el año 1990. Actualmente este lenguaje es comparado con TCL, Perl, Scheme, Java y Ruby.
Python ha sido desarrollado como un proyecto de código abierto, administrado por la Python Software
Foundation.
Los nuevos usuarios de Python consideran a este mucho más limpio y elegante para programar. Este
lenguaje de programación permite dividir el programa en módulos reutilizables desde otros programas
Python. Viene con una gran colección de módulos estándar que se pueden utilizar como base de los
programas (o como ejemplos para empezar a aprender Python). También hay módulos incluidos que
proporcionan E/S de ficheros, llamadas al sistema, sockets y hasta interfaces a GUI (interfaz gráfica
con el usuario) como Tk, GTK, Qt entre otros.
Python es un lenguaje interpretado, lo que ahorra un tiempo considerable en el desarrollo del programa,
pues no es necesario compilar ni enlazar. El intérprete se puede utilizar de modo interactivo, lo que
facilita experimentar con características del lenguaje, escribir programas desechables o probar
funciones durante el desarrollo del programa. También es una calculadora muy útil. El nombre del
lenguaje proviene de la afición de su creador original, Guido van Rossum, por los humoristas británicos
Monty Python.
2.7 SimPy (Simulador en Python).
Según sus propios autores Muller (2003) [12] y Vignaux, SimPy nace en el año 2002, bajo las ideas de
Simulación Orientada a Objetos, las cuales fueron introducidas por SIMULA en la década de los 60.
CAPITULO 2
29
Bajo esta premisa y combinando las ideas de SIMULA y Simscript y empleando el estándar de Python,
el Dr. Klauss Müller (con experiencia en la programación con Simula) y Tony Vignaux (Programador
de Simscript) crean SimPy.
2.7.1 Concepto.
Según Racero (2004) [5] SimPy es un sistema de simulación de eventos discretos basado en Python.
Usa procesos paralelos para modelar componentes activos tales como mensajes, individuos, piezas.
Proporciona un gran número de herramientas para el analista del modelo y una interfaz que puede ser
manejada en plataformas Windows y en distribuciones GNU/Linux. Incluye los procesos de las
entidades a través de la creación de objetos de tipo Proceso (Process) y tres tipos de objetos recursos:
Recursos, Niveles y Almacenes (Resources, Level and Stores). Además, formas de almacenar las
estadísticas de la simulación, usando Monitor y Tally.
2.7.2 Características Generales.
Los elementos básicos de un modelo en SimPy son objetos de tipo proceso (por ejemplo, objetos de
una clase Process). Estos son retardados por tiempos fijos o aleatorios de acuerdo a las especificaciones
del modelo conceptual y colocados en cola para el uso de algunos de los recursos.
Un script de SimPy contiene la declaración de una o más instancias de procesos y la creación de una
serie de objetos a partir de estos. Cada objeto proceso ejecuta su Método de Ejecución de Proceso
(PEM: Process Execution Method). Cada PEM se ejecuta en paralelo invocando las diferentes rutinas
de los subprocesos y, además puede interactuar con varios PEM de otros objetos de tipo Process.
El paquete está formado por un conjunto de módulos escritos en Python, los cuales se mencionan a
continuación:
• Simulation: Es el Módulo que tiene implementada las definiciones de las clases y métodos para
los objetos Process (Procesos) y Resources (Recursos), empleados en los modelos de
simulación.
CAPITULO 2
30
• Monitor: Módulo para la compatibilidad de versiones anteriores a SimPy (por ejemplo la
versión 1.7.1 con la 1.6).
• SimulationTrace: Módulo que implementa las trazas para los eventos.
• SimulationRT: Módulo para controlar la velocidad de la Simulación a través de la
sincronización de los eventos.
• SimulationStep: Módulo para realizar la Simulación paso a paso a través del seguimiento de
los eventos.
• SimPlot: Módulo que permite realizar gráficas de estadísticas durante la simulación. Está
basado en la librerías Tk/Tkinter.
• SimGui: Este Módulo provee las herramientas para implementar el modelo de simulación con
interfaces gráficas de usuario (GUI). Al igual que el módulo SimPlot, SimGUI está basado en
las librerías Tk/Tkinter.
• Lister: Módulo empleado para darle un mejor formato de impresión a los objetos SimPy
empleados por el modelo.
2.7.3 Enfoque para la implantación de un Modelo en SimPy.
De acuerdo a Muller (2003) el diseño del programa debería arrancar con un escenario que describa la
situación a ser simulada. En este escenario se deben identificar los actores, sus acciones y los recursos
que ellos necesitan. En el diseño, se deben escribir los ciclos de vida de los actores. Más importante
aún, se deben definir cuáles son los resultados que se desean obtener de la simulación. Al lograr una
comprensión del modelo conceptual a través de un análisis del mismo, se debe comenzar a implementar
el código, empleando comentarios que expresen lo que hacen las diferentes sentencias (se debe
recordar emplear el enfoque de las seis secciones discutido previamente).
CAPITULO 2
31
En la primera etapa del desarrollo se recomienda utilizar SimPy.SimulationTrace en lugar de
SimPy.Simulation, esto permite hacer trazas de la simulación y además ganar visión de cómo los
procesos, eventos e interacciones están funcionando dentro de los comandos de SimPy.
Para realizar validaciones dentro del programa SimPy que aseguren sincronizaciones entre múltiples
procesos paralelos se utiliza la sentencia assert de Python.
Un ejemplo sencillo de un modelo en SimPy se muestra a continuación:
from SimPy.Simulation import * import random ## Model components class pieza(Process): pzlist=0 def proceso(self,factory): yield request,self,factory.maquina yield hold,self,tpintado yield release,self,factory.maquina pieza.pzlist+=1 yield put,self,factory.almacen,[pieza.pzlist] print "\n",now(),"Pieza ",pieza.pzlist, " Terminada y Colocada en Deposito \n" class declaracion: maquina=Resource(name="Maquina Pintadora",unitName="Unidad",capacity=1, qType=FIFO,preemptable=False,monitored=True,monitorType=Monitor) almacen=Store(name="Almacen",unitName="units",capacity=10,initialBuffered=[], putQType=FIFO,getQType=FIFO,monitored=True,monitorType=Monitor) ## Model def model(): initialize() for pzname,arrivaltime in piezaslist: pz=pieza(name=pzname) activate(pz,pz.proceso(factory=declaracion),at=arrivaltime) simulate(until=simtime) ## Experiment data piezaslist=[("Pieza 1",0),("Pieza 2",0.5),("Pieza 3",1.0)] tpintado=random.uniform(10,13); simtime=100 ## Experiment model() ## Analysis/output print "Las Piezas terminaron su proceso en el tiempo %s"%now(),"\n"
2.8 Procesos Productivos.
Según Elegibles.net. Simulación de procesos (2009) [19] existe una maravillosa herramienta para
ayudarnos al óptimo diseño tanto de operaciones como de procesos, de muy diversa naturaleza. Esta
CAPITULO 2
32
herramienta es la simulación de los procesos. Para la realización de tales simulaciones existen varios
caminos, a saber, el matemático, los modelos físicos a escala o en esquemas y la simulación con
programas informáticos de modelado y simulación.
Según MIPYMEs. (2009) [16] los procesos productivos pueden definirse como:
“Secuencia de actividades requeridas para elaborar un producto (bienes o servicios), por medio del
uso de recursos físicos, tecnológicos, humanos, etc. Y colocarlos a disposición de los clientes en
condiciones ventajosas de precio, calidad y oportunidad. Un proceso productivo incluye acciones que
ocurren en forma planificada y producen un cambio o transformación de materiales, objetos o
sistemas, al final de los cuales obtenemos un producto.”
Generalmente existen varios caminos que se pueden tomar para producir un producto, ya sea este un
bien o un servicio. Pero la selección cuidadosa de cada uno de sus pasos y la secuencia de ellos
ayudarán a lograr los principales objetivos de producción.
1º. Costos (eficiencia)
2º. Calidad
3º. Confiabilidad
4º. Flexibilidad
Una decisión apresurada al respecto nos puede llevar al “caos” productivo o a la ineficiencia.
2.8.1 El proceso.
De acuerso al portal Wikipedia. (http://es.wikipedia.org/wiki/Proceso_Productivo) (2009) [17] los
procedimientos definen la secuencia lógica de las actividades que se deben de realizar para la ejecución
del proceso. ¿Cómo se hace?, ¿Qué se utiliza? y ¿Quiénes lo realizan?
El diseño de un proceso se debe enfocar para proporcionar los mejores resultados en cuanto a eficiencia
del mismo; es decir, debe estar diseñado de tal forma que los resultados que se obtengan consuman la
menor cantidad de recursos posible.
CAPITULO 2
33
Las organizaciones establecen los procesos a desarrollar de acuerdo a los bienes o servicios que se
desean suministrar a los usuarios, es decir una empresa de servicios de telefonía debe establecer
procesos enfocados a la atención y satisfacción de sus usuarios.
Un proceso puede ser definido como un conjunto de actividades enlazadas entre sí que, partiendo de
uno o más inputs (entradas) los transforma, generando un output (resultado). Las actividades de
cualquier organización pueden ser concebidas como integrantes de un proceso determinado. De esta
manera, cuando un cliente entra en un comercio para efectuar una compra, cuando se solicita una línea
telefónica, un certificado de empadronamiento, o la inscripción de una patente en el registro
correspondiente, se están activando procesos cuyos resultados deberán ir encaminados a satisfacer una
demanda. Desde este punto de vista, una organización cualquiera puede ser considerada como un
sistema de procesos, más o menos relacionados entre sí, en los que buena parte de los inputs serán
generados por proveedores internos, y cuyos resultados irán frecuentemente dirigidos hacia clientes
también internos. Esta situación hará que el ámbito y alcance de los procesos no sea homogéneo,
debiendo ser definido en cada caso cuando se aborda desde una de las distintas estrategias propias de la
gestión de procesos. Quiere esto decir que, a veces, no es tan evidente dónde se inicia y dónde finaliza
un proceso, siendo necesario establecer una delimitación a efectos operativos, de dirección y control
del proceso. Un proceso puede ser realizado por una sola persona, o dentro de un mismo departamento.
Sin embargo, los más complejos fluyen en la organización a través de diferentes áreas funcionales y
departamentos, que se implican en aquél en mayor o menor medida. El hecho de que en un proceso
intervengan distintos departamentos dificulta su control y gestión, diluyendo la responsabilidad que
esos departamentos tienen sobre el mismo. En una palabra, cada área se responsabilizará del conjunto
de actividades que desarrolla, pero la responsabilidad y compromiso con la totalidad del proceso
tenderá a no ser tomada por nadie en concreto. Evidentemente, la organización funcional no va a ser
eliminada. Una organización posee como característica básica precisamente la división y
especialización del trabajo, así como la coordinación de sus diferentes actividades, pero una visión de
la misma centrada en sus procesos permite el mejor desenvolvimiento de los mismos, así como la
posibilidad de centrarse en los receptores de los outputs de dichos procesos, es decir en los clientes. Por
ello, tal vez la gestión por procesos es un elemento clave en la Gestión de la Calidad.
CAPITULO 2
34
2.8.2 Clasificación de los Procesos y Características.
Según MIPYMEs. (2009) [16] los procesos se pueden clasificar:
a. Según el tipo de flujo del producto
a.1. En Línea
a.2. Intermitente
a.3. Por proyecto
b. Según el tipo de servicio al cliente
b.1 Fabricación para inventarios
b.2 Fabricación para surtir pedidos
La selección de cada una de estas clasificaciones es estratégica para la empresa, pues unas elevan los
costos, otras pueden mejorar la calidad, otras mejoran el servicio rápido al cliente y otras nos permiten
atender cambios rápidos de productos.
2.8.2.1 Proceso Lineal o por Producto.
Según MIPYMEs. (2009) [16] este se caracteriza por que se diseña para producir un determinado bien
o servicio; el tipo de la maquinaria, así como la cantidad de la misma y su distribución se realiza en
base a un producto definido.
Logrando altos niveles de producción debido a que se fabrica un solo producto, su maquinaria y
aditamentos son los más adecuados, cada operación del proceso y el personal puede adquirir altos
niveles de eficiencia, debido a que su trabajo es repetitivo. Su administración se enfoca a mantener
funcionando todas las operaciones de la línea, a través de un mantenimiento preventivo eficaz que
disminuya los paros y un mantenimiento de emergencia que minimice el tiempo de reparación, pues el
CAPITULO 2
35
paro de una máquina ocasiona un cuello de botella que afecta a las operaciones posteriores y en
algunos casos paraliza las siguientes operaciones.
También es muy importante seleccionar y capacitar adecuadamente al personal, que debe poseer la
habilidad potencial suficiente de acuerdo a la operación para la cual fue asignado.
Se le recomienda un control permanente de producción en cada etapa del proceso, para detectar a
tiempo problemas que puedan paralizar la línea.
Ventajas:
1- Altos niveles de eficiencia
2- Necesidad de personal con menores destrezas, debido a que hace la misma operación
Desventajas:
1-Difícil adaptación de la línea para fabricar otros productos
2-Exige bastante cuidado para mantener balanceada la línea de producción
Se recomienda su uso cuando se fabricará un solo producto o varios productos con cambios mínimos.
2.8.2.2 Proceso Intermitente (Talleres de Trabajo).
Se caracterizan por la producción por lotes a intervalos intermitentes y se organizan en centros de
trabajo en los que se agrupan las máquinas similares. Ej.: área de máquina Ranas, área de planas, área
de botones, etc. Un producto fluirá hacia los departamentos o centros que necesite y no utilizará los
otros.
2.8.3 Medidas de comportamiento en Procesos Productivos.
De acuerdo a lo expuesto por Guash et al. (2005) [8] los métodos empleados para medir el
comportamiento del modelo deben ser los mismos que los empleados en el sistema real (o a la inversa);
en caso contrario puede ser difícil validar el correcto funcionamiento del modelo. Para el conjunto de
CAPITULO 2
36
medidas que se presentan a continuación, es importante registrar los valores promedios y la dispersión
respecto a estos promedios:
• régimen de producción
• tiempo en el sistema de los productos fabricados
• tamaño y tiempo de espera en las colas de los distintos puestos de trabajo
• tiempo de respuesta de los sistemas de manipulación de materiales
• grado de utilización de los equipos y trabajadores
Es de destacar que la optimización o mejora de una de estas medidas causa generalmente el
empeoramiento de otra medida. Por ejemplo, si se reducen los tiempos de espera promedios en las
colas es probable que también se reduzca el grado de utilización de los equipos.
2.8.4 Cómo se organiza un Sistema Productivo.
En esta sección se muestra como está organizado un proceso productivo; según el portal de internet
Gestiopolis. Organización de los sistemas productivos (2009) [18].
Producción: Se ocupa específicamente de la actividad de producción de artículos, es decir, de su
diseño, su fabricación y del control del personal, los materiales, los equipos, el capital y la información
para el logro de esos objetivos.
Operaciones: Es un concepto más amplio que el de producción. Se refiere a la actividad productora de
artículos o servicios de cualquier organización ya sea pública o privada, lucrativa o no. La gestión de
operaciones, por tanto, engloba a la dirección de la producción.
CAPITULO 2
37
Producto: Es el nombre genérico que se da al resultado de un sistema productivo y que puede ser un
bien o un servicio. Un servicio es una actividad solicitada por una persona o cliente.
2.8.5 Componentes de un Proceso Productivo.
Según Guash et al. (2005) [8] la mayoría de procesos productivos manejan recursos como equipos o
trabajadores, y material para procesar. La disponibilidad de estos recursos está generalmente gobernada
por horarios regulares de trabajo, por paradas programadas de mantenimiento y por la presencia
aleatoria de averías, según.
En muchos casos, los sistemas de manipulación de materiales pueden afectar de forma significativa el
comportamiento del proceso. En este grupo incluimos los vehículos autoguiados (AGV), las cintas
transportadoras, los toros o los puentes grúa.
Tanto el flujo de materiales, como los recursos o los sistemas de manipulación de materiales están
gobernados por sistemas de control especializados. El modelado correcto de estos sistemas de control
es uno de los retos principales para obtener un buen modelo de un proceso productivo.
En muchos procesos productivos, el espacio para el almacenamiento temporal (buffers) es limitado y
puede llegar a ser un cuello de botella del proceso productivo.
El material a ser procesado (piezas) suele tener asociado una orden de fabricación que indica la ruta
que debe seguir a través del proceso productivo. El conjunto de posibles rutas en un proceso productivo
puede llegar a formar una red compleja en la que deben formalizarse correctamente nodos de
sincronización (operaciones de ensamblado), así como nodos de bifurcación para representar la
independencia entre tareas (operaciones en paralelo).
CAPITULO 2
38
2.8.6 Actividad Productiva.
El contenido de esta sección se ha tomado del portal de internet www.estrucplan.com.ar.
Calidad.(2009) [20].
Producir es transformar unos bienes o servicios (factores de producción o inputs) en otros bienes o
servicios (outputs o productos). Producir es también crear utilidad o aumentar la utilidad de los bienes
para satisfacer las necesidades humanas.
Entonces podemos decir que la actividad productiva no se limita a la producción física. Estas
actividades se denominan actividades económicas productivas y son aquellas que consiguen que el
producto tenga un mayor valor.
El concepto de producción se divide en:
• Producción en sentido genérico, económico o amplio: es la actividad económica global que
desarrolla un agente económico por la que se crea un valor susceptible de transacción.
• Producción en sentido específico, técnico-económico o estricto: es la etapa concreta de la actividad
económica de creación de valor que describe el proceso de transformación.
2.8.7 Función de producción.
De acuerdo al articulo consultado en el portal de internet www.estrucplan.com.ar. Calidad. [20] es
aquella parte de la organización que existe fundamentalmente para generar y fabricar los productos de
la organización. La función de producción a su vez está formada por:
• Proceso de transformación. Según el portal de internet www.estrucplan.com.ar. Calidad. [20] es el mecanismo de
conversión de los factores o inputs en productos u outputs y está compuesto por:
• Tarea: es una actividad a desarrollar por los trabajadores o máquinas sobre las materias primas.
CAPITULO 2
39
• Flujo:
■ Flujo de bienes: son los bienes que se mueven de: una tarea a otra tarea; una tarea al
almacén; el almacén a una tarea.
■ Flujos de información: son las instrucciones o directrices que se trasladan.
• Almacenamiento: se produce cuando no se efectúa ninguna tarea y el bien o servicio no se
traslada.
2.8.8 Sistemas de manipulación de materiales.
De acuerdo a Guash et al. (2005) [8] la simulación se emplea a menudo para el análisis y mejora de los
sistemas de manipulación y almacenamiento de materiales. En muchos procesos industriales, el tiempo
que se emplea manipulando una pieza es generalmente igual o superior al tiempo de proceso.
Adicionalmente, el elevado coste de estos sistemas combinado con la necesidad de integrar de forma
efectiva equipos de diferentes proveedores hace conveniente el empleo de técnicas de simulación para
evaluar la interacción entre los distintos sistemas de manipulación y, por supuesto, asegurar su correcto
funcionamiento.
Los aspectos más importantes que se deben tener en cuenta en el modelado y la simulación de sistemas
de manipulación de materiales son:
•••• Tipología del sistema de transporte: AGV (automated guided vehicles), cintas, toros, etc.
•••• Capacidad de los equipos: número de piezas que se pueden transportar a la vez.
•••• Velocidad de los equipos: también puede ser de interés incluir la aceleración y la
desaceleración.
CAPITULO 2
40
•••• Distribución en planta: por ejemplo, ¿cuál es la mejor distribución de una red de transporte de
AGV para conseguir transportar un determinado número de productos/hora?
Los sistemas de manipulación más empleados son:
• Cintas transportadoras: pueden transportar palets o piezas. Se pueden clasificar en acumulativas
y no acumulativas. En las no acumulativas, toda la cinta se detiene al cargar, al procesar sobre la
cinta o al descargar cada una de las piezas. En las acumulativas, las piezas se mueven mientras
no alcanzan un punto de paro u otra pieza.
• Vehículos de transporte: se pueden agrupar en vehículos que siguen una ruta (o conjunto de
rutas) prefijadas y los que tiene libertad para escoger el camino.
• Otros sistemas de manipulación son los sistemas de almacenamiento automático (AS/RS,
automated storage and retreival systems-), los puentes grúa o las estaciones de entrada/salida.
Los trabajadores también pueden ser considerados dentro del grupo del sistema de
manipulación de materiales si, por ejemplo, transportan piezas.
2.8.9 Transporte.
Según Guash et al. (2005) [8] el sector del transporte es un área con un interés creciente en las técnicas
de simulación, puesto que la mayor parte de herramientas disponibles (hojas de cálculo y paquetes de
optimización) no son adecuadas para resolver los problemas de coordinación de los distintos agentes
que intervienen en la manipulación, carga, descarga y transporte de material, los cuales inciden de
modo determinante en el rendimiento global del sistema.
Ejemplos de simulación se pueden encontrar en todos los modos de transporte. Muchas grandes
empresas del sector del transporte, ya sean aéreas, por ferrocarril, barco o camión, emplean la
CAPITULO 2
41
simulación para analizar sus operaciones. Las empresas transportadoras emplean la simulación para
racionalizar sus circuitos de transporte y planificar mejor sus operaciones. Los puertos, las compañías
de ferrocarril y las terminales aéreas emplean la simulación para determinar su capacidad y mejorar sus
operaciones.
2.8.10 Ejemplo simple de un proceso productivo.
En la siguiente sección del proyecto se muestra un ejemplo de un sistema de producción sencillo donde
se encuentran características como máquinas, transporte y medios de almacenamiento, donde cada
elemento representa un recurso del sistema que opera sobre las entidades que estén presentes en el
proceso, para obtener un producto final luego de una secuencia de actividades.
El siguiente ejemplo fue tomado de Guash et al. (2005) [8].
Considérese la línea de producción descrita en la figura 2.5, formada por las siguientes unidades de
producción: Dos robots: R1 y R2; Tres máquinas CNC: M1, M2 y M3; Dos unidades de
almacenamiento: S1 y S2.
El funcionamiento de la línea de producción es el siguiente:
1. El robot R1 realiza el transporte de las piezas almacenadas en S1 y las carga en la máquina
M1.
2. La máquina M1 realiza la primera operación sobre las piezas.
3. Una vez la máquina M1 ha finalizado la primera operación, el robot R2 transporta la pieza
procesada en M1 y la carga en la máquina M2 o en la máquina M3.
4. Una vez la máquina M2 o la máquina M3 ha finalizado la segunda operación, el robot R2
transporta la pieza finalizada al almacén de salida S2.
CAPITULO 2
42
Figura 2.5: Línea flexible de fabricación.
2.9 Librería de Programación.
Segun Wikipedia. Bilioteca (Informatica) (2009)[21], se puede definir una biblioteca (o librería) en
ciencias de computación, como un conjunto de subprogramas utilizados para desarrollar software. Las
bibliotecas contienen código y datos, que proporcionan servicios a programas independientes, es decir,
pasan a formar parte de estos. Esto permite que el código y los datos se compartan y puedan
modificarse de forma modular. Algunos programas ejecutables pueden ser a la vez programas
independientes y bibliotecas, pero la mayoría de estas no son ejecutables. Ejecutables y bibliotecas
hacen referencias (llamadas enlaces o links) entre sí a través de un proceso conocido como enlace (o
link), que por lo general es realizado por un software denominado enlazador o linker.
Se puede decir que una librería es en general un conjunto de recursos que pueden ser reutilizados para
la construcción de diferentes aplicaciones. Normalmente es código que contiene funciones que son
frecuentemente utilizadas y que no necesita ser modificado, solo es necesario pasarle los parámetros
necesarios para que la librería los procese y devuelva un resultado deseado.
CAPITULO 3
43
Capítulo 3
Desarrollo de la Librería de Simulación.
En esta sección del proyecto se da inicio a la parte principal del mismo, el desarrollo de una librería que
será utilizada por los distintos modelos de simulación de procesos de producción y prestación de
servicios. Para el desarrollo de esta se toman en cuenta los componentes o características que son
comunes a todos los procesos de producción o de prestación de algún servicio, esta librería será
desarrollada bajo la metodología del lenguaje de programación Python, utilizando los métodos del
mismo y ejecutando comandos del paquete de simulación SimPy, en ella se programan las
características y actividades de los componentes comunes de los procesos productivos y servicios que
se desean simular.
Se desea desarrollar una librería común que contenga las características de los procesos productivos y
de servicios en general, como son maquinarias, transporte, sistemas de servicios, generación de
llegadas, generación de números aleatorios, almacenes. De manera tal que los modelos de simulación
de dichos procesos que requieran utilizar algunos componentes de los procesos de producción y
servicio deberán invocar la librería que se desea desarrollar. Ya que esta contiene los módulos que
representan las características comunes a todos los procesos productivos y servicios.
La librería de simulación que se desea desarrollar estará constituida por una clase (en programación es
la definición de un objeto), la cual a su vez estará conformada por varias funciones como maquinas,
transporte, sistemas de servicios, genreracion de llegadas, generación de números aleatorios,
almacenes; donde cada función representa un elemento presente en los procesos de producción y
CAPITULO 3
44
servicios en general. En cada función estará presente la declaración de las variables que debe recibir la
misma al momento de ser invocada, así como también la asignación de los valores recibidos por dicha
función a otra variable, la cual será devuelta por la función al modelo que haga el llamado a la librería.
Una vez desarrollada, esta librería no será modificada, solamente llamada por cada modelo de
simulación de sistemas de producción y de servicio pasándole parámetros y recibiendo de ella un valor
o un conjunto de valores requeridos por el modelo de simulación.
A continuación se explica el proceso de construcción de los módulos que conformaran la librería:
3.1 Módulo Máquina.
Uno de los componentes presentes en la mayoría de los procesos de producción son las máquinas, las
cuales están destinadas a realizar una actividad específica del proceso. El primer módulo de la librería
se llama maquina, y modela las máquinas usadas en los procesos de producción, las cuales son un
componente muy útil y común a todos los procesos productivos en general, y está conformado por una
función de Python, la cual contiene la declaración de las variables que son necesarias para hacer la
declaración de un recurso modelado con SimPy, esta es una función que recibe varios parámetros,
como son:
nombre: representa el nombre que se le asignará a la máquina que se que se desea definir y será
definido por el usuario.
nombreunidadmaq: representa el nombre que se le asignará a una unidad del recurso máquina y será
definido por el usuario.
capacidad: indica la capacidad del recurso máquina, es decir, la cantidad de recursos de este tipo
presentes en el modelo, y este parámetro también es definido por el usuario.
tipo_cola: especifica la disciplina de la cola que contiene la lista de entidades que esperan ocupar la
máquina, también es definido por el usuario.
CAPITULO 3
45
solic_prioridad: es un valor booleano que indica si la máquina es solicitada con prioridad, este valor es
definido por el usuario.
monit: es un valor booleano (False o True) que indica si la información se monitorea en base a los
tamaños de waitQ y activeQ del recurso máquina, es decir, en base a las colas de entidades en espera y
entidades actualmente en proceso respectivamente, es definido por el usuario.
tipo_monitor: es un objeto que indica el tipo de seguimiento o registro que se hace a la máquina,
puede ser monitor o tally, esto de acuerdo al tipo de registro que se desee utilizar para almacenar
estadísticas de la simulación, también es definido por el usuario.
Los valores de estos parámetros son recibidos por el módulo maquina al ser invocado y son
almacenados en la variable recursom la cual es un objeto del tipo Resource, que realiza la definición
del recurso máquina que será usado por el modelo, y luego la función devuelve la variable que contiene
esta declaración del recurso máquina.
Es importante señalar que este es un módulo de uso general y que permite modelar también la acción
de operadores humanos, entendidos en el sentido general de una estación de trabajo.
La parte del código de la librería que simula el recurso máquina con sus parámetros se presenta a
continuación:
#definición del modulo para la declaración del recurso maquina def maquina(self,nombre,nombreunidadmaq,capacidad,tipo_cola,solic_prioridad,monit,tipo_monitor): nombre_maquina=nombre nombre_unidad_maq=nombreunidadmaq capacidad_maquina=capacidad tipo_de_cola=tipo_cola solicit_prioridad=solic_prioridad mon=monit tipomon=tipo_monitor recursom=Resource(name=nombre_maquina,unitName=nombre_unidad_maq,capacity=capacidad_ maquina,qType=tipo_de_cola,preemptable=solicit_prioridad,monitored=mon,monitorType=tipomon) return recursom
CAPITULO 3
46
3.2 Módulo Transporte.
De acuerdo a la bibliografía revisada y los sistemas de producción observados se puede decir que en los
procesos productivos en general hay una característica común, la cual es el uso de transporte, bien sea
para el traslado de la materia prima hacia los recursos, o el traslado de los productos elaborados hacia
algún destino determinado por el modelo, el siguiente módulo de la librería se llama transporte, el cual
realiza el modelo de este tipo de componente presente en los procesos productivos, este módulo, así
como el módulo máquina se representa mediante una función de Python que recibe unos parámetros y
devuelve una variable, este módulo recibe los siguientes parámetros:
nombretr: representa el nombre que se le asignará al sistema de transporte que se que se desea definir y
será definido por el usuario.
nombreunidadtrans: representa el nombre que se le asignará a una unidad del recurso transporte y este
también será definido por el usuario.
capacidadtr: indica la cantidad de recursos transporte que se desea definir en el modelo, y este
parámetro también es definido por el usuario.
tipo_colatr: este parámetro especifica la disciplina de la cola que contiene la lista de entidades que
esperan ser atendidos por el transporte, también es definido por el usuario.
solic_prioridadtrans: es un valor booleano que indica si el transporte es solicitado con prioridad, este
valor es definido por el usuario.
monittr: es un valor booleano (False o True) que indica si la información se monitorea en base a los
tamaños de waitQ y activeQ del recurso transporte, es decir, en base a las colas de entidades en espera
y entidades actualmente en proceso respectivamente, es definido por el usuario.
CAPITULO 3
47
tipo_monitortr: es un objeto que indica el tipo de seguimiento o registro que se hace al recurso
transporte, puede ser monitor o tally, esto de acuerdo al tipo de registro que se desee utilizar para
almacenar estadísticas de la simulación, también es definido por el usuario.
El módulo transporte recibe los parámetros cuando es llamado por algún modelo de simulación, y
almacena sus valores en la variable recursot de tipo Resource y esta realiza la definición del recurso
transporte que será usado por el modelo, el módulo devuelve la variable recursot, la cual contiene esta
declaración del recurso transporte.
La parte del código de la librería que simula el recurso transporte con sus parámetros se presenta a
continuación:
# definicion del modulo para la declaracion del recurso transporte def transporte(self,nombretr,nombreunidadtrans,capacidadtr,tipo_colatr,solic_prioridadtrans,monit tr,tipo_monitortr): nombre_transport=nombretr nombre_unidad_trans=nombreunidadtrans capacidad_transport=capacidadtr tipo_de_colatransport=tipo_colatr solicit_prioridadtrans=solic_prioridadtrans montransport=monittr tipomontransport=tipo_monitortr recursot=Resource(name=nombre_transport,unitName=nombre_unidad_trans,capacity=capacidad _transport,qType=tipo_de_colatransport,preemptable=solicit_prioridadtrans,monitored=monTrans port,monitorType=tipomontransport) return recursot
3.3 Simulación de una Línea de Producción.
En esta parte del proyecto se da inicio al desarrollo de un modelo de simulación de una línea de
producción, el cual hace uso de los dos módulos de la librería de simulación desarrollados
anteriormente. Los módulos máquina y transporte que han sido desarrollados hasta ahora estarán
incluidos en una clase que será llamada procesosproductivo, la cual estará incluida en un archivo que
será llamado procesos.py.
CAPITULO 3
48
El modelo que se desarrollará en esta sección describe las características de una “Línea de Producción
de una Embotelladora de Refrescos”. A continuación se describe el modelo:
En una planta embotelladora de refrescos se tienen botellas vacías y luego de su llegada al proceso de
embotellamiento estas deben pasar por ocho (8) respectivos procesos, los cuales son:
1. Lavado de las botellas.
2. Luego un medio de transporte lleva las botellas al proceso de secado.
3. Secado de las botellas
4. Luego un medio de transporte lleva las botellas a proceso de llenado.
5. Llenado de las botellas con el liquido respectivo, en este caso el refresco.
6. Tapado de las botellas.
7. Colocación de la etiqueta en la botella.
Cada botella que llega al sistema, debe pasar por cada proceso en el orden mencionado anteriormente,
de forma tal que cada proceso es atendido por un recurso que realiza la respectiva actividad, los
recursos utilizados en este modelo son máquina y transporte. Las entidades tienen un tiempo específico
de actividad con cada recurso, el cual se muestra a continuación:
• Tiempo de lavado: tiempo aleatorio distribuido uniformemente entre 4 y 5 unidades de tiempo.
• Tiempo de transporte hasta el secado: 1 unidad de tiempo.
• Tiempo de secado: tiempo aleatorio distribuido uniformemente entre 2 y 4 unidades de tiempo.
CAPITULO 3
49
• Tiempo de transporte hasta el llenado: 1 unidad de tiempo.
• Tiempo de llenado: tiempo aleatorio distribuido uniformemente entre 2 y 3 unidades de tiempo.
• Tiempo de tapado: tiempo aleatorio distribuido uniformemente entre 1 y 2 unidades de tiempo.
• Tiempo de etiquetado: 1 unidad de tiempo.
Cada máquina en este modelo es un recurso que realiza una determinada actividad, igualmente los
medios de transporte realizan una actividad en el proceso, y las botellas son las entidades que utilizan
los recursos del sistema. El modelo de simulación de este proceso pide al usuario el número de botellas
(entidades) con las cuales se realizará la simulación y el modelo genera un tiempo aleatorio de llegada
distribuido uniformemente para cada botella. Al finalizar la simulación se muestra en que tiempo
finalizan las entidades su proceso.
El sistema se modela mediante la llamada a los recursos que están contenidos en el fichero procesos.py
y la declaración de las distintas variables necesarias y de los eventos que ocurren en el modelo.
A continuación se muestra el código de la simulación de este proceso en SimPy:
from SimPy.SimulationTrace import * from procesos import procesoproductivo ## Model components class producto(Process): productohecho=0 def product(self,factory): #eventos de las entidades con la maquina lavado #solicitar el recurso yield request,self,factory.lavado #ocupar el recurso yield hold,self,tlav #liberar el recurso yield release,self,factory.lavado #eventos de las entidades con el transporte 1 #solicitar el recurso yield request,self,factory.trans1 #ocupar el recurso yield hold,self,ttrans1 #liberar el recurso yield release,self,factory.trans1 #eventos de las entidades con el recurso secado #solicitar el recurso
CAPITULO 3
50
yield request,self,factory.secado #ocupar el recurso yield hold,self,tsec #liberar el recurso yield release,self,factory.secado #eventos de las entidades con el transporte 2 #solicitar el recurso yield request,self,factory.trans2 #ocupar el recurso yield hold,self,ttrans2 #liberar el recurso yield release,self,factory.trans2 #eventos de las entidades con el recurso llenado #solicitar el recurso yield request,self,factory.llenado #ocupar el recurso yield hold,self,tllen #liberar el recurso yield release,self,factory.llenado #eventos de las entidades con el recurso tapado #solicitar el recurso yield request,self,factory.tapado #ocupar el recurso yield hold,self,ttapad #liberar el recurso yield release,self,factory.tapado #eventos de las entidades con el recurso etiquetado #solicitar el recurso yield request,self,factory.etiquetado #ocupar el recurso yield hold,self,tetiqued #liberar el recurso yield release,self,factory.etiquetado producto.productohecho+=1 # imprimir por pantalla un aviso de finalización del proceso de un refresco print"\n****************************************************************" print "* El refresco Nro ",producto.productohecho," termino en el tiempo ",now()," *" print"****************************************************************\n" class llamada: # llamada a la libreria procesos.py # aquí se le pasan los parámetros al modulo maquina y al modulo transporte d=procesoproductivo() lavado=d.maquina("lavadora","Unidad",1,FIFO,False,True,Monitor) trans1=d.transporte("portacargas 1","Unidad",1,FIFO,False,True,Monitor) secado=d.maquina("secadora","Unidad",1,FIFO,False,True,Monitor) trans2=d.transporte("portacargas 2","Unidad",1,FIFO,False,True,Monitor) llenado=d.maquina("llenadora","Unidad",1,FIFO,False,True,Monitor) tapado=d.maquina("tapadora","Unidad",1,FIFO,False,True,Monitor) etiquetado=d.maquina("etiquetadora","Unidad",1,FIFO,False,True,Monitor) ## Model def model(): initialize() for prodname,arrivaltime in productolist: prod=producto(name=prodname) activate(prod,prod.product(factory=llamada),at=arrivaltime) simulate(until=simtime) ## Experiment data productolist = [] # solicita al usuario el numero de productos n=int(raw_input("\n Introduzca el numero de Refrescos: ")) # utiliza un for para asignar los valores a la tupla for i in range(n): cad, num = "Refresco " + str(i + 1),random.uniform(i,i+1)
CAPITULO 3
51
productolist.append((cad,num)) tim=random.Random() tlav=tim.uniform(4,5) ttrans1=1 tsec=tim.uniform(2,4) ttrans2=1 tllen=tim.uniform(2,3) ttapad=tim.uniform(1,2) tetiqued=1 simtime=100000 ## Experiment model() ## Analysis/output print "\n los Refrescos terminaron su proceso en %s"%now(),"Minutos\n"
Se observa que el modelo realiza la llamada a la clase procesosproductivos contenida en el archivo
procesos.py, esto debido a las bondades de la simulación orientada por objetos que brinda el lenguaje
de simulación SimPy. En el modelo se requiere el uso de recursos que están en la librería de simulación
de procesos productivos, por tal motivo se debe importar esta librería para poder hacer uso de dichos
recursos que están contenidos en ella.
Para ejecutar el programa en SimPy se hace igual que cualquier programa de Python y al ejecutar este
modelo de simulación el usuario debe introducir el número de refrescos con los cuales se realizara la
simulación, de esta manera:
Introduzca el número de Refrescos: 4
En este caso, se realiza la simulación con una llegada de 4 refrescos, y la salida de la simulación es la
siguiente:
Solo se mostrara una parte de la salida debido a que es muy extensa. 0.94527728558 request <Refresco 1> <lavadora> prio rity: default . . .waitQ: [] . . .activeQ: ['Refresco 1'] 0.94527728558 hold <Refresco 1> delay: 4.0368683329 1 1.26601135723 request <Refresco 2> <lavadora> prio rity: default . . .waitQ: ['Refresco 2'] . . .activeQ: ['Refresco 1'] 2.51931560557 request <Refresco 3> <lavadora> prio rity: default . . .waitQ: ['Refresco 2', 'Refresco 3'] . . .activeQ: ['Refresco 1'] 3.04540991313 request <Refresco 4> <lavadora> prio rity: default
CAPITULO 3
52
. . .waitQ: ['Refresco 2', 'Refresco 3', 'Refresco 4']
. . .activeQ: ['Refresco 1'] 14.3131910867 request <Refresco 1> <etiquetadora> priority: default . . .waitQ: [] . . .activeQ: ['Refresco 1'] 14.3131910867 hold <Refresco 1> delay: 1 15.3131910867 release <Refresco 1> <etiquetadora> . . .waitQ: [] . . .activeQ: [] *************************************************** ************* * El refresco Nro 1 termino en el tiempo 15.31 31910867 * *************************************************** ************* 15.3131910867 <Refresco 1> terminated 17.0927506172 release <Refresco 4> <lavadora> . . .waitQ: [] . . .activeQ: [] 17.0927506172 request <Refresco 4> <portacargas 1> priority: default . . .waitQ: [] . . .activeQ: ['Refresco 4'] 17.0927506172 hold <Refresco 4> delay: 1 19.3500594197 release <Refresco 2> <etiquetadora> . . .waitQ: [] . . .activeQ: [] *************************************************** ************* * El refresco Nro 2 termino en el tiempo 19.35 00594197 * *************************************************** ************* 19.3500594197 <Refresco 2> terminated 21.1458888367 release <Refresco 3> <llenadora> . . .waitQ: [] . . .activeQ: [] 21.1458888367 request <Refresco 3> <tapadora> prio rity: default . . .waitQ: [] . . .activeQ: ['Refresco 3'] 21.1458888367 hold <Refresco 3> delay: 1.2410389158 3 23.3869277526 release <Refresco 3> <etiquetadora> . . .waitQ: [] . . .activeQ: [] *************************************************** ************* * El refresco Nro 3 termino en el tiempo 23.38 69277526 * *************************************************** ************* 23.3869277526 <Refresco 3> terminated 25.1827571696 release <Refresco 4> <llenadora> . . .waitQ: [] . . .activeQ: [] 25.1827571696 request <Refresco 4> <tapadora> prio rity: default . . .waitQ: [] . . .activeQ: ['Refresco 4'] 25.1827571696 hold <Refresco 4> delay: 1.2410389158 3 26.4237960855 release <Refresco 4> <tapadora> . . .waitQ: [] . . .activeQ: [] 26.4237960855 request <Refresco 4> <etiquetadora> priority: default . . .waitQ: [] . . .activeQ: ['Refresco 4'] 26.4237960855 hold <Refresco 4> delay: 1 27.4237960855 release <Refresco 4> <etiquetadora> . . .waitQ: []
CAPITULO 3
53
. . .activeQ: [] *************************************************** ************* * El refresco Nro 4 termino en el tiempo 27.42 37960855 * *************************************************** ************* 27.4237960855 <Refresco 4> terminated los Refrescos terminaron su proceso en 27.4237960 855 Minutos
En la salida de la simulación del modelo se tienen los registros de lo ocurrido en la misma, en orden
cronológico ascendiente, indica cuando finaliza cada refresco y cuando se termina todo el proceso, para
cada recurso se tienen valores de waitQ y activeQ, los cuales indican la lista de entidades en espera y la
lista de entidades activas en el recurso respectivamente.
También se especifica el tiempo cuando una entidad solicita un recurso, esto se indica con request,
cuando una entidad ocupa un recurso, se indica con hold y cuando una entidad libera el recurso que
estaba usando, indicado con release.
3.4 Módulo Tiempo Uniforme.
El siguiente módulo de la librería es el módulo uniforme, el cual modela la generación de un tiempo
aleatorio distribuido uniformemente entre dos valores introducidas por el usuario, la generación de
tiempos aleatorios en una característica común que es necesaria para el desarrollo de modelos de
simulación de procesos productivos, ya que en muchos casos es necesario un tiempo aleatorio basado
en una distribución uniforme, para múltiples usos, como por ejemplo el tiempo de uso de algún recurso
presente en el modelo de un sistema de producción.
Esta función recibe dos parámetros al ser invocada, que son los valores de los tiempos mínimo y
máximo definidos por el usuario entre los cuales se va a generar el valor aleatorio deseado:
tmin: indica el valor mínimo de los posibles valores generados.
tmax: indica el valor máximo de los posibles valores generados.
CAPITULO 3
54
Estos dos valores son recibidos por la función uniforme, y asignados a la variable tiempunif la cual
generara un valor aleatorio distribuido uniformemente entre los dos valores recibidos por la función y
la función devolverá este valor generado. Este módulo hace uso de la función random de Python.
La parte del código de la librería que simula la generación del valor aleatorio uniforme se presenta a
continuación:
def uniforme(self,tmin,tmax): tim=random.Random() tiempunif=tim.uniform(tmin,tmax) return tiempunif
3.5 Módulo Tiempo Exponencial.
Otro módulo presente en la librería es el módulo exponencial, el cual tiene características similares al
módulo explicado anteriormente, a diferencia que la distribución utilizada para la generación de este
valor es la distribución exponencial, y este módulo recibe un solo parámetro, que es el valor con el que
se define la media de la distribución y cual es definido por el usuario:
t_exp: valor con el que se define la media de la distribución exponencial utilizada en el modelo.
La función recibe este valor y devuelve el valor aleatorio generado por la distribución exponencial.
Este módulo también hace uso de la función random de Python.
La parte del código de la librería que modela la generación del valor aleatorio distribuido
exponencialmente se presenta a continuación:
def exponencial(self,t_exp): tem=random.Random() tiempexp=tem.expovariate(1.0/t_exp) return tiempexp
CAPITULO 3
55
3.6 Módulo de Servicio.
El siguiente módulo de la librería es el módulo servicio, este módulo es utilizado por los modelos que
realicen la simulación de la prestación de un servicio determinado, como parte de los procesos
productivos, además de la fabricación de productos también se tiene la prestación de servicios.
Cualquier modelo de servicios, va a hacer uso de este módulo, ya que este contiene características que
son comunes a los modelos de prestación de servicios en general como es la atención por parte de un
recurso a una entidad que solicita el servicio. El módulo servicio recibe los siguientes parámetros:
nombreservicio: representa el nombre que se le asignará al recurso que se desea definir, el cual estará
presente en el sistema de servicio. Este nombre será definido por el usuario.
nombreunidadserv: representa el nombre que se le asignará a una unidad del recurso de servicio y este
también será definido por el usuario.
capacidadservicio: indica la cantidad de recursos de servicio que se desea definir en el modelo, y este
parámetro también es definido por el usuario.
tipo_colaservicio: este parámetro especifica la disciplina de la cola que contiene la lista de entidades
que esperan ocupar el recurso, también es definido por el usuario.
solic_prioridadserv: es un valor booleano que indica si recurso de servicio es solicitado con prioridad,
este valor es definido por el usuario.
monitservicio: es un valor booleano (False o True) que indica si la información se monitorea en base a
los tamaños de waitQ y activeQ del recurso de servicio, es decir, en base a las colas de entidades en
espera y entidades actualmente en proceso respectivamente, es definido por el usuario.
tipo_monitorservicio: es un objeto que indica el tipo de seguimiento o registro que se hace al recurso
de servicio, puede ser monitor o tally, esto de acuerdo al tipo de registro que se desee utilizar para
almacenar estadísticas de la simulación, también es definido por el usuario.
CAPITULO 3
56
Los valores de estos parámetros son recibidos por el módulo servicio cuando el usuario realiza la
llamada a la función y son almacenados en la variable recursos de tipo Resource, como una definición
del recurso servicio en SimPy, y luego la función devuelve la variable que contiene esta declaración de
este recurso.
La parte del código de la librería que simula el recurso servicio con sus parámetros se muestra a
continuación:
# modulo para la declaracion del recurso servicio def servicio(self,nombreservicio,nombreunidadserv,capacidadservicio,tipo_colaservicio,solic_prioridad serv,monitservicio,tipo_monitorservicio): nombre_serv=nombreservicio nombre_unidad_serv=nombreunidadserv capacidad_serv=capacidadservicio tipo_de_colaserv=tipo_colaservicio solicit_prioridadserv=solic_prioridadserv monserv=monitservicio tipomonserv=tipo_monitorservicio recursos=Resource(name=nombre_serv,unitName=nombre_unidad_serv,capacity=capacidad_serv, qType=tipo_de_colaserv,preemptable=solicit_prioridadserv,monitored=monserv,monitorType=tipom onserv) return recursos
3.7 Simulación de un sistema de Servicio.
A continuación se muestra el modelo de un sistema de servicio, el cual utiliza los módulos uniforme,
exponencial y servicio, los cuales fueron explicados anteriormente y estarán incluidos en la clase
procesosproductivo, de la librería de SimPy llamada procesos.py. Se trata de un “Proceso de Atención
de Clientes en un Banco”, el cual se describe a continuación:
En una agencia bancaria llegan los clientes para hacer un determinado tramite, una vez que llegan los
clientes al banco deben realizar distintas actividades, para que los clientes realicen el tramite deben en
primer lugar hablar con el gerente del banco, luego de hablar con el gerente se deben dirigir a llenar
una solicitud con el promotor, después de hablar con el promotor deben pasar a realizar un deposito con
el cajero y finalmente entregar los recaudos a la secretaria del banco.
CAPITULO 3
57
Los clientes que llegan al banco deben pasar por cada recurso en un determinado orden. Los clientes
tienen tiempos aleatorios de actividad con cada entidad distribuidos uniformemente con los 3 primeros
recursos y exponencialmente con el recurso secretaria que atiende con una media de 2 clientes por
minuto tal como se muestra a continuación:
� Tiempo de conversación con el gerente: uniforme entre 5 y 7 unidades de tiempo
� Tiempo de conversación con el promotor: uniforme entre 7 y 9 unidades de tiempo
� Tiempo de depósito en caja: uniforme entre 2 y 4 unidades de tiempo
� Tiempo de actividad con la secretaria: exponencial, 2 clientes por unidad de tiempo
En este modelo se tienen 4 recursos por los que debe pasar el cliente a realizar una determinada
actividad, y los clientes son las entidades que utilizan los recursos. El modelo de simulación de este
sistema pide al usuario el número de clientes con las cuales se realizará la simulación y genera un
tiempo aleatorio de llegada distribuido uniformemente para cada cliente. Al finalizar la simulación se
muestra en que tiempo finalizan los clientes sus actividades.
A continuación se muestra el código de la simulación en SimPy:
from SimPy.SimulationTrace import * import random from procesos import procesoproductivo ## Model components class client(Process): clientelisto=0 def visit(self,bank): #eventos de los clientes con el recurso gerente #solicitar el recurso yield request,self,bank.gerente #ocupar el recurso yield hold,self,tgerente #liberar el recurso yield release,self,bank.gerente #eventos de los clientes con el recurso promotor #solicitar el recurso yield request,self,bank.promotor #ocupar el recurso yield hold,self,tpromotor
CAPITULO 3
58
#liberar el recurso yield release,self,bank.promotor #eventos de los clientes con el recurso cajero #solicitar el recurso yield request,self,bank.cajero #ocupar el recurso yield hold,self,tcajero #liberar el recurso yield release,self,bank.cajero #eventos de los clientes con el recurso secretaria #solicitar el recurso yield request,self,bank.secret #ocupar el recurso yield hold,self,tsecretaria #liberar el recurso yield release,self,bank.secret client.clientelisto+=1 # imprimir en pantalla un aviso de que un cliente finalizo sus actividades print"\n*************************************************" print "* El Cliente Nro ",client.clientelisto," termino en el tiempo ",now()," *" print"*************************************************\n" class llamada: # llamada a la libreria procesos.py # pasar los parámetros al modulo servicio de la libreria llam=procesoproductivo() gerente=llam.servicio("GERENTE","Unidad",1,FIFO,False,True,Monitor) promotor=llam.servicio("PROMOTOR","Unidad",1,FIFO,False,True,Monitor) cajero=llam.servicio("CAJERO","Unidad",1,FIFO,False,True,Monitor) secret=llam.servicio("SECRETARIA","Unidad",1,FIFO,False,True,Monitor) ## Model def model(): initialize() for visname,arrivaltime in clientlist: vis=client(name=visname) activate(vis,vis.visit(bank=llamada),at=arrivaltime) simulate(until=simtime) ## Experiment data clientlist = [] n=int(raw_input("\n Introduzca el numero de Clientes: ")) for i in range(n): cad, num = "Cliente " + str(i + 1),random.uniform(i,i+1) clientlist.append((cad,num)) q=procesoproductivo() tgerente=q.uniforme(5,7) tpromotor=q.uniforme(7,9) tcajero=q.uniforme(2,4) tsecretaria=q.exponencial(2) simtime=1000000 ## Experiment model() ## Analysis/output print "\n Los Clientes terminaron sus actividades en %s"%now(),"Minutos\n"
CAPITULO 3
59
Al ejecutar la simulación el usuario debe introducir el número de clientes con los cuales se realizará la
simulación, tal como se muestra a continuación:
Introduzca el número de Clientes: 5
En este caso, se realiza la simulación con 5 clientes, y la salida de la simulación es la siguiente:
0.331135771592 request <Cliente 1> <GERENTE> prior ity: default . . .waitQ: [] . . .activeQ: ['Cliente 1'] 0.331135771592 hold <Cliente 1> delay: 5.7322161853 9 1.6342879652 request <Cliente 2> <GERENTE> priorit y: default . . .waitQ: ['Cliente 2'] . . .activeQ: ['Cliente 1'] 2.06617240131 request <Cliente 3> <GERENTE> priori ty: default . . .waitQ: ['Cliente 2', 'Cliente 3'] . . .activeQ: ['Cliente 1'] 11.7955681424 release <Cliente 2> <GERENTE> . . .waitQ: ['Cliente 4', 'Cliente 5'] . . .activeQ: ['Cliente 3'] 11.7955681424 request <Cliente 2> <PROMOTOR> prior ity: default . . .waitQ: ['Cliente 2'] . . .activeQ: ['Cliente 1'] 11.7955681424 hold <Cliente 3> delay: 5.73221618539 13.9980075338 release <Cliente 1> <PROMOTOR> . . .waitQ: [] . . .activeQ: ['Cliente 2'] 17.3395038852 release <Cliente 1> <SECRETARIA> . . .waitQ: [] . . .activeQ: [] ************************************************* * El Cliente Nro 1 termino en el tiempo 17.339 5038852 * ************************************************* 17.3395038852 <Cliente 1> terminated 17.5277843278 release <Cliente 3> <GERENTE> . . .waitQ: ['Cliente 5'] . . .activeQ: ['Cliente 4'] 17.5277843278 request <Cliente 3> <PROMOTOR> prior ity: default . . .waitQ: ['Cliente 3'] . . .activeQ: ['Cliente 2'] 17.5277843278 hold <Cliente 4> delay: 5.73221618539 21.9326631106 release <Cliente 2> <PROMOTOR> 23.9906573499 hold <Cliente 2> delay: 1.28350211211 25.274159462 release <Cliente 2> <SECRETARIA> . . .waitQ: [] . . .activeQ: [] ************************************************ * El Cliente Nro 2 termino en el tiempo 25.274 159462 * ************************************************
CAPITULO 3
60
25.274159462 <Cliente 2> terminated 28.9922166986 release <Cliente 5> <GERENTE> . . .waitQ: [] . . .activeQ: [] 28.9922166986 request <Cliente 5> <PROMOTOR> prior ity: default . . .waitQ: ['Cliente 4', 'Cliente 5'] . . .activeQ: ['Cliente 3'] 29.8673186874 release <Cliente 3> <PROMOTOR> . . .waitQ: ['Cliente 5'] . . .activeQ: ['Cliente 4'] 29.8673186874 request <Cliente 3> <CAJERO> priorit y: default . . .waitQ: [] . . .activeQ: ['Cliente 3'] 29.8673186874 hold <Cliente 3> delay: 2.05799423931 29.8673186874 hold <Cliente 4> delay: 7.93465557682 31.9253129267 release <Cliente 3> <CAJERO> . . .waitQ: [] . . .activeQ: [] 31.9253129267 request <Cliente 3> <SECRETARIA> pri ority: default . . .waitQ: [] . . .activeQ: ['Cliente 3'] 31.9253129267 hold <Cliente 3> delay: 1.28350211211 33.2088150389 release <Cliente 3> <SECRETARIA> . . .waitQ: [] . . .activeQ: [] ************************************************* * El Cliente Nro 3 termino en el tiempo 33.208 8150389 * ************************************************* 33.2088150389 <Cliente 3> terminated 39.8599685036 hold <Cliente 4> delay: 1.28350211211 41.1434706157 release <Cliente 4> <SECRETARIA> . . .waitQ: [] . . .activeQ: [] ************************************************* * El Cliente Nro 4 termino en el tiempo 41.143 4706157 * ************************************************* 41.1434706157 <Cliente 4> terminated 45.7366298411 release <Cliente 5> <PROMOTOR> . . .waitQ: [] . . .activeQ: [] 45.7366298411 request <Cliente 5> <CAJERO> priorit y: default . . .waitQ: [] . . .activeQ: ['Cliente 5'] 45.7366298411 hold <Cliente 5> delay: 2.05799423931 47.7946240804 release <Cliente 5> <CAJERO> . . .waitQ: [] . . .activeQ: [] 47.7946240804 request <Cliente 5> <SECRETARIA> pri ority: default . . .waitQ: [] . . .activeQ: ['Cliente 5'] 47.7946240804 hold <Cliente 5> delay: 1.28350211211 49.0781261925 release <Cliente 5> <SECRETARIA> . . .waitQ: [] . . .activeQ: [] ************************************************* * El Cliente Nro 5 termino en el tiempo 49.078 1261925 * *************************************************
CAPITULO 3
61
49.0781261925 <Cliente 5> terminated Los Clientes terminaron sus actividades en 49.0781 261925 Minutos
En la salida se muestra los eventos que ocurren en la simulación del proceso, y los tiempos en que
ocurre cada evento.
3.8 Módulo de Generación de Llegadas.
Es muy importante en los procesos de producción y prestación de servicio tomar en cuenta la forma de
llegada de las entidades al sistema, en el siguiente módulo de la librería de simulación se muestra el
desarrollo de la generación de la llegada de las entidades que estarán presente en el modelo de
simulación, este módulo recibe dos parámetros, que son la cantidad de entidades del modelo, la cual a
su vez se pide al usuario por pantalla para luego ser pasado a este módulo y el nombre que el usuario
desea asignarle las entidades que utilizarán los recursos del modelo.
Luego que el módulo recibe los dos parámetros este crea una lista de pares de valores, donde cada par
de valor está formado por el nombre de la entidad y el tiempo de llegada de la misma, el cual es
generado aleatoriamente según una distribución aleatoria uniforme y va aumentando cada vez que se le
asigna a una entidad diferente, así cada entidad deberá tener un nombre y un tiempo de llegada
diferente a la anterior.
Los parámetros recibidos por el módulo son:
cantidad: indica la cantidad de entidades que estarán en el modelo.
nombre: indica el nombre de las entidades del modelo.
intervalo: indica el intervalo de tiempo entre el cual se generara cada llegada, por ejemplo, si el usuario
pasa como parámetro el valor 3 entonces se generaran valores aleatorios uniforme con intervalo 3.
Estos 3 valores son recibidos por la función llegada, la cual los utilizará para crear una lista llamada
CAPITULO 3
62
lista que será devuelta al modelo que llame a la función. La lista contendrá los nombres de los
productos y los tiempos de llegada de cada uno. Este módulo hace uso de la sentencia for de Python.
A continuación se muestra el código del módulo llegada:
# modulo para la declaracion de # las variables que generan la lista de productos y tiempos de llegada def llegada(self,cantidad,nombre,intervalo): lista= [] cant=cantidad nomb=nombre inter=intervalo for i in range(cant): cad, num = nomb + " " + str(i + 1),random.uniform((inter*i),(inter*i)+inter) lista.append((cad,num)) return lista
3.9 Simulación de un sistema de Servicio.
A continuación se muestra un modelo sencillo de un sistema de servicio, el cual utiliza el módulo
llegada, que fue explicado en la sección anterior, además utiliza los módulos uniforme y servicio de la
de la librería procesos.py. Se desea realizar la simulación en SimPy el “Proceso de Atención de
Clientes en un Autolavado”, el cual se describe a continuación:
En un autolavado llegan los clientes para recibir el servicio de lavado de sus vehículos, luego que
llegan los vehículos al autolavado deben estos pasan por distintos procesos, los cuales se mencionan a
continuación:
• Aspirado de los vehículos.
• Lavado de los vehículos.
CAPITULO 3
63
• Secado de los vehículos.
Cada uno de los tres procesos se debe modelar como un recurso y cada vehículo que llega al sistema,
debe pasar por cada recurso en el orden mencionado anteriormente, de forma tal que cada proceso es
atendido por un recurso que realiza la respectiva actividad. Una vez que llegan al autolavado los
vehículos tienen un tiempo de actividad aleatorio distribuido uniformemente con cada recurso tal como
se muestra a continuación:
� Tiempo de aspirado de el vehículo: entre 3 y 5unidades de tiempo
� Tiempo de lavado del vehículo: entre 5 y 7 unidades de tiempo
� Tiempo de secado del vehículo: entre 4 y 6 unidades de tiempo
En el modelo el usuario debe introducir por pantalla al momento de ejecución la cantidad de vehículos
que van a llegar al autolavado para ser atendidos, y luego ese valor será pasado al módulo llegada que
es parte de la librería procesos.py para que este genera la lista de vehículos y sus tiempos de llegada
que será devuelta a este modelo de simulación. Se desea simular este proceso y mostrar en que tiempo
finalizan los vehículos sus actividades en el autolavado.
A continuación se muestra el código que realiza la simulación en SimPy:
from SimPy.SimulationTrace import * import random from procesos import procesoproductivo ## Model components class carros(Process): carrolisto=0 def carro(self,autolavado): #eventos de los autos con el recurso aspiradora #solicitar el recurso yield request,self,autolavado.aspirado #ocupar el recurso yield hold,self,taspirado #liberar el recurso yield release,self,autolavado.aspirado #eventos de los autos con el recurso lavadora #solicitar el recurso
CAPITULO 3
64
yield request,self,autolavado.lavado #ocupar el recurso yield hold,self,tlavado #liberar el recurso yield release,self,autolavado.lavado #eventos de los autos con el recurso secadora #solicitar el recurso yield request,self,autolavado.secado #ocupar el recurso yield hold,self,tsecado #liberar el recurso yield release,self,autolavado.secado carros.carrolisto+=1 print"\n*************************************************************" print "* El Vehiculo Nro ",carros.carrolisto," termino en el tiempo ",now(),"*" print"*************************************************************\n" class llamada: # llamada a la libreria procesos.py aut=procesoproductivo() aspirado=aut.servicio("Aspirador","Unidad",1,FIFO,False,True,Monitor) lavado=aut.servicio("Lavador","Unidad",1,FIFO,False,True,Monitor) secado=aut.servicio("Secador","Unidad",1,FIFO,False,True,Monitor) ## Model def model(): initialize() auto=llamada() auto.aspirado auto.lavado auto.secado for carroname,arrivaltime in carroslist: carro=carros(name=carroname) activate(carro,carro.carro(autolavado=llamada),at=arrivaltime) simulate(until=simtime) ## Experiment data var=procesoproductivo() # solicita al usuario el numero de vehiculos cant=int(raw_input("\n Introduzca el numero de Vehiculos: ")) carroslist = var.llegada(cant,"Vehiculo ",1) q=procesoproductivo() taspirado=q.uniforme(3,5) tlavado=q.uniforme(5,7) tsecado=q.uniforme(4,6) simtime=10000000 ## Experiment model() ## Analysis/output print "\n Los Vehiculos terminaron su proceso en %s"%now(),"Minutos\n"
En este caso la simulación se realiza para 5 vehículos, aunque este valor puede ser diferente en cada
corrida, ya que ese es un valor decidido por el usuario, y la salida de la simulación es la siguiente:
Introduzca el número de Vehiculos: 5
CAPITULO 3
65
0.414810438099 request <Vehiculo 1> <Aspirador> p riority: default . . .waitQ: [] . . .activeQ: ['Vehiculo 1'] 0.414810438099 hold <Vehiculo 1> delay: 4.63742391 362 1.28173796861 request <Vehiculo 2> <Aspirador> pr iority: default . . .waitQ: ['Vehiculo 2'] . . .activeQ: ['Vehiculo 1'] 2.12595822236 request <Vehiculo 3> <Aspirador> pr iority: default . . .waitQ: ['Vehiculo 2', 'Vehiculo 3'] . . .activeQ: ['Vehiculo 1'] 3.54994085118 request <Vehiculo 4> <Aspirador> pr iority: default . . .waitQ: ['Vehiculo 2', 'Vehiculo 3', 'Vehicul o 4'] . . .activeQ: ['Vehiculo 1'] 4.33391351808 request <Vehiculo 5> <Aspirador> pr iority: default . . .waitQ: ['Vehiculo 2', 'Vehiculo 3', 'Vehicul o 4', 'Vehiculo 5'] . . .activeQ: ['Vehiculo 1'] 5.05223435172 release <Vehiculo 1> <Aspirador> . . .waitQ: ['Vehiculo 3', 'Vehiculo 4', 'Vehicul o 5'] . . .activeQ: ['Vehiculo 2'] 5.05223435172 request <Vehiculo 1> <Lavador> prio rity: default . . .waitQ: [] . . .activeQ: ['Vehiculo 1'] 5.05223435172 hold <Vehiculo 1> delay: 5.797517191 11 5.05223435172 hold <Vehiculo 2> delay: 4.637423913 62 9.68965826533 release <Vehiculo 2> <Aspirador> . . .waitQ: ['Vehiculo 4', 'Vehiculo 5'] . . .activeQ: ['Vehiculo 3'] 9.68965826533 request <Vehiculo 2> <Lavador> prio rity: default . . .waitQ: ['Vehiculo 2'] . . .activeQ: ['Vehiculo 1'] 9.68965826533 hold <Vehiculo 3> delay: 4.637423913 62 10.8497515428 release <Vehiculo 1> <Lavador> . . .waitQ: [] . . .activeQ: ['Vehiculo 2'] 10.8497515428 request <Vehiculo 1> <Secador> prio rity: default . . .waitQ: [] . . .activeQ: ['Vehiculo 1'] 10.8497515428 hold <Vehiculo 1> delay: 3.014566394 8 10.8497515428 hold <Vehiculo 2> delay: 5.797517191 11 13.8643179376 release <Vehiculo 1> <Secador> . . .waitQ: [] . . .activeQ: [] *************************************************** ********** * El Vehiculo Nro 1 termino en el tiempo 13.86 43179376 * *************************************************** ********** 13.8643179376 <Vehiculo 1> terminated 14.3270821789 release <Vehiculo 3> <Aspirador> . . .waitQ: ['Vehiculo 5'] . . .activeQ: ['Vehiculo 4'] 14.3270821789 request <Vehiculo 3> <Lavador> prio rity: default . . .waitQ: ['Vehiculo 3'] . . .activeQ: ['Vehiculo 2'] 14.3270821789 hold <Vehiculo 4> delay: 4.637423913 62 16.6472687339 release <Vehiculo 2> <Lavador> . . .waitQ: [] . . .activeQ: ['Vehiculo 3'] 16.6472687339 request <Vehiculo 2> <Secador> prio rity: default
CAPITULO 3
66
. . .waitQ: []
. . .activeQ: ['Vehiculo 2'] 16.6472687339 hold <Vehiculo 2> delay: 3.014566394 8 16.6472687339 hold <Vehiculo 3> delay: 5.797517191 11 18.9645060926 release <Vehiculo 4> <Aspirador> . . .waitQ: [] . . .activeQ: ['Vehiculo 5'] 18.9645060926 request <Vehiculo 4> <Lavador> prio rity: default . . .waitQ: ['Vehiculo 4'] . . .activeQ: ['Vehiculo 3'] 18.9645060926 hold <Vehiculo 5> delay: 4.637423913 62 19.6618351287 release <Vehiculo 2> <Secador> . . .waitQ: [] . . .activeQ: [] *************************************************** ********** * El Vehiculo Nro 2 termino en el tiempo 19.66 18351287 * *************************************************** ********** 19.6618351287 <Vehiculo 2> terminated 22.4447859251 release <Vehiculo 3> <Lavador> . . .waitQ: [] . . .activeQ: ['Vehiculo 4'] 22.4447859251 request <Vehiculo 3> <Secador> prio rity: default . . .waitQ: [] . . .activeQ: ['Vehiculo 3'] 22.4447859251 hold <Vehiculo 3> delay: 3.014566394 8 22.4447859251 hold <Vehiculo 4> delay: 5.797517191 11 23.6019300062 release <Vehiculo 5> <Aspirador> . . .waitQ: [] . . .activeQ: [] 23.6019300062 request <Vehiculo 5> <Lavador> prio rity: default . . .waitQ: ['Vehiculo 5'] . . .activeQ: ['Vehiculo 4'] 25.4593523199 release <Vehiculo 3> <Secador> . . .waitQ: [] . . .activeQ: [] *************************************************** ********** * El Vehiculo Nro 3 termino en el tiempo 25.45 93523199 * *************************************************** ********** 25.4593523199 <Vehiculo 3> terminated 28.2423031162 release <Vehiculo 4> <Lavador> . . .waitQ: [] . . .activeQ: ['Vehiculo 5'] 28.2423031162 request <Vehiculo 4> <Secador> prio rity: default . . .waitQ: [] . . .activeQ: ['Vehiculo 4'] 28.2423031162 hold <Vehiculo 4> delay: 3.014566394 8 28.2423031162 hold <Vehiculo 5> delay: 5.797517191 11 31.256869511 release <Vehiculo 4> <Secador> . . .waitQ: [] . . .activeQ: [] *************************************************** ********** * El Vehiculo Nro 4 termino en el tiempo 31.25 6869511 * *************************************************** ********** 31.256869511 <Vehiculo 4> terminated 34.0398203073 release <Vehiculo 5> <Lavador> . . .waitQ: [] . . .activeQ: []
CAPITULO 3
67
34.0398203073 request <Vehiculo 5> <Secador> prio rity: default . . .waitQ: [] . . .activeQ: ['Vehiculo 5'] 34.0398203073 hold <Vehiculo 5> delay: 3.014566394 8 37.0543867021 release <Vehiculo 5> <Secador> . . .waitQ: [] . . .activeQ: [] *************************************************** ********** * El Vehiculo Nro 5 termino en el tiempo 37.05 43867021 * *************************************************** ********** 37.0543867021 <Vehiculo 5> terminated Los Vehiculos terminaron su proceso en 37.0543867 021 Minutos
3.10 Módulo de Depósito.
El siguiente módulo de la librería modela uno de los componentes comunes a los procesos productivos
en general, es común encontrar depósitos de uso temporal en los sistemas de producción de diferentes
tipos, donde son llevados los productos un tiempo especifico mientras esperan ser atendidos por otro
recurso, por tal razón es necesario incluir en la librería de simulación este tipo de componente, el cual
será modelado de la misma manera que los componentes anteriores, mediante una función llamada
deposito_temporal que recibe parámetros cuando es llamada, los parámetros que recibe este módulo
son los siguientes:
nombredeposito: representa el nombre que se le asignará al recurso depósito que se que se desea
definir y será definido por el usuario.
nombreunidaddeposito: representa el nombre que se le asignará a una unidad del recurso depósito y
este también será definido por el usuario.
capacidaddeposito: indica la cantidad de recursos depósito que se desea definir en el modelo, y este
parámetro también es definido por el usuario.
tipo_coladeposito: este parámetro especifica la disciplina de la cola que contiene la lista de entidades
que esperan ser atendidos por recurso depósito, también es definido por el usuario.
CAPITULO 3
68
solic_prioridaddeposito: es un valor booleano que indica si el depósito es solicitado con prioridad, este
valor es definido por el usuario.
monitdeposito: es un valor booleano (False o True) que indica si la información se monitorea en base a
los tamaños de waitQ y activeQ del recurso depósito, es decir, en base a las colas de entidades en
espera y entidades actualmente en proceso respectivamente, es definido por el usuario.
tipo_monitordeposito: es un objeto que indica el tipo de seguimiento o registro que se hace al recurso
depósito, puede ser monitor o tally, esto de acuerdo al tipo de registro que se desee utilizar para
almacenar estadísticas de la simulación, también es definido por el usuario.
A este módulo deposito_temporal el usuario le pasa los valores de los parámetros y al igual que los
anteriores, este los almacena en una variable llamada recursoal que se define como un recurso en
SimPy, y el módulo devuelve la declaración del recurso depósito temporal, al modelo de simulación
donde sea necesario hacer uso de este recurso.
La parte del código de la librería que modela el recurso depósito temporal se muestra a continuación:
# modulo para la declaracion del recurso deposito temporal def deposito_temporal(self,nombredeposito,nombreunidaddeposito,capacidaddeposito,tipo_coladepo
sito,solic_prioridaddeposito,monitdeposito,tipo_monitordeposito): nombre_deposito=nombredeposito nombre_unidad_deposito=nombreunidaddeposito capacidad_deposito=capacidaddeposito tipo_de_coladeposito=tipo_coladeposito solicit_prioridaddeposito=solic_prioridaddeposito mondeposito=monitdeposito tipomondeposito=tipo_monitordeposito recursoal=Resource(name=nombre_deposito,unitName=nombre_unidad_deposito,capacity=capacida d_deposito,qType=tipo_de_coladeposito,preemptable=solicit_prioridaddeposito, monitored=mondepo sito,monitorType=tipomondeposito) return recursoal
CAPITULO 3
69
3.11 Módulo de Tally.
Tally es un objeto de SimPy el cual tiene como finalidad observar las variables de interés en un modelo
de simulación para luego retornar un sumario de datos simple. El siguiente módulo de la librería recibe
los parámetros con los cuales se define un objeto de tipo Tally, los cuales son:
nombretally: el cual indica el nombre del objeto de tipo Tally.
etiqy: es una etiqueta descriptiva usada por el paquete simplot cuando se desea graficar.
etiqt: es una etiqueta descriptiva usada por el paquete simplot cuando se desea graficar.
El módulo recibe estos parámetros y los utiliza para definir un objeto de tipo Tally que luego devuelve
al modelo mediante una variable de nombre objetotally.
El código del módulo se muestra a continuación:
# modulo para la declaracion del objeto tipo tally def ftally(self,nombretally,etiqy,etiqt): nombre_tally=nombretally etiq_y=etiqy etiq_t=etiqt objetotally=Tally(name=nombre_tally,ylab=etiq_y,tlab=etiq_t) return objetotally
3.12 Módulo de Monitor.
Este modulo es igual al módulo de Tally ya que ambos son objetos usados para observar variables de
interés en un modelo de simulación. Este módulo recibe los parámetros con los cuales se define un
objeto de tipo Monitor, los cuales son:
nombremonitor: el cual indica el nombre del objeto de tipo Monitor.
CAPITULO 3
70
etiqy: es una etiqueta descriptiva usada por el paquete simplot cuando se desea graficar.
etiqt: es una etiqueta descriptiva usada por el paquete simplot cuando se desea graficar.
El módulo recibe estos parámetros y los utiliza para definir un objeto de tipo Monitor que luego
devuelve al modelo mediante una variable de nombre objetomonitor.
El código del módulo se muestra a continuación:
# modulo para la declaracion del objeto tipo monitor def fmonitor(self,nombremonitor,etiqy,etiqt): nombre_monitor=nombremonitor etiq_y=etiqy etiq_t=etiqt objetomonitor=Tally(name=nombre_monitor,ylab=etiq_y,tlab=etiq_t) return objetomonitor
3.13 Módulo de almacenes (Store).
Este es el último módulo de la librería, y es usado para modelar los almacenes, los cuales son objetos
de SimPy que donde se pueden insertar o remover artículos específicos. En los modelos de procesos de
producción los almacenes serán usados para colocar los productos que ya hayan finalizado su proceso
completo.
Este módulo recibe una serie de parámetros con los cuales se definirá un objeto de tipo almacén (Store)
de SimPy, los parámetros se muestran a continuación:
nombrealmacen: representa el nombre que se le asignará al almacén que se que se desea definir y será
definido por el usuario.
nombreunidadn: representa el nombre que se le asignará a una unidad del objeto almacen y este
CAPITULO 3
71
también será definido por el usuario.
capacidadalmacen: indica la cantidad de almacenes presentes en el modelo, y este parámetro también
es definido por el usuario.
cantidinicialalmacen: representa la cantidad inicial de elementos presentes en el almacén.
tipo_colaalmacenprod: indica la disciplina de cola para insertar entidades en el almacén, es definido
por el usuario.
tipo_colaalmacencons: indica la disciplina de cola para extraer entidades del almacén, es definido por
el usuario.
monitalmacen: es un valor booleano (False o True) que indica si debe o no llevarse un registro, es
definido por el usuario.
tipo_monitoralmacen: indica el tipo de seguimiento que se hace al almacen, puede ser monitor o tally,
también es definido por el usuario.
El módulo almacen recibe los valores de los parámetros y los almacena en una variable llamada almac
que se define como un objeto de tipo almacén, y devuelve esta variable al modelo de simulación que
llame al módulo.
El código del módulo se muestra a continuación:
# modulo para la declaracion del objeto almacen def almacen(self,nombrealmacen,nombreunidadn,capacidadalmacen,cantidinicialalmacen,tipo_cola almacenprod,tipo_colaalmacencons,monitalmacen,tipo_monitoralmacen): nombre_almacen=nombrealmacen nombre_unidadn=nombreunidadn capacidad_almacen=capacidadalmacen cantidad_inicialalmacen=cantidinicialalmacen tipo_de_colaalmacenprod=tipo_colaalmacenprod tipo_de_colaalmacencons=tipo_colaalmacenprodcons monalmacen=monitalmacen
CAPITULO 3
72
tipomonalmacen=tipo_monitoralmacen almac=Store(name=nombre_almacen,unitName=nombre_unidadn,capacity=capacidad_alma cen,initialBuffered=cantidad_inicialalmacen,putQType=tipo_de_colaalmacenprod,getQType=t ipo_de_colaalmacencons,monitored=monalmacen,monitorType=tipomonalmacen) return almac
3.14 Simulación de una Línea de Producción.
En esta sección se muestra un modelo de simulación de una línea de producción, que utiliza el módulo
almacen.
El modelo que se desarrollará en esta sección es un modelo sencillo y describe las características de
una “Línea de Producción de Elaboración de Productos”. A continuación se describe el modelo:
En una fabrica de un determinado producto, la materia prima llega al sistema y utilizara tres recursos,
los cuales son:
• Máquina 1.
• Máquina 2.
• Máquina 3.
Luego de utilizar las 3 máquinas, es decir, cuando el producto es elaborado, se deposita en un almacén.
Las entidades tienen un tiempo específico de actividad con cada recurso, el cual se muestra a
continuación:
• Máquina 1: tiempo aleatorio distribuido uniformemente entre 2 y 3 unidades de tiempo.
• Máquina 2: tiempo aleatorio distribuido uniformemente entre 3 y 4 unidades de tiempo.
CAPITULO 3
73
• Máquina 3: tiempo aleatorio distribuido uniformemente entre 1 y 3 unidades de tiempo.
El sistema se modela mediante la llamada a los recursos y el objeto de tipo almacén (Store) que están
contenidos en el fichero procesos.py.
A continuación se muestra el código de la simulación de este proceso en SimPy:
from SimPy.SimulationTrace import * import random from procesos import procesoproductivo ## Model components class producto(Process): productolisto=0 def produc(self,produccion): #eventos de los productos con el recurso maquina 1 #solicitar el recurso yield request,self,produccion.maq1 #ocupar el recurso yield hold,self,tmaq1 #liberar el recurso yield release,self,produccion.maq1 #eventos de los productos con el recurso maquina 2 #solicitar el recurso yield request,self,produccion.maq2 #ocupar el recurso yield hold,self,tmaq2 #liberar el recurso yield release,self,produccion.maq2 #eventos de los productos con el recurso maquina 3 #solicitar el recurso yield request,self,produccion.maq3 #ocupar el recurso yield hold,self,tmaq3 #liberar el recurso yield release,self,produccion.maq3 producto.productolisto+=1 print"\n*************************************************************" print "* El Producto Nro ",producto.productolisto," termino en el tiempo ",now(),"*" print"*************************************************************\n" alm= "Producto "+str(producto.productolisto) # insertar elemento en el almacen yield put,self,produccion.sB,[alm] aq=produccion.sB.theBuffer print " En almacen: ",aq print "\n" class llamada: # llamada a la libreria procesos.py pro=procesoproductivo() maq1=pro.maquina("Maquina 1","Unidad",1,FIFO,False,True,Monitor) maq2=pro.maquina("Maquina 2","Unidad",1,FIFO,False,True,Monitor) maq3=pro.maquina("Maquina 3","Unidad",1,FIFO,False,True,Monitor) sB = pro.almacen("Almacen","units","unbounded",[],FIFO,FIFO,False,Monitor) ## Model def model(): initialize() for producname,arrivaltime in productolist:
CAPITULO 3
74
produc=producto(name=producname) activate(produc,produc.produc(produccion=llamada),at=arrivaltime) simulate(until=simtime) ## Experiment data var=procesoproductivo() # solicita al usuario el numero de productos cant=int(raw_input("\n Introduzca el numero de Productos: ")) productolist = var.llegada(cant,"Producto ",1) q=procesoproductivo() tmaq1=q.uniforme(3,5) tmaq2=q.uniforme(3,5) tmaq3=q.uniforme(3,5) simtime=10000000 ## Experiment model() ## Analysis/output print "\n Los Productos terminaron su proceso en %s"%now(),"Minutos\n"
Realizando la corrida de la simulación para 4 productos se tiene la siguiente salida:
Introduzca el numero de Productos: 4
0.274909335846 request <Producto 1> <Maquina 1> p riority: default . . .waitQ: [] . . .activeQ: ['Producto 1'] 0.274909335846 hold <Producto 1> delay: 4.29357502 787 1.01308352905 request <Producto 2> <Maquina 1> pr iority: default . . .waitQ: ['Producto 2'] . . .activeQ: ['Producto 1'] 2.0152659116 request <Producto 3> <Maquina 1> pri ority: default . . .waitQ: ['Producto 2', 'Producto 3'] . . .activeQ: ['Producto 1'] 3.44866926478 request <Producto 4> <Maquina 1> pr iority: default . . .waitQ: ['Producto 2', 'Producto 3', 'Product o 4'] . . .activeQ: ['Producto 1'] 4.56848436372 release <Producto 1> <Maquina 1> . . .waitQ: ['Producto 3', 'Producto 4'] . . .activeQ: ['Producto 2'] 4.56848436372 request <Producto 1> <Maquina 2> pr iority: default . . .waitQ: [] . . .activeQ: ['Producto 1'] 4.56848436372 hold <Producto 1> delay: 4.832568262 4 4.56848436372 hold <Producto 2> delay: 4.293575027 87 8.86205939159 release <Producto 2> <Maquina 1> . . .waitQ: ['Producto 4'] . . .activeQ: ['Producto 3'] 8.86205939159 request <Producto 2> <Maquina 2> pr iority: default . . .waitQ: ['Producto 2'] . . .activeQ: ['Producto 1'] 8.86205939159 hold <Producto 3> delay: 4.293575027 87 9.40105262611 release <Producto 1> <Maquina 2> . . .waitQ: [] . . .activeQ: ['Producto 2'] 9.40105262611 request <Producto 1> <Maquina 3> pr iority: default . . .waitQ: [] . . .activeQ: ['Producto 1']
CAPITULO 3
75
9.40105262611 hold <Producto 1> delay: 3.944107911 33 9.40105262611 hold <Producto 2> delay: 4.832568262 4 13.1556344195 release <Producto 3> <Maquina 1> . . .waitQ: [] . . .activeQ: ['Producto 4'] 13.1556344195 request <Producto 3> <Maquina 2> pr iority: default . . .waitQ: ['Producto 3'] . . .activeQ: ['Producto 2'] 13.1556344195 hold <Producto 4> delay: 4.293575027 87 13.3451605374 release <Producto 1> <Maquina 3> . . .waitQ: [] . . .activeQ: [] *************************************************** ********** * El Producto Nro 1 termino en el tiempo 13.34 51605374 * *************************************************** ********** 13.3451605374 put <Producto 1> to put: 1 units int o <Almacen> priority: default . . .getQ: [] . . .putQ: [] . . .in buffer: 1 En almacen: ['Producto 1'] 13.3451605374 <Producto 1> terminated 17.4492094473 release <Producto 4> <Maquina 1> . . .waitQ: [] . . .activeQ: [] 17.4492094473 request <Producto 4> <Maquina 2> pr iority: default . . .waitQ: ['Producto 4'] . . .activeQ: ['Producto 3'] 18.1777287998 release <Producto 2> <Maquina 3> . . .waitQ: [] . . .activeQ: [] *************************************************** ********** * El Producto Nro 2 termino en el tiempo 18.17 77287998 * *************************************************** ********** 18.1777287998 put <Producto 2> to put: 1 units int o <Almacen> priority: default . . .getQ: [] . . .putQ: [] . . .in buffer: 2 En almacen: ['Producto 1', 'Producto 2'] 18.1777287998 <Producto 2> terminated 19.0661891509 release <Producto 3> <Maquina 2> . . .waitQ: [] . . .activeQ: ['Producto 4'] 19.0661891509 request <Producto 3> <Maquina 3> pr iority: default . . .waitQ: [] . . .activeQ: ['Producto 3'] 19.0661891509 hold <Producto 3> delay: 3.944107911 33 19.0661891509 hold <Producto 4> delay: 4.832568262 4 23.0102970622 release <Producto 3> <Maquina 3> . . .waitQ: [] . . .activeQ: [] *************************************************** ********** * El Producto Nro 3 termino en el tiempo 23.01 02970622 * *************************************************** ********** 23.0102970622 put <Producto 3> to put: 1 units int o <Almacen> priority: default . . .getQ: [] . . .putQ: [] . . .in buffer: 3
CAPITULO 3
76
En almacen: ['Producto 1', 'Producto 2', 'Product o 3'] 23.0102970622 <Producto 3> terminated 23.8987574133 release <Producto 4> <Maquina 2> . . .waitQ: [] . . .activeQ: [] 23.8987574133 request <Producto 4> <Maquina 3> pr iority: default . . .waitQ: [] . . .activeQ: ['Producto 4'] 23.8987574133 hold <Producto 4> delay: 3.944107911 33 27.8428653246 release <Producto 4> <Maquina 3> . . .waitQ: [] . . .activeQ: [] *************************************************** ********** * El Producto Nro 4 termino en el tiempo 27.84 28653246 * *************************************************** ********** 27.8428653246 put <Producto 4> to put: 1 units int o <Almacen> priority: default . . .getQ: [] . . .putQ: [] . . .in buffer: 4 En almacen: ['Producto 1', 'Producto 2', 'Product o 3', 'Producto 4'] 27.8428653246 <Producto 4> terminated Los Productos terminaron su proceso en 27.8428653 246 Minutos
Al finalizar la simulación se puede ver que en el almacén finalizaron 4 productos, información
mostrada por buffer, y también se observa la lista con los productos que terminaron en el almacén.
Se puede observar que en los distintos modelos se hace uso de la misma librería de simulación, y estos
tres modelos tiene en común que son modelos de simulación de procesos productivos, ya sea de
fabricación o de prestación de algún servicio, por lo tanto cualquier modelo de simulación distinto de
estos, pero que incluya alguna característica que sea modelada en la clase procesoproductivo de la
librería procesos.py puede de igual manera usar esta librería para llevar a cabo la ejecución de su
simulación.
3.15 Contenido completo de la Librería de Simulación.
En esta última sección del capítulo se muestra el código completo de la librería de simulación
desarrollada:
from SimPy.SimulationTrace import * import random
CAPITULO 3
77
class procesoproductivo: # modulo para la declaracion del recurso maquina def maquina(self,nombre,nombreunidadmaq,capacidad,tipo_cola,solic_prioridad,monit,tipo_monitor): nombre_maquina=nombre nombre_unidad_maq=nombreunidadmaq capacidad_maquina=capacidad tipo_de_cola=tipo_cola solicit_prioridad=solic_prioridad mon=monit tipomon=tipo_monitor recursom=Resource(name=nombre_maquina,unitName=nombre_unidad_maq,capacity=capacidad_ maquina,qType=tipo_de_cola,preemptable=solicit_prioridad,monitored=mon,monitorType=tipomon) return recursom # modulo para la declaracion del recurso transporte def transporte(self,nombretr,nombreunidadtrans,capacidadtr,tipo_colatr,solic_prioridadtrans,monittr, tipo_monitortr): nombre_transport=nombretr nombre_unidad_trans=nombreunidadtrans capacidad_transport=capacidadtr tipo_de_colatransport=tipo_colatr solicit_prioridadtrans=solic_prioridadtrans montransport=monittr tipomontransport=tipo_monitortr recursot=Resource(name=nombre_transport,unitName=nombre_unidad_trans,capacity=capacidad_tr ansport,qType=tipo_de_colatransport,preemptable=solicit_prioridadtrans,monitored=montransport,m onitorType=tipomontransport) return recursot # modulo para la declaracion de # la variable que genera el tiempo aleatorio uniforme def uniforme(self,tmin,tmax): tim=random.Random() tiempunif=tim.uniform(tmin,tmax) return tiempunif # modulo para la declaracion de # la variable que genera el tiempo aleatorio exponencial def exponencial(self,t_exp): tem=random.Random() tiempexp=tem.expovariate(1.0/t_exp) return tiempexp # modulo para la declaracion del recurso servicio def servicio(self,nombreservicio,nombreunidadserv,capacidadservicio,tipo_colaservicio,solic_prioridad serv,monitservicio,tipo_monitorservicio): nombre_serv=nombreservicio nombre_unidad_serv=nombreunidadserv capacidad_serv=capacidadservicio tipo_de_colaserv=tipo_colaservicio solicit_prioridadserv=solic_prioridadserv monserv=monitservicio tipomonserv=tipo_monitorservicio recursos=Resource(name=nombre_serv,unitName=nombre_unidad_serv,capacity=capacidad_serv,qTy pe=tipo_de_colaserv,preemptable=solicit_prioridadserv,monitored=monserv,monitorType=tipomonserv) return recursos
CAPITULO 3
78
# modulo para la declaracion de # las variables que generan la lista de productos y tiempos de llegada def llegada(self,cantidad,nombre,intervalo): lista= [] cant=cantidad nomb=nombre inter=intervalo for i in range(cant): cad, num = nomb + " " + str(i + 1),random.uniform((inter*i),(inter*i)+inter) lista.append((cad,num)) return lista # modulo para la declaracion del recurso deposito temporal def deposito_temporal(self,nombredeposito,nombreunidaddeposito,capacidaddeposito,tipo_coladeposit o,solic_prioridaddeposito,monitdeposito,tipo_monitordeposito): nombre_deposito=nombredeposito nombre_unidad_deposito=nombreunidaddeposito capacidad_deposito=capacidaddeposito tipo_de_coladeposito=tipo_coladeposito solicit_prioridaddeposito=solic_prioridaddeposito mondeposito=monitdeposito tipomondeposito=tipo_monitordeposito recursoal=Resource(name=nombre_deposito,unitName=nombre_unidad_deposito,capacity=capacid ad_deposito,qType=tipo_de_coladeposito,preemptable=solicit_prioridaddeposito,monitored=mondep osito,monitorType=tipomondeposito) return recursoal # modulo para la declaracion del objeto tipo tally def ftally(self,nombretally,etiqy,etiqt): nombre_tally=nombretally etiq_y=etiqy etiq_t=etiqt objetotally=Tally(name=nombre_tally,ylab=etiq_y,tlab=etiq_t) return objetotally # modulo para la declaracion del objeto tipo monitor def fmonitor(self,nombremonitor,etiqy,etiqt): nombre_monitor=nombremonitor etiq_y=etiqy etiq_t=etiqt objetomonitor=Tally(name=nombre_monitor,ylab=etiq_y,tlab=etiq_t) return objetomonitor # modulo para la declaracion del objeto almacen def almacen(self,nombrealmacen,nombreunidadn,capacidadalmacen,cantidinicialalmacen,tipo_colaal macenprod,tipo_colaalmacencons,monitalmacen,tipo_monitoralmacen): nombre_almacen=nombrealmacen nombre_unidadn=nombreunidadn capacidad_almacen=capacidadalmacen cantidad_inicialalmacen=cantidinicialalmacen tipo_de_colaalmacenprod=tipo_colaalmacenprod tipo_de_colaalmacencons=tipo_colaalmacencons monalmacen=monitalmacen tipomonalmacen=tipo_monitoralmacen almac=Store(name=nombre_almacen,unitName=nombre_unidadn,capacity=capacidad_almacen,initi alBuffered=cantidad_inicialalmacen,putQType=tipo_de_colaalmacenprod,getQType=tipo_de_colaalm
CAPITULO 3
79
acencons,monitored=monalmacen,monitorType=tipomonalmacen) return almac
En este capitulo se pudo observar la construcción de la librería y la utilidad que tiene para la simulación
de procesos de producción y de prestación de servicios, y se observa que para utilizar la librería solo hay
que pasar parámetros a los modulos que utilice cada módelo de simulación en especifico.
Esta librería de simulación no será modificada, su contenido no cambiara, ya que cada modelo que que
requiera el uso de algún módulo de la librería solo necesitara llamarla para incluirla en el modelo.
CAPITULO 4
80
Capítulo 4
Simulación de Procesos de Producción de Lácteos Santa Rosa.
En este capítulo se muestra la aplicación de la librería de simulación de procesos de producción y
servicios desarrollada en el capítulo anterior a un sistema productivo real que posee las características
comunes a todos los procesos de producción y cuyo comportamiento puede ser modelado mediante la
simulación por eventos discretos utilizando la herramienta de simulación SimPy.
La planta “Productora de Alimentos Universitaria Lácteos Santa Rosa” es una dependencia de la
Universidad de Los Andes y está ubicada en el sector Santa Rosa, parroquia Milla del municipio
Libertador del estado Mérida. En esta empresa se producen alimentos lácteos de distintos tipos para la
venta al público en general y cada tipo producto tiene un proceso de producción distinto, el cual puede
ser simulado mediante eventos discretos.
Para realizar la simulación de los procesos de producción de alimentos en Lácteos Santa Rosa se cuenta
con datos reales, que fueron tomados durante la visita a la planta de producción y la observación de los
distintos procesos de producción realizados en la planta. Durante esta visita realizada a Lácteos Santa
Rosa el personal que labora en la planta suministró la información necesaria para realizar la simulación
de los procesos, tal como tiempo de duración de los procesos, equipos utilizados, secuencia de las
actividades, métodos de transporte y otros. Además de esto se hicieron mediciones de campo de las
variables más relevantes del proceso para determinar sus parámetros básicos.
CAPITULO 4
81
La obtención de los datos numéricos de las variables requeridas para la construcción de los distintos
modelos de simulación se logro mediante la anotación de los resultados experimentales observados en
la planta durante la elaboración de los distintos productos; donde registraron los valores obtenidos en
distintas repeticiones de los proceso y se calculó el promedio de las repeticiones para obtener un valor
aproximado de cada variable que interviene en el proceso de producción.
4.1 Simulación del Proceso de Producción de Queso Semiduro.
En esta sección se explica el proceso de producción de uno de los productos elaborados en la planta
productora Lácteos Santa Rosa, como es el queso tipo semiduro. Para la elaboración de este tipo de
queso se utilizan aproximadamente 396 litros de leche para obtener como producto final cerca de 30
Kilogramos de queso, esto se realiza mediante una secuencia de actividades las cuales se mencionan a
continuación:
1. Para la elaboración de este tipo de queso se debe en primer lugar ordeñar las vacas para
obtener la leche con la que se elaborará el producto, en este caso 396 litros, este proceso se
hace mediante las maquinas ordeñadoras mecánicas y tiene una duración aproximada de 2
horas. Este proceso será modelado mediante el módulo máquina de la librería.
2. Luego de ordeñar las vacas se debe trasladar la leche obtenida hasta el laboratorio donde se
le harán los respectivos análisis, esto se hace con el uso de una carretilla. este proceso dura
aproximadamente 5 minutos y será modelado mediante el módulo del recurso transporte de
la librería.
3. El siguiente paso del proceso de elaboración de este producto es la realización de las
pruebas de laboratorio con la finalidad de descartar cualquier anomalía en la leche, ya que el
queso debe elaborarse con una leche totalmente sana, esto se hace mediante una máquina de
laboratorio la cual arroja resultados que se comparan con valores estándares, este proceso se
hace en 2 minutos y será modelado utilizando el módulo máquina.
CAPITULO 4
82
4. Luego del análisis a la leche se debe llevar a descremar, utilizando un medio de transporte
manual, es decir, dos de los trabajadores levantan el envase donde está depositada la leche,
esto lo hacen en 1 minuto. Esta actividad será modelada mediante el módulo transporte de la
librería de simulación.
5. El siguiente proceso es descremar la leche hasta lograr que alcance 3.2 % de grasa, esto se
hace tomando 150 litros de la leche ordeñada y utilizando la máquina descremadora, este
proceso dura aproximadamente 15 minutos y en el modelo se utilizara un tiempo uniforme
entre 14 y 16 minutos, y será modelado mediante el módulo máquina.
6. Posteriormente uno de los trabajadores mezcla la leche descremada en la máquina con el
resto de la leche que no fue descremada, esto se hace manualmente y será modelado
mediante el módulo máquina, este proceso tiene una duración uniforme entre 14 y 16
minutos.
7. Luego de mezclar se debe pasteurizar toda la leche a 65° utilizando para esto la máquina
pasteurizadora, este proceso dura entre 14 y 16 minutos distribuidos uniformemente. Este
proceso será modelado mediante el módulo máquina.
8. Después de finalizado el proceso de pasteurización se debe dejar reposar la leche durante 30
minutos para lograr una maduración, este proceso se modela mediante el módulo máquina
ya que se realiza en la misma máquina donde fue pasteurizada la leche.
9. Luego de madurada la leche debe enfriarse a 45° mediante la utilización de una máquina,
este proceso dura aproximadamente entre 18 y 22 minutos y será modelado mediante el
módulo máquina de la librería.
10. El próximo proceso es la colocación de 1 litro de yogurt y un litro de estreptococo láctico a
la leche y dejar enfriar a 40°, esto se hace aproximadamente en 10 minutos y será modelado
utilizando el módulo máquina de la librería.
CAPITULO 4
83
11. Luego se le coloca 1 litro de fermento láctico a la leche y se enfría a 34°, este proceso
también dura aproximadamente 10 minutos y será modelado mediante el módulo máquina.
12. El siguiente proceso es colocar a la leche cuajo y cloruro y batir manualmente durante 5
minutos, el batido lo realiza uno de los trabajadores de la planta y será modelado mediante
el módulo máquina.
13. Luego de batir se deja la mezcla en un recipiente durante 35 minutos para que cuaje, este
proceso será modelado mediante el módulo deposito de la librería.
14. Luego se debe cortar la cuajada a tamaño de granos de maíz mediante una cortadora o lira,
este proceso tiene una duración aproximada de 10 minutos y para modelar dicho proceso se
usara un tiempo uniforme entre 9 y 11 minutos y se usará el módulo máquina.
15. Luego de cortado se debe batir manualmente con una paleta durante 10 minutos, este
proceso será modelado usando el módulo máquina.
16. Posteriormente se debe extraer suero al 30% y sustituir por agua hervida a 45°, este proceso
lo hace uno de los trabajadores manualmente durante aproximadamente 5 minutos y
también se modelará utilizando el módulo máquina.
17. Luego se debe colocar sal con una proporción de 0.5 Kgs por cada 100 litros de leche, en
este caso se colocan 2 Kgs de sal y luego se bate manualmente durante 10 minutos, este
proceso será modelado mediante el módulo máquina.
18. Después se debe extraer suero al 40% manualmente, este proceso tiene un tiempo de
duración entre 4 y 6 minutos distribuidos uniformemente y será modelado mediante el
módulo máquina de la librería.
19. Luego se llenan los moldes con la cuajada, este proceso lo hacen los trabajadores
manualmente durante 5 minutos aproximadamente y también será modelado mediante el
CAPITULO 4
84
módulo máquina.
20. Luego se dejan reposar los moldes llenos en un espacio de la planta durante 10 minutos,
este proceso se modelará mediante el módulo depósito de la librería.
21. Luego de reposar los moldes se llevan en una carretilla a un deposito donde pasarán por un
proceso de prensado, este proceso será modelado mediante el módulo transporte y tiene una
duración de 1 minuto.
22. Luego comienza el proceso de prensado de la cuajada, que es la colocación de un objeto
pesado encima de la cuajada. Esto se hace durante 24 horas, y será modelado mediante el
módulo depósito.
23. Después viene el proceso de colocación de la cuajada en la bañera de salmuera, donde
permanecen por 24 horas, este proceso será modelado mediante el módulo deposito.
24. Luego de permanecer en la salmuera las cuajadas deben ser llevadas a un depósito de
maduración, esto se hace utilizando una carretilla, el proceso tiene una duración de 1 minuto
y será modelado mediante el uso del módulo transporte.
25. Después las cuajadas de queso deben permanecer en el depósito de maduración durante 1
mes, este proceso será modelado mediante el módulo depósito de la librería.
26. El último paso en la elaboración del producto es empacar los quesos para ponerlos a la
venta al público, esto lo hacen los trabajadores manualmente durante aproximadamente 30
minutos, este proceso será modelado utilizando el módulo máquina de la librería de
simulación.
La ocurrencia de cada uno de los eventos del proceso puede ser modelada mediante eventos discretos,
de manera similar a la simulación de los procesos mostrados en el capítulo anterior, utilizando variables
aleatorias para generar los tiempos de duración de los procesos, en el apéndice A.1 se muestra el script
CAPITULO 4
85
que modela este proceso de producción.
El código esta en un archivo llamado lacteos1.py y para realizar la corrida debe hacerse mediante el
comando: python lacteos1.py
Luego de realizar la corrida de la simulación para la elaboración de la cantidad de dos (2) lotes de
queso se tiene la siguiente salida:
Introduzca el numero de quesos: 2 0.15183640836 request <Queso 1> <Ordegnar las vacas > priority: default . . .waitQ: [] . . .activeQ: ['Queso 1'] 0.15183640836 hold <Queso 1> delay: 120 1.93514171212 request <Queso 2> <Ordegnar las vacas > priority: default . . .waitQ: ['Queso 2'] . . .activeQ: ['Queso 1'] 120.151836408 release <Queso 1> <Ordegnar las vacas > . . .waitQ: [] . . .activeQ: ['Queso 2'] 120.151836408 request <Queso 1> <Carretilla> prior ity: default . . .waitQ: [] . . .activeQ: ['Queso 1'] 120.151836408 hold <Queso 1> delay: 5 120.151836408 hold <Queso 2> delay: 120 125.151836408 release <Queso 1> <Carretilla> . . .waitQ: [] . . .activeQ: [] 125.151836408 request <Queso 1> <Analisis a la lech e> priority: default . . .waitQ: [] . . .activeQ: ['Queso 1'] 125.151836408 hold <Queso 1> delay: 2 127.151836408 release <Queso 1> <Analisis a la lech e> . . .waitQ: [] . . .activeQ: []
.
.
. 3340.78863231 hold <Queso 2> delay: 1 3341.78863231 release <Queso 2> <Carretilla> . . .waitQ: [] . . .activeQ: [] 3341.78863231 request <Queso 2> <Maduracion> prior ity: default . . .waitQ: [] . . .activeQ: ['Queso 1', 'Queso 2'] 3341.78863231 hold <Queso 2> delay: 43200
CAPITULO 4
86
46421.7886323 release <Queso 1> <Maduracion> . . .waitQ: [] . . .activeQ: ['Queso 2'] 46421.7886323 request <Queso 1> <Envoltura> priori ty: default . . .waitQ: [] . . .activeQ: ['Queso 1'] 46421.7886323 hold <Queso 1> delay: 30 46451.7886323 release <Queso 1> <Envoltura> . . .waitQ: [] . . .activeQ: [] *************************************************** ************* * El queso Nro 1 termino en el tiempo 46451.78 86323 * *************************************************** ************* 46451.7886323 <Queso 1> terminated 46541.7886323 release <Queso 2> <Maduracion> . . .waitQ: [] . . .activeQ: [] 46541.7886323 request <Queso 2> <Envoltura> priori ty: default . . .waitQ: [] . . .activeQ: ['Queso 2'] 46541.7886323 hold <Queso 2> delay: 30 46571.7886323 release <Queso 2> <Envoltura> . . .waitQ: [] . . .activeQ: [] *************************************************** ************* * El queso Nro 2 termino en el tiempo 46571.78 86323 * *************************************************** ************* 46571.7886323 <Queso 2> terminated El proceso completo finalizo en el tiempo 46571.788 6323 Minutos En 776.196477205 horas En 32.3415198835 dias
En la planta “Lácteos Santa Rosa” también se elaboran otros tipos de queso como queso tipo cuajada y
queso de pasta blanda madurado descremado (Bonsalut), cuyo proceso de elaboración es muy similar al
proceso de elaboración del queso semiduro que fue explicado anteriormente, con diferencia en las
cantidades de leche y otros ingredientes y en el tiempo de utilización de los recursos. Debido a esto, la
simulación de los procesos de elaboración de estos tipos de queso será muy simular a la simulación del
proceso de producción del queso semiduro.
4.2 Simulación del Proceso de Producción de Mantequilla.
En esta sección se realiza la simulación del proceso de elaboración de mantequilla. Para la elaboración
de este producto se utilizan aproximadamente 150 litros de leche para obtener como producto final
CAPITULO 4
87
aproximadamente 10 litros de mantequilla, esto se realiza mediante una secuencia de actividades las
cuales se mencionan a continuación:
1. El primer paso en la elaboración de mantequilla es el ordeño de las vacas para obtener la
leche con la que se elaborará el producto, para esto se requieren 150 litros, este proceso se
hace mediante las máquinas ordeñadoras mecánicas y tiene una duración aproximada de 45
minutos. Este proceso será modelado mediante el módulo máquina de la librería.
2. Después se debe trasladar la leche obtenida hasta el laboratorio para realizar las pruebas,
esto se hace con el uso de una carretilla. este proceso dura aproximadamente 5 minutos y
será modelado mediante el módulo del recurso transporte de la librería.
3. Luego se debe hacer el análisis de laboratorio a la leche esto se hace mediante una máquina
de laboratorio, este proceso se hace en 2 minutos y será modelado utilizando el módulo
máquina.
4. Luego del análisis se traslada la leche hasta una máquina para descremar, para esto se utiliza
un medio de transporte manual, este proceso dura 1 minuto. Esta actividad será modelada
mediante el módulo transporte de la librería de simulación.
5. El siguiente proceso es descremar la leche para obtener 10 litros de crema con los que se va
a continuar el proceso, para esto se usa la máquina descremadora, este proceso dura
aproximadamente 20 minutos y en el modelo se utilizara un tiempo uniforme entre 19 y 21
minutos, y será modelado mediante el módulo máquina.
6. Luego de obtener los 10 litros de crema, esta se debe pasteurizar a 85° utilizando la máquina
pasteurizadora, este proceso dura aproximadamente 1 hora. Este proceso será modelado
mediante el módulo máquina.
7. Después de pasteurizar la crema, esta se debe enfriar a 45° mediante la utilización de una
CAPITULO 4
88
máquina, este proceso dura aproximadamente entre 18 y 22 minutos y será modelado
mediante el módulo máquina de la librería.
8. Luego de el proceso de pasteurizado se lleva la crema en una carretilla a un deposito donde
pasarán por un proceso de maduración, este proceso será modelado mediante el módulo
transporte y tiene una duración de 1 minuto.
9. El siguiente paso del proceso es dejar toda la crema en el depósito de maduración durante
24 horas, este proceso será modelado mediante el módulo depósito de la librería.
10. Luego se debe colocar la crema en una cava hasta que se enfríe a 4°, este proceso dura 36
horas y será modelado mediante el módulo máquina.
11. Después se utiliza una carretilla para llevar la crema al sitio donde será sometida a un
proceso de batido, esto se hace en 1 minuto y será modelado mediante el módulo transporte.
12. Luego se hace el batido manual para extraer suero, este proceso dura entre 4 y 6 minutos y
será modelado mediante el módulo máquina.
13. Posteriormente la crema se debe lavar y batir nuevamente durante aproximadamente 5
minutos, y se utilizara el módulo máquina para modelar este proceso.
14. El siguiente proceso es amasar la crema manualmente para obtener la mantequilla lista, esto
lo hace alguno de los trabajadores, con una duración aproximada entre 2 y 3 minutos, y será
modelado mediante el módulo máquina de la librería.
15. El último paso en el proceso de elaboración de mantequilla es la colocación en el envase
donde será vendida al público, este proceso se hace aproximadamente en 10 minutos y será
modelado mediante el módulo máquina.
CAPITULO 4
89
El script que modela este proceso de producción se muestra en el Apendice A.2.
El código esta en un archivo llamado lacteos4.py y para realizar la corrida debe hacerse mediante el
comando: python lacteos4.py
Luego de realizar la corrida de la simulación para la elaboración de la cantidad de dos (2) lotes de
mantequilla se tiene la siguiente salida:
Introduzca el numero de mantequillas: 2 0.560270184611 request <Mantequilla 1> <Ordegnar la s vacas> priority: default . . .waitQ: [] . . .activeQ: ['Mantequilla 1'] 0.560270184611 hold <Mantequilla 1> delay: 45 1.66184906408 request <Mantequilla 2> <Ordegnar las vacas> priority: default . . .waitQ: ['Mantequilla 2'] . . .activeQ: ['Mantequilla 1'] 45.5602701846 release <Mantequilla 1> <Ordegnar las vacas> . . .waitQ: [] . . .activeQ: ['Mantequilla 2'] 45.5602701846 request <Mantequilla 1> <Carretilla> priority: default . . .waitQ: [] . . .activeQ: ['Mantequilla 1'] 45.5602701846 hold <Mantequilla 1> delay: 5 45.5602701846 hold <Mantequilla 2> delay: 45 . . .activeQ: []
.
.
. 3770.80181259 hold <Mantequilla 1> delay: 2.4953949 2691 3773.29720751 release <Mantequilla 1> <Amasar> . . .waitQ: [] . . .activeQ: [] 3773.29720751 request <Mantequilla 1> <Envoltura> priority: default . . .waitQ: [] . . .activeQ: ['Mantequilla 1'] 3773.29720751 hold <Mantequilla 1> delay: 11.500384 7274 3784.79759224 release <Mantequilla 1> <Envoltura> . . .waitQ: [] . . .activeQ: [] *************************************************** *************** * La mantequilla Nro 1 termino en el tiempo 37 84.79759224 * *************************************************** ***************
CAPITULO 4
90
3784.79759224 <Mantequilla 1> terminated 3822.93273808 release <Mantequilla 2> <Enfriar en l a cava> . . .waitQ: [] . . .activeQ: [] 3822.93273808 request <Mantequilla 2> <Carretilla> priority: default . . .waitQ: [] . . .activeQ: ['Mantequilla 2'] 3822.93273808 hold <Mantequilla 2> delay: 1 3823.93273808 release <Mantequilla 2> <Carretilla> . . .waitQ: [] . . .activeQ: [] 3823.93273808 request <Mantequilla 2> <Batido a man o> priority: default . . .waitQ: [] . . .activeQ: ['Mantequilla 2'] 3823.93273808 hold <Mantequilla 2> delay: 5.7793339 2314 3829.71207201 release <Mantequilla 2> <Batido a man o> . . .waitQ: [] . . .activeQ: [] 3829.71207201 request <Mantequilla 2> <Lavar la cre ma y batir> priority: default . . .waitQ: [] . . .activeQ: ['Mantequilla 2'] 3829.71207201 hold <Mantequilla 2> delay: 5.0272011 5096 3834.73927316 release <Mantequilla 2> <Lavar la cre ma y batir> . . .waitQ: [] . . .activeQ: [] 3834.73927316 request <Mantequilla 2> <Amasar> pri ority: default . . .waitQ: [] . . .activeQ: ['Mantequilla 2'] 3834.73927316 hold <Mantequilla 2> delay: 2.4953949 2691 3837.23466808 release <Mantequilla 2> <Amasar> . . .waitQ: [] . . .activeQ: [] 3837.23466808 request <Mantequilla 2> <Envoltura> priority: default . . .waitQ: [] . . .activeQ: ['Mantequilla 2'] 3837.23466808 hold <Mantequilla 2> delay: 11.500384 7274 3848.73505281 release <Mantequilla 2> <Envoltura> . . .waitQ: [] . . .activeQ: [] *************************************************** *************** * La mantequilla Nro 2 termino en el tiempo 38 48.73505281 * *************************************************** *************** 3848.73505281 <Mantequilla 2> terminated El proceso completo finalizo en el tiempo 3848.7350 5281 Minutos En 64.1455842135 horas En 2.67273267556 dias
CAPITULO 4
91
4.3 Simulación del Proceso de Producción de Yogurt.
En esta sección se realiza la simulación del proceso de elaboración de Yogurt. Para la elaboración de
este producto se utilizan aproximadamente 36 litros de leche y se obtiene al finalizar el proceso
aproximadamente 36 litros de yogurt, esto se realiza mediante una secuencia de actividades las cuales
se mencionan a continuación:
1. Para elabora el yogurt es necesario primero obtener 36 litros de leche mediante el ordeño
mecanizado de las vacas, este proceso se hace mediante la utilización de las máquinas
ordeñadoras y tiene una duración aproximada de 15 minutos. Este proceso será modelado
mediante el módulo máquina de la librería.
2. Después se debe trasladar la leche obtenida hasta el laboratorio para realizar las pruebas,
esto se hace con el uso de una carretilla. este proceso dura aproximadamente 5 minutos y
será modelado mediante el módulo del recurso transporte de la librería.
3. Luego se deben realizar las pruebas de laboratorio a la leche esto se hace mediante una
máquina de laboratorio, este proceso se hace en 2 minutos y será modelado utilizando el
módulo máquina
4. Luego se lleva la leche al sitio donde se hace el proceso de descremado, para esto se utiliza
un medio de transporte manual, este proceso dura 1 minuto. Esta actividad será modelada
mediante el módulo transporte de la librería de simulación.
5. El siguiente proceso es descremar la leche, en este proceso su utilizan 18 de los 36 litros de
leche, para esto se usa la máquina descremadora, este proceso dura aproximadamente 5
minutos y en el modelo se utilizara un tiempo uniforme entre 4 y 6 minutos, y será
modelado mediante el módulo máquina.
6. Luego de descremar la leche debe ser llevada a una máquina batidora, esto lo hacen
manualmente los trabajadores durante aproximadamente 1 minuto. Este proceso será
CAPITULO 4
92
modelado mediante el módulo transporte.
7. Después se coloca la leche en la máquina batidora y se le colocan 50 gramos de ingrediente
Y1 y 50 gramos de ingrediente Y2, esto lo hace uno de los trabajadores manualmente y dura
entre 1 y 2 minutos aproximadamente. Este proceso será modelado mediante el módulo
máquina.
8. Luego comienza el proceso de batido en la máquina, se debe batir durante aproximadamente
10 minutos, este proceso también será modelado mediante el módulo máquina.
9. Luego se debe trasladar la mezcla a la máquina pasteurizadora, esto se hace en 1 minuto y
será modelado mediante el módulo transporte.
10. Luego se debe pasteurizar toda la mezcla a 85°, utilizando la máquina pasteurizadora, esto
se hace aproximadamente en 1 hora, y el proceso será modelado mediante el módulo
máquina.
11. Luego de pasteurizada la leche debe enfriarse a 45° mediante la utilización de una máquina,
este proceso dura aproximadamente entre 9 y 11 minutos y será modelado mediante el
módulo máquina de la librería.
12. El próximo proceso es la colocación de 200 ml de yogurt y batir manualmente durante 2
minutos, este proceso será modelado utilizando el módulo máquina de la librería.
13. Después se procede a la colocación del yogurt en el envase donde será vendido al público,
este proceso se hace aproximadamente entre 6 y 8 minutos y será modelado mediante el
módulo máquina.
14. Luego se deben llevar los potes de yogurt a la incubadora, esto se hace en 1 minuto y se
modela mediante el módulo transporte.
CAPITULO 4
93
15. Después se dejan los potes de yogurt en la incubadora durante 4 horas a una temperatura de
45°, esto se modela mediante el módulo máquina.
16. Luego se debe llevar a un refrigerador, esto lo hacen los trabajadores en 1 minuto y se
modela mediante el módulo transporte.
17. El último proceso en la fabricación de yogurt es la refrigeración, para esto se deja en el
refrigerador durante 3 horas, y se modela mediante el módulo máquina.
El script que modela este proceso de producción se muestra en el Apendice A.3. El código esta en un
archivo llamado lacteos5.py y para realizar la corrida debe hacerse mediante el comando: python
lacteos5.py. Luego de realizar la corrida de la simulación para la elaboración de la cantidad de dos (2)
lotes de yogurt se tiene la siguiente salida:
Introduzca el numero de yogurts: 2 0.0437926159037 request <Yogurt 1> <Ordegnar las va cas> priority: default . . .waitQ: [] . . .activeQ: ['Yogurt 1'] 0.0437926159037 hold <Yogurt 1> delay: 11 1.29268718408 request <Yogurt 2> <Ordegnar las vaca s> priority: default . . .waitQ: ['Yogurt 2'] . . .activeQ: ['Yogurt 1'] 11.0437926159 release <Yogurt 1> <Ordegnar las vaca s> . . .waitQ: [] . . .activeQ: ['Yogurt 2'] 11.0437926159 request <Yogurt 1> <Carretilla> prio rity: default . . .waitQ: [] . . .activeQ: ['Yogurt 1'] 11.0437926159 hold <Yogurt 1> delay: 5 11.0437926159 hold <Yogurt 2> delay: 11 16.0437926159 release <Yogurt 1> <Carretilla> . . .waitQ: [] . . .activeQ: [] 16.0437926159 request <Yogurt 1> <Analisis a la lec he> priority: default . . .waitQ: [] . . .activeQ: ['Yogurt 1'] 16.0437926159 hold <Yogurt 1> delay: 2 18.0437926159 release <Yogurt 1> <Analisis a la lec he> . . .waitQ: [] . . .activeQ: []
.
.
CAPITULO 4
94
. 425.872817619 release <Yogurt 2> <Carretilla> . . .waitQ: [] . . .activeQ: [] 425.872817619 request <Yogurt 2> <Refrigerador> pr iority: default . . .waitQ: [] . . .activeQ: ['Yogurt 1', 'Yogurt 2'] 425.872817619 hold <Yogurt 2> delay: 180 541.871551792 release <Yogurt 1> <Refrigerador> . . .waitQ: [] . . .activeQ: ['Yogurt 2'] *************************************************** ************* * El yogurt Nro 1 termino en el tiempo 541.871 551792 * *************************************************** ************* 541.871551792 <Yogurt 1> terminated 605.872817619 release <Yogurt 2> <Refrigerador> . . .waitQ: [] . . .activeQ: [] *************************************************** ************* * El yogurt Nro 2 termino en el tiempo 605.872 817619 * *************************************************** ************* 605.872817619 <Yogurt 2> terminated El proceso completo finalizo en el tiempo 605.87281 7619 Minutos En 10.0978802936 horas En 0.420745012235 dias
4.4 Simulación de los 3 Procesos Simultáneamente.
En el siguiente modelo se realiza la simulación de los 3 procesos ocurriendo simultáneamente, esto se
hace debido a que en la planta “Lacteos Santa Rosa” se realizan varios procesos al mismo tiempo,
donde cada proceso es realizado por un grupo de trabajadores distinto.
El script que modela este proceso de producción se muestra en el Apendice A.4.
CAPITULO 4
95
El código esta en un archivo llamado simultaneo.py y para realizar la corrida debe hacerse mediante el
comando: python simultaneo.py.
Cuando se realiza la corrida de la simulación el usuario debe introducir el número de cada producto, es
decir, debe introducir 3 valores, y la salida de la simulación para 1 producto de cada tipo es la
siguiente:
Introduzca el numero de quesos: 1 Introduzca el numero de mantequillas: 1 Introduzca el numero de yogurts: 1 0.38250739003 request <Mantequilla 1> <Ordegnar las vacas> priority: default . . .waitQ: [] . . .activeQ: ['Mantequilla 1'] 0.38250739003 hold <Mantequilla 1> delay: 120 0.477779807855 request <Queso 1> <Ordegnar las vaca s> priority: default . . .waitQ: ['Queso 1'] . . .activeQ: ['Mantequilla 1'] 0.940280419777 request <Yogurt 1> <Ordegnar las vac as> priority: default . . .waitQ: ['Queso 1', 'Yogurt 1'] . . .activeQ: ['Mantequilla 1'] 120.38250739 release <Mantequilla 1> <Ordegnar las vacas> . . .waitQ: ['Yogurt 1'] . . .activeQ: ['Queso 1'] 120.38250739 request <Mantequilla 1> <Carretilla> priority: default . . .waitQ: [] . . .activeQ: ['Mantequilla 1'] 120.38250739 hold <Mantequilla 1> delay: 5 120.38250739 hold <Queso 1> delay: 120 125.38250739 release <Mantequilla 1> <Carretilla> . . .waitQ: [] . . .activeQ: [] 125.38250739 request <Mantequilla 1> <Analisis a la leche> priority: default . . .waitQ: [] . . .activeQ: ['Mantequilla 1'] 125.38250739 hold <Mantequilla 1> delay: 2
.
.
. 685.63297157 hold <Yogurt 1> delay: 180 865.63297157 release <Yogurt 1> <Refrigerador> . . .waitQ: [] . . .activeQ: [] *************************************************** ************* * El yogurt Nro 1 termino en el tiempo 865.632 97157 * *************************************************** ************* 865.63297157 <Yogurt 1> terminated 1895.39268408 release <Queso 1> <Prensado> . . .waitQ: [] . . .activeQ: [] 1895.39268408 request <Queso 1> <Salmuera> priorit y: default
CAPITULO 4
96
. . .waitQ: []
. . .activeQ: ['Queso 1'] 1895.39268408 hold <Queso 1> delay: 1440
.
.
. 2383.41365596 hold <Mantequilla 1> delay: 2.2462277 6829 2385.65988373 release <Mantequilla 1> <Amasar> . . .waitQ: [] . . .activeQ: [] 2396.24911691 release <Mantequilla 1> <Envoltura> . . .waitQ: [] . . .activeQ: [] *************************************************** *************** * La mantequilla Nro 1 termino en el tiempo 23 96.24911691 * *************************************************** *************** 2396.24911691 <Mantequilla 1> terminated 3336.39268408 release <Queso 1> <Carretilla> . . .waitQ: [] . . .activeQ: [] 3336.39268408 request <Queso 1> <Maduracion> prior ity: default . . .waitQ: [] . . .activeQ: ['Queso 1'] 3336.39268408 hold <Queso 1> delay: 43200. 46536.3926841 release <Queso 1> <Maduracion> . . .waitQ: [] . . .activeQ: [] 46536.3926841 request <Queso 1> <Envoltura> priori ty: default . . .waitQ: [] . . .activeQ: ['Queso 1'] 46536.3926841 hold <Queso 1> delay: 30 46566.3926841 release <Queso 1> <Envoltura> . . .waitQ: [] . . .activeQ: [] *************************************************** ************* * El queso Nro 1 termino en el tiempo 46566.39 26841 * *************************************************** ************* 46566.3926841 <Queso 1> terminated El proceso completo finalizo en el tiempo 46566.392 6841 Minutos En 776.106544735 horas En 32.3377726973 dias
Hasta ahora se han realizado varias simulaciones de procesos en las cuales la corrida de la simulación
es para un proceso en particular, sin embargo es posible la realización de un módulo en el cual se le
pregunta al usuario cual proceso desea simular y se le muestra un menú en el cual el usuario puede
CAPITULO 4
97
decidir cual proceso quiere simular, en la siguiente sección se muestra el modulo al que se hace
referencia en esta sección.
4.5 Módulo Menú.
En esta sección se muesta un script en Python donde muesta un menú para que el usario seleccione cual
de los 3 modelos de simulación desea ejecutar, el código esta contenido en el archivo menu.py luego de
escoger una opción, se realiza la corrida de la misma forma como se hacia anteriormente.
El scrip es el siguiente:
print "\n\n *******************************************************************" print " * *" print " * Simulacion de Procesos de Produccion en Lacteos Santa Rosa *" print " * *" print " *******************************************************************\n\n" print " (1) Simulacion del proceso de produccion de queso tipo Semi Duro\n" print " (2) Simulacion del proceso de produccion de Mantequilla\n" print " (3) Simulacion del proceso de produccion de yogurt\n\n" a=int(raw_input(" Cual Proceso Desea Simular: ")) if a==1 or a==2 or a==3 or a==4 or a==5: if a==1: print "\n Simulacion del proceso de produccion de queso tipo Semi Duro\n" import lacteos1 if a==2: print "\n Simulacion del proceso de produccion de Mantequilla\n" import lacteos4 if a==3: print "\n Simulacion del proceso de produccion de yogurt\n" import lacteos5 else: print "\n Opcion Incorrecta\n"
Cuando es ejecutado este script se tiene la siguiente salida:
CAPITULO 4
98
Figura 4.1: Salida de la corrida de menu.py.
Si se introduce el número 2, indicando que haga la simulación del proceso de producción de
mantequilla, se obtiene como resultado:
Figura 4.2: Salida de la corrida de menu.py.
Luego se hace la corrida introduciendo la cantidad de mantequillas con las que se desea simular el
proceso.
En los distintos modelos de simulación de procesos de producción de Lacteos santa Rósa se utiliza la
librería desarrollada, para la implantación de distintos recursos en SimPy como maquinas, transporte y
para la generación de llegadas y generación de tiempos aleatorios, ya que en estos procesos están
presentes esas caracteristicas. Esto muestra que la librería puede ser de gran utilidad para realizar la
simulación de cualquier modelo de simulación de un sistema de producción que utilice los modulos que
están presentes en la librería de simulación.
CAPITULO 5
99
Capítulo 5
Conclusiones y Recomendaciones.
En este capítulo se exponen las conclusiones obtenidas luego de haber finalizado el presente trabajo.
También se plantean algunas recomendaciones relacionadas con dicho proyecto, que permitirán realizar
un estudio más profundo en el tema desarrollado.
5.1 Conclusiones.
La simulación de procesos productivos se ha venido desarrollando ampliamente cada día por mas
usuarios, y con la implantación de los modelos de simulación realizados en este trabajo, haciendo uso
de SimPy, se demuestra que bajo software libre se puede desarrollar modelos de simulación, lo que es
de suma importancia debido a que los usuarios no tendrán que limitarse al uso de software propietario,
considerando sus elevados costos y sus limitaciones que privan al usuario de modificar y comprender
cómo se desarrolla dicho software.
Con la implantación de ejemplos de simulación de procesos productivos en este proyecto mediante el
uso del paquete de simulación de eventos discretos SimPy, el cual es orientado por objetos y ejecutado
desde Python, el mismo puede ser usado como referencia para el desarrollo de modelos de simulación
usando paquetes de simulación diferentes al estudiado en el presente proyecto.
Debido a que la filosofía de desarrollo de SimPy es de software libre, este proporciona ciertas
CAPITULO 5
100
libertades a los usuarios, como es la libertad de poder modificar y extender el trabajo desarrollado, de
acuerdo a las necesidades de cada usuario. Así como es de gran importancia para la simulación de
procesos productivos, la simulación orientada por objetos, que permitió el desarrollo de un código
reutilizable para muchas aplicaciones, también lo es para otros tipos de simulación, y es posible aplicar
esto a distintos tipos de simulación diferentes a la de procesos productivos, y así poder contar con una
librería que pueda ser llamada para la realización de un modelo de simulación de cualquier tipo.
Es posible la escritura de un código reutilizable pasa simulaciones de procesos productivos, con lo que
facilita el desarrollo de aplicaciones de simulación a los usuarios, simplificando el trabajo y ahorrando
el tiempo de desarrollo de modelos de simulación.
El presente trabajo tiene un gran aporte al lenguaje de simulación SimPy ya que le agrega al lenguaje
SimPy una librería útil para la simulación de procesos de producción y servicios la cual simplifica la
programación de modelos de simulación de este tipo. De tal forma que para la realización de modelos
de este tipo solo hay que llamar la librería pasándole parámetros. La aplicación esta disponible por el
correo electrónico: bohorquezp@gmail.com
5.2 Recomendaciones.
Luego de concluir el presente trabajo también se presentan algunas recomendaciones útiles, que
servirán de idea para complementar y profundizar el estudio de la simulación.
Promover el uso del paquete de simulación SimPy debido a los beneficios que proporciona en el área
de simulación en la Investigación de Operaciones.
Complementar el presente trabajo mediante el diseño de una interfaz gráfica compatible con el lenguaje
de programación Python y agregar agregar la posibilidad de tomar los datos para la simulacion de un
archivo el cual es leído por el modelo.
Hacer uso del paquete SimPy para la realización de simulaciones de cualquier tipo, observando la
metodología de desarrollo de aplicaciones de simulación observada en el desarrollo de este proyecto.
BIBLIOGRAFIA
101
Bibliografía.
� [1] Barceló, J. (1996). Simulación de Sistemas Discretos (primera edición). Barcelona: Isdefe.
� [2] Simulación y Optimización. Ingeniería Informática. Consultado en Diciembre de 2008.
www.isa.cie.uva.es/~felipe/docencia/so4inf/tema1.pdf
� [3] Universidad de Buenos Aires, Facultad de Ingenería. (2005). Simulacion. Consultado en
diciembre de 2008. http://materias.fi.uba.ar
� [4] Hoeger, H.(2000). Apuntes de Simulación. Guias en Linea. Consultado en Diciembre de
2008.
� [5] Racero, J. (2004). Ingenería Industrial-Simulacion de Eventos Discretos. Universidad de
Sevilla Grupo de Investigación Tecnologías de la información e informatica. Consultado en
Diciembre de 2008. http://racero.us.es/
� [6] Simulación Discreta. Universidad Del Valle, Cali, consultado en Diciembre de 2008.
http://sigma.univalle.edu.co/index_archivos/IO2/SIMULACION%20PRESENTACION%201.p
pt.
� [7] Law, A y Kelton, W. (2000). Simulation Modeling & Analysis.McGraw-Hill, tercera edición,
BIBLIOGRAFIA
102
2000.
� [8] Guash, A.; Piera, M.; Casanovas, J.; Figueras J.(2005). Aplicaciones a procesos
logísticos de fabricación y servicios (1ra ed). Mexico: Edicions UPC,2005.
� [9] Fernandez, F. (2005). El lenguaje Simula. Consultado en Enero de 2009.
http://www.lcc.uma.es/ blas/apuntes/PDAv/p2005-2006/simula1.pdf
� [10] Zeigler, B.; Praehofer, H.; Kim, T. (2000). Theory of Modeling and Simulation.
(2da ed). Academic Press.
� [11] Wikipedia. Consultado en Enero de 2009. http://es.wikipedia.org/wiki/Python
� [12] Muller, K.(2003). SimPy Homepage. Consultado en enero de 2009. Disponible
en: http://simpy.sourceforge.net/.
� [13] Kiviat, P. (1971). Simulation Languages, in: Computer Simulation Experiments with
Models of Economic Systems. John Wiley.
� [14] Pooch, U. y Wall, J.(2000). Discrete Event Simulation: A practical approach
(2da ed). CRC Press.
� [15] Universidad diego portales. Simulación de Procesos Industriales, Introducción a Arena.
Consultado en Enero de 2009. http://www.udp.cl/
� [16] Portal MIPYMEs. Procesos productivos. Consultado en Enero de 2009.
http://www.conamype.gob.sv/cajadeherramientas/mipymes/como_admin/proceso1.htm
� [17] Wikipedia. Proceso Productivo. Consultado en Marzo 2009.
http://es.wikipedia.org/wiki/Proceso_Productivo
BIBLIOGRAFIA
103
� [18] Gestiopolis. Organización de los sistemas productivos. Consultado en Marzo de 2009.
http://www.gestiopolis.com/recursos2/documentos/fulldocs/ger/orgsisprod.htm
� [19] Elegibles.net. Simulación de Procesos. Consultado en Marzo de 2009.
http://elegibles.ning.com/foropublico/topic/show?id=546080%3ATopic%3A10082&page=1&c
ommentId=546080%3AComment%3A11553
� [20] www.estrucplan.com.ar. Calidad. Consultado en Marzo de 2009.
http://www.estrucplan.com.ar/Producciones/entrega.asp?IdEntrega=844
� [21] Wikipedia. Biblioteca (Informatica). Consultado en Marzo 2009. http://es.wikipedia.org/wiki/Biblioteca_(programaci%C3%B3n)
� [22] Briceño, E. (2007). Estudio Comparativo del Paquete de Simulación Orientado a Eventos
Discretos SimPy. Desarrollo de un Manual de Usuario con Ejemplos Resueltos.
� [23] Santiago, Y. Simulacíon de la Linea de Produccion de los Pasaportes Electronicos del
Servicio Autonomo de Identificación, Migracio y Extrangeria (SAIME).
� [24] Perdomo, M. (2007). Modelado y Simulación por Eventos Discretos Mediante Redes de
Petri Usando SimPy.
BIBLIOGRAFIA
104
� [25] Rivas, Y. Desarrollo de un Modelo de Simulación para el Sistema Automatizado de
Identificación Dactilar (AFIS) del Servicio Autónomo de Identificación, Migración y
Extranjería (SAIME). Optimización del AFIS.
� [26] Pacheco, J. (2007) Optimización de Modelos de Simulación en SimPy Utilizando la
Metaheuristica de Recocido Simulado.
� [27] Avendaño, J. (2007) Optimización de Modelos de Simulación en SimPy. Aplicación de la
Metodología de Superficie de Respuesta.
APENDICE A
105
Apendice A
Scripts de Simulación de Procesos de Producción de Lácteos
Santa Rosa.
A.1 Proceso de Producción de Queso Semiduro
# Simulacion del proceso de produccion de queso tipo Semi Duro # Lactos Santa Rosa - ULA from SimPy.SimulationTrace import * from procesos import procesoproductivo ## Model components class queso(Process): quesolisto=0 def product(self,factory): #eventos del proceso ordegnar las vacas #solicitar el recurso yield request,self,factory.ordegno #ocupar el recurso yield hold,self,tordeg #liberar el recurso yield release,self,factory.ordegno #eventos del proceso transporte carretilla #solicitar el recurso yield request,self,factory.carretilla #ocupar el recurso yield hold,self,tcarretilla #liberar el recurso yield release,self,factory.carretilla #eventos del proceso hacer analisis a la muestra de leche #solicitar el recurso yield request,self,factory.analisis #ocupar el recurso yield hold,self,tanalisis #liberar el recurso yield release,self,factory.analisis #eventos del proceso transporte manual #solicitar el recurso
APENDICE A
106
yield request,self,factory.tmanual1 #ocupar el recurso yield hold,self,ttmanual1 #liberar el recurso yield release,self,factory.tmanual1 #eventos eventos del proceso de descremar la leche #solicitar el recurso yield request,self,factory.descremado #ocupar el recurso yield hold,self,tdescrem #liberar el recurso yield release,self,factory.descremado #eventos del proceso de mezclar la leche #solicitar el recurso yield request,self,factory.mezclado #ocupar el recurso yield hold,self,tmezclado #liberar el recurso yield release,self,factory.mezclado #eventos del proceso de pasteurizar la leche a 65 grados #solicitar el recurso yield request,self,factory.pasteurizado #ocupar el recurso yield hold,self,tpasteurizado #liberar el recurso yield release,self,factory.pasteurizado #eventos del proceso de dejar madurar la leche #solicitar el recurso yield request,self,factory.madurado #ocupar el recurso yield hold,self,tmadurado #liberar el recurso yield release,self,factory.madurado #eventos del proceso de enfriar la leche a 45 grados #solicitar el recurso yield request,self,factory.enfriado #ocupar el recurso yield hold,self,tenfriado #liberar el recurso yield release,self,factory.enfriado #eventos del proceso 1 lt de yogurt y 1 lt de estreptococo lactico y enfriar40° #solicitar el recurso yield request,self,factory.enfriadoyogurt #ocupar el recurso yield hold,self,tenfriadoyogurt #liberar el recurso yield release,self,factory.enfriadoyogurt #eventos del proceso colocar 1 lt de fermento lactico y enfriar a 34 grados #solicitar el recurso yield request,self,factory.enfriadoflact #ocupar el recurso yield hold,self,tenfriadoflact #liberar el recurso yield release,self,factory.enfriadoflact #eventos del proceso Colocar cuajo y cloruro y batir manualmente #solicitar el recurso yield request,self,factory.batidocuaj #ocupar el recurso yield hold,self,tbatidocuaj #liberar el recurso yield release,self,factory.batidocuaj #eventos del proceso esperar que cuaje #solicitar el recurso yield request,self,factory.esperarcuaj
APENDICE A
107
#ocupar el recurso yield hold,self,tesperarcuaj #liberar el recurso yield release,self,factory.esperarcuaj #eventos del proceso cortar a tamagno de granos de maiz #solicitar el recurso yield request,self,factory.cortadoqueso #ocupar el recurso yield hold,self,tcortadoqueso #liberar el recurso yield release,self,factory.cortadoqueso #eventos del proceso batir manualmente #solicitar el recurso yield request,self,factory.batidomanual #ocupar el recurso yield hold,self,tbatidomanual #liberar el recurso yield release,self,factory.batidomanual #eventos del proceso extraer suero 30% y sustituir por agua hervida a 45 grados #solicitar el recurso yield request,self,factory.extraersuero30 #ocupar el recurso yield hold,self,textraersuero30 #liberar el recurso yield release,self,factory.extraersuero30 #eventos del proceso colocar 0.5 kgs de sal por cada 100 lts y batir manualmente #solicitar el recurso yield request,self,factory.colocarsalbatido #ocupar el recurso yield hold,self,tcolocarsalbatido #liberar el recurso yield release,self,factory.colocarsalbatido #eventos del proceso extraer suero 40% #solicitar el recurso yield request,self,factory.extraersuero40 #ocupar el recurso yield hold,self,textraersuero40 #liberar el recurso yield release,self,factory.extraersuero40 #eventos del proceso llenar los moldes #solicitar el recurso yield request,self,factory.llenarmoldes #ocupar el recurso yield hold,self,tllenarmoldes #liberar el recurso yield release,self,factory.llenarmoldes #eventos del proceso dejar reposar #solicitar el recurso yield request,self,factory.reposar #ocupar el recurso yield hold,self,treposar #liberar el recurso yield release,self,factory.reposar #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual2 #ocupar el recurso yield hold,self,ttmanual2 #liberar el recurso yield release,self,factory.tmanual2 #eventos del proceso prensar y voltear #solicitar el recurso yield request,self,factory.prensar #ocupar el recurso
APENDICE A
108
yield hold,self,tprensar #liberar el recurso yield release,self,factory.prensar #eventos del proceso colocar en salmuera #solicitar el recurso yield request,self,factory.salmuera #ocupar el recurso yield hold,self,tsalmuera #liberar el recurso yield release,self,factory.salmuera #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual3 #ocupar el recurso yield hold,self,ttmanual3 #liberar el recurso yield release,self,factory.tmanual3 #eventos del proceso dejar madurar #solicitar el recurso yield request,self,factory.maduracion #ocupar el recurso yield hold,self,tmaduracion #liberar el recurso yield release,self,factory.maduracion #eventos del proceso envolver los quesos #solicitar el recurso yield request,self,factory.envoltura #ocupar el recurso yield hold,self,tenvoltura #liberar el recurso yield release,self,factory.envoltura queso.quesolisto+=1 print"\n****************************************************************" print "* El queso Nro ",queso.quesolisto," termino en el tiempo ",now()," *" print"****************************************************************\n" class llamada: # llamada a la libreria procesos.py d=procesoproductivo() ordegno=d.maquina("Ordegnar las vacas","Unidad",1,FIFO,False,True,Monitor) carretilla=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) analisis=d.maquina("Analisis a la leche","Unidad",1,FIFO,False,True,Monitor) tmanual1=d.transporte("Transporte manual","Unidad",1,FIFO,False,True,Monitor) descremado=d.maquina("Descremadora","Unidad",1,FIFO,False,True,Monitor) mezclado=d.maquina("Mezcladora","Unidad",3,FIFO,False,True,Monitor) pasteurizado=d.maquina("Pasteurizadora","Unidad",1,FIFO,False,True,Monitor) madurado=d.maquina("Deposito Maduracion","Unidad",10,FIFO,False,True,Monitor) enfriado=d.maquina("Enfriadora","Unidad",1,FIFO,False,True,Monitor) enfriadoyogurt=d.maquina("Enfriadora","Unidad",1,FIFO,False,True,Monitor) enfriadoflact=d.maquina("Enfriadora","Unidad",1,FIFO,False,True,Monitor) batidocuaj=d.maquina("Batido cuajo a mano","Unidad",3,FIFO,False,True,Monitor) esperarcuaj=d.deposito_temporal("Esperar que cuaje","Unidad", 10,FIFO,False,True,Monitor) cortadoqueso=d.maquina("Cortado de queso","Unidad",3,FIFO,False,True,Monitor) batidomanual=d.maquina("Batido a mano","Unidad",3,FIFO,False,True,Monitor) extraersuero30=d.maquina("Extraer suero 30%","Unidad",3,FIFO,False,True,Monitor) colocarsalbatido=d.maquina("Colocar sal y batir","Unidad",3,FIFO,False,True,Monitor) extraersuero40=d.maquina("Extraer suero 40%","Unidad",3,FIFO,False,True,Monitor) llenarmoldes=d.maquina("Llenar moldes","Unidad",1,FIFO,False,True,Monitor) reposar=d.deposito_temporal("Reposar","Unidad",10,FIFO,False,True,Monitor) tmanual2=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) prensar=d.deposito_temporal("Prensado","Unidad",10,FIFO,False,True,Monitor) salmuera=d.deposito_temporal("Salmuera","Unidad",2,FIFO,False,True,Monitor) tmanual3=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor)
APENDICE A
109
maduracion=d.deposito_temporal("Maduracion","Unidad",15,FIFO,False,True,Monitor) envoltura=d.maquina("Envoltura","Unidad",1,FIFO,False,True,Monitor) ## Model def model(): initialize() for prodname,arrivaltime in quesolist: prod=queso(name=prodname) activate(prod,prod.product(factory=llamada),at=arrivaltime) simulate(until=simtime) ## Experiment data lleg=procesoproductivo() # solicita al usuario el numero de quesos n=int(raw_input("\n Introduzca el numero de quesos: ")) quesolist = lleg.llegada(n,"Queso",1) q=procesoproductivo() tordeg=120 tcarretilla=5 tanalisis=2 ttmanual1=1 tdescrem=q.uniforme(14,16) tmezclado=q.uniforme(14,16) tpasteurizado=q.uniforme(14,16) tmadurado=30 tenfriado=q.uniforme(18,22) tenfriadoyogurt=q.uniforme(9,11) tenfriadoflact=q.uniforme(9,11) tbatidocuaj=5 tesperarcuaj=35 tcortadoqueso=q.uniforme(9,11) tbatidomanual=10 textraersuero30=q.uniforme(4,6) tcolocarsalbatido=10 textraersuero40=q.uniforme(4,6) tllenarmoldes=q.uniforme(4,6) treposar=10 ttmanual2=1 tprensar=1440 tsalmuera=1440 ttmanual3=1 tmaduracion=43200 tenvoltura=30 simtime=1000000 ## Experiment model() ## Analysis/output print "\n\nEl proceso completo finalizo en el tiempo %s"%now(),"Minutos" a=now() horas=a/60 dias=horas/24 print "\nEn",horas,"","horas" print "\nEn",dias,"","dias\n"
A.2 Proceso de Producción de Mantequilla
# Simulacion del proceso de produccion de Mantequilla # Lactos Santa Rosa - ULA from SimPy.SimulationTrace import *
APENDICE A
110
from procesos import procesoproductivo ## Model components class mantequilla(Process): mantequillalista=0 def product(self,factory): #eventos del proceso ordegnar las vacas #solicitar el recurso yield request,self,factory.ordegno #ocupar el recurso yield hold,self,tordeg #liberar el recurso yield release,self,factory.ordegno #eventos del proceso transporte carretilla #solicitar el recurso yield request,self,factory.carretilla #ocupar el recurso yield hold,self,tcarretilla #liberar el recurso yield release,self,factory.carretilla #eventos del proceso hacer analisis a la muestra de leche #solicitar el recurso yield request,self,factory.analisis #ocupar el recurso yield hold,self,tanalisis #liberar el recurso yield release,self,factory.analisis #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual1 #ocupar el recurso yield hold,self,ttmanual1 #liberar el recurso yield release,self,factory.tmanual1 #eventos eventos del proceso de descremar la leche #solicitar el recurso yield request,self,factory.descremado #ocupar el recurso yield hold,self,tdescrem #liberar el recurso yield release,self,factory.descremado #eventos eventos del proceso de pasteurizar la crema #solicitar el recurso yield request,self,factory.pasteurizado #ocupar el recurso yield hold,self,tpasteurizado #liberar el recurso yield release,self,factory.pasteurizado #eventos del proceso de enfriar la crema a 22 grados #solicitar el recurso yield request,self,factory.enfriado #ocupar el recurso yield hold,self,tenfriado #liberar el recurso yield release,self,factory.enfriado #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual2 #ocupar el recurso yield hold,self,ttmanual2 #liberar el recurso yield release,self,factory.tmanual2 #eventos del proceso de dejar madurar la crema #solicitar el recurso yield request,self,factory.madurar
APENDICE A
111
#ocupar el recurso yield hold,self,tmadurar #liberar el recurso yield release,self,factory.madurar #eventos del proceso enfriar en cava a 4 grados #solicitar el recurso yield request,self,factory.enfriarcava #ocupar el recurso yield hold,self,tenfriarcava #liberar el recurso yield release,self,factory.enfriarcava #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual3 #ocupar el recurso yield hold,self,ttmanual3 #liberar el recurso yield release,self,factory.tmanual3 #eventos del proceso batir manualmente para extraer suero #solicitar el recurso yield request,self,factory.batidomanual #ocupar el recurso yield hold,self,tbatidomanual #liberar el recurso yield release,self,factory.batidomanual #eventos del proceso lavar la crema y batir manualmente #solicitar el recurso yield request,self,factory.lavarbatido #ocupar el recurso yield hold,self,tlavarbatido #liberar el recurso yield release,self,factory.lavarbatido #eventos del proceso amasar la crema #solicitar el recurso yield request,self,factory.amasar #ocupar el recurso yield hold,self,tamasar #liberar el recurso yield release,self,factory.amasar #eventos del proceso envasar la mantequilla #solicitar el recurso yield request,self,factory.envasado #ocupar el recurso yield hold,self,tenvasado #liberar el recurso yield release,self,factory.envasado mantequilla.mantequillalista+=1 print"\n******************************************************************" print "* La mantequilla Nro ",mantequilla.mantequillalista," termino en el tiempo ",now()," *" print"******************************************************************\n" class llamada: # llamada a la libreria procesos.py d=procesoproductivo() ordegno=d.maquina("Ordegnar las vacas","Unidad",1,FIFO,False,True,Monitor) carretilla=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) analisis=d.maquina("Analisis a la leche","Unidad",1,FIFO,False,True,Monitor) tmanual1=d.transporte("Transporte manual","Unidad",1,FIFO,False,True,Monitor) descremado=d.maquina("Descremadora","Unidad",1,FIFO,False,True,Monitor) pasteurizado=d.maquina("Pasteurizadora","Unidad",1,FIFO,False,True,Monitor) enfriado=d.maquina("Enfriadora","Unidad",1,FIFO,False,True,Monitor) tmanual2=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) madurar=d.deposito_temporal("Esperar que cuaje","Unidad",10, FIFO,False,True,Monitor)
APENDICE A
112
enfriarcava=d.maquina("Enfriar en la cava","Unidad",3,FIFO,False,True,Monitor) tmanual3=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) batidomanual=d.maquina("Batido a mano","Unidad",3,FIFO,False,True,Monitor) lavarbatido=d.maquina("Lavar la crema y batir","Unidad",3,FIFO,False,True,Monitor) amasar=d.maquina("Amasar","Unidad",1,FIFO,False,True,Monitor) envasado=d.maquina("Envoltura","Unidad",1,FIFO,False,True,Monitor) ## Model def model(): initialize() for prodname,arrivaltime in mantequillalist: prod=mantequilla(name=prodname) activate(prod,prod.product(factory=llamada),at=arrivaltime) simulate(until=simtime) ## Experiment data lleg=procesoproductivo() # solicita al usuario el numero de mantequillas n=int(raw_input("\n Introduzca el numero de mantequillas: ")) mantequillalist = lleg.llegada(n,"Mantequilla",1) q=procesoproductivo() tordeg=45 tcarretilla=5 tanalisis=2 ttmanual1=1 tdescrem=q.uniforme(19,21) tpasteurizado=q.uniforme(55,65) tenfriado=q.uniforme(19,21) ttmanual2=1 tmadurar=1440 tenfriarcava=2160 ttmanual3=1 tbatidomanual=q.uniforme(4,6) tlavarbatido=q.uniforme(4,6) tamasar=q.uniforme(2,3) tenvasado=q.uniforme(8,12) simtime=1000000 ## Experiment model() ## Analysis/output print "\n\nEl proceso completo finalizo en el tiempo %s"%now(),"Minutos" a=now() horas=a/60 dias=horas/24 print "\nEn",horas,"","horas" print "\nEn",dias,"","dias\n"
A.3 Proceso de Producción de Yogurt
# Simulacion del proceso de produccion de yogurt # Lactos Santa Rosa - ULA from SimPy.SimulationTrace import * from procesos import procesoproductivo ## Model components class yogurt(Process): yogurtlisto=0 def product(self,factory): #eventos del proceso ordegnar las vacas #solicitar el recurso
APENDICE A
113
yield request,self,factory.ordegno #ocupar el recurso yield hold,self,tordeg #liberar el recurso yield release,self,factory.ordegno #eventos del proceso transporte carretilla #solicitar el recurso yield request,self,factory.carretilla #ocupar el recurso yield hold,self,tcarretilla #liberar el recurso yield release,self,factory.carretilla #eventos del proceso hacer analisis a la muestra de leche #solicitar el recurso yield request,self,factory.analisis #ocupar el recurso yield hold,self,tanalisis #liberar el recurso yield release,self,factory.analisis #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual1 #ocupar el recurso yield hold,self,ttmanual1 #liberar el recurso yield release,self,factory.tmanual1 #eventos eventos del proceso de descremar la leche #solicitar el recurso yield request,self,factory.descremado #ocupar el recurso yield hold,self,tdescrem #liberar el recurso yield release,self,factory.descremado #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual2 #ocupar el recurso yield hold,self,ttmanual2 #liberar el recurso yield release,self,factory.tmanual2 #eventos del proceso colocar colocar en batidora y agregar Y1 y Y2 #solicitar el recurso yield request,self,factory.colocarY1Y2 #ocupar el recurso yield hold,self,tcolocarY1Y2 #liberar el recurso yield release,self,factory.colocarY1Y2 #eventos del proceso batir en la maquina batidora #solicitar el recurso yield request,self,factory.batidomaquina #ocupar el recurso yield hold,self,tbatidomaquina #liberar el recurso yield release,self,factory.batidomaquina #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual3 #ocupar el recurso yield hold,self,ttmanual3 #liberar el recurso yield release,self,factory.tmanual3 #eventos del proceso de pasteurizar la crema a 85 grados #solicitar el recurso yield request,self,factory.pasteurizado
APENDICE A
114
#ocupar el recurso yield hold,self,tpasteurizado #liberar el recurso yield release,self,factory.pasteurizado #eventos del proceso enfriar a 45 grados #solicitar el recurso yield request,self,factory.enfriado #ocupar el recurso yield hold,self,tenfriado #liberar el recurso yield release,self,factory.enfriado #eventos del proceso colocar 200 ml de yogurt y batir manualmente #solicitar el recurso yield request,self,factory.batidoyogurt #ocupar el recurso yield hold,self,tbatidoyogurt #liberar el recurso yield release,self,factory.batidoyogurt #eventos del proceso envasar el yogurt #solicitar el recurso yield request,self,factory.envasado #ocupar el recurso yield hold,self,tenvasado #liberar el recurso yield release,self,factory.envasado #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual4 #ocupar el recurso yield hold,self,ttmanual4 #liberar el recurso yield release,self,factory.tmanual4 #eventos del proceso colocar en incubadora a 45 grados #solicitar el recurso yield request,self,factory.incubadora #ocupar el recurso yield hold,self,tincubadora #liberar el recurso yield release,self,factory.incubadora #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual5 #ocupar el recurso yield hold,self,ttmanual5 #liberar el recurso yield release,self,factory.tmanual5 #eventos del proceso refrigerar #solicitar el recurso yield request,self,factory.refrigerar #ocupar el recurso yield hold,self,trefrigerar #liberar el recurso yield release,self,factory.refrigerar yogurt.yogurtlisto+=1 print"\n****************************************************************" print "* El yogurt Nro ",yogurt.yogurtlisto," termino en el tiempo ",now()," *" print"****************************************************************\n" class llamada: # llamada a la libreria procesos.py d=procesoproductivo() ordegno=d.maquina("Ordegnar las vacas","Unidad",1,FIFO,False,True,Monitor) carretilla=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) analisis=d.maquina("Analisis a la leche","Unidad",1,FIFO,False,True,Monitor)
APENDICE A
115
tmanual1=d.transporte("Transporte manual","Unidad",1,FIFO,False,True,Monitor) descremado=d.maquina("Descremadora","Unidad",1,FIFO,False,True,Monitor) tmanual2=d.transporte("Transporte manual","Unidad",1,FIFO,False,True,Monitor) colocarY1Y2=d.maquina("Colocar en Maquina batidora","Unidad",1,FIFO, False,True,Monitor) batidomaquina=d.maquina("Batido en maquina","Unidad",1,FIFO,False,True,Monitor) tmanual3=d.transporte("TCarretilla","Unidad",1,FIFO,False,True,Monitor) pasteurizado=d.maquina("Pasteurizadora","Unidad",1,FIFO,False,True,Monitor) enfriado=d.maquina("Enfriadora","Unidad",1,FIFO,False,True,Monitor) batidoyogurt=d.maquina("colocar yogurt y batir","Unidad",10,FIFO, False,True,Monitor) envasado=d.maquina("Envasado","Unidad",3,FIFO,False,True,Monitor) tmanual4=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) incubadora=d.maquina("Incubadora","Unidad",3,FIFO,False,True,Monitor) tmanual5=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) refrigerar=d.maquina("Refrigerador","Unidad",3,FIFO,False,True,Monitor) ## Model def model(): initialize() for prodname,arrivaltime in yogurtlist: prod=yogurt(name=prodname) activate(prod,prod.product(factory=llamada),at=arrivaltime) simulate(until=simtime) ## Experiment data lleg=procesoproductivo() # solicita al usuario el numero de yogurts n=int(raw_input("\n Introduzca el numero de yogurts: ")) yogurtlist = lleg.llegada(n,"Yogurt",1) q=procesoproductivo() tordeg=11 tcarretilla=5 tanalisis=2 ttmanual1=1 tdescrem=q.uniforme(4,6) ttmanual2=1 tcolocarY1Y2=q.uniforme(1,2) tbatidomaquina=q.uniforme(9,11) ttmanual3=1 tpasteurizado=q.uniforme(55,65) tenfriado=q.uniforme(9,11) tbatidoyogurt=2 tenvasado=q.uniforme(6,8) ttmanual4=1 tincubadora=240 ttmanual5=1 trefrigerar=180 simtime=1000000 ## Experiment model() ## Analysis/output print "\n\nEl proceso completo finalizo en el tiempo %s"%now(),"Minutos" a=now() horas=a/60 dias=horas/24 print "\nEn",horas,"","horas" print "\nEn",dias,"","dias\n"
APENDICE A
116
A.4 Simulación de los 3 Procesos Simultáneamente
# Simulacion de 3 procesos produccion en simultaneo # Lactos Santa Rosa - ULA from SimPy.SimulationTrace import * from procesos import procesoproductivo ## Model components class queso(Process): quesolisto=0 def productq(self,factory): #eventos del proceso ordegnar las vacas #solicitar el recurso yield request,self,factory.ordegno #ocupar el recurso yield hold,self,tordeg #liberar el recurso yield release,self,factory.ordegno #eventos del proceso transporte carretilla #solicitar el recurso yield request,self,factory.carretilla #ocupar el recurso yield hold,self,tcarretilla #liberar el recurso yield release,self,factory.carretilla #eventos del proceso hacer analisis a la muestra de leche #solicitar el recurso yield request,self,factory.analisis #ocupar el recurso yield hold,self,tanalisis #liberar el recurso yield release,self,factory.analisis #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual1 #ocupar el recurso yield hold,self,ttmanual1 #liberar el recurso yield release,self,factory.tmanual1 #eventos eventos del proceso de descremar la leche #solicitar el recurso yield request,self,factory.descremado #ocupar el recurso yield hold,self,tdescrem #liberar el recurso yield release,self,factory.descremado #eventos del proceso de mezclar la leche #solicitar el recurso yield request,self,factory.mezclado #ocupar el recurso yield hold,self,tmezclado #liberar el recurso yield release,self,factory.mezclado #eventos del proceso de pasteurizar la leche a 65 grados #solicitar el recurso yield request,self,factory.pasteurizado #ocupar el recurso yield hold,self,tpasteurizado #liberar el recurso yield release,self,factory.pasteurizado #eventos del proceso de dejar madurar la leche
APENDICE A
117
#solicitar el recurso yield request,self,factory.madurado #ocupar el recurso yield hold,self,tmadurado #liberar el recurso yield release,self,factory.madurado #eventos del proceso de enfriar la leche a 45 grados #solicitar el recurso yield request,self,factory.enfriado #ocupar el recurso yield hold,self,tenfriado #liberar el recurso yield release,self,factory.enfriado #eventos del proceso Colocar 1 lt de yogurt y 1 lt de estreptococo #lactico y enfriar a 40 grados #solicitar el recurso yield request,self,factory.enfriadoyogurt #ocupar el recurso yield hold,self,tenfriadoyogurt #liberar el recurso yield release,self,factory.enfriadoyogurt #eventos del proceso colocar 1 lt de fermento lactico y enfriar a 34 grados #solicitar el recurso yield request,self,factory.enfriadoflact #ocupar el recurso yield hold,self,tenfriadoflact #liberar el recurso yield release,self,factory.enfriadoflact #eventos del proceso Colocar cuajo y cloruro y batir manualmente #solicitar el recurso yield request,self,factory.batidocuaj #ocupar el recurso yield hold,self,tbatidocuaj #liberar el recurso yield release,self,factory.batidocuaj #eventos del proceso esperar que cuaje #solicitar el recurso yield request,self,factory.esperarcuaj #ocupar el recurso yield hold,self,tesperarcuaj #liberar el recurso yield release,self,factory.esperarcuaj #eventos del proceso cortar a tamagno de granos de maiz #solicitar el recurso yield request,self,factory.cortadoqueso #ocupar el recurso yield hold,self,tcortadoqueso #liberar el recurso yield release,self,factory.cortadoqueso #eventos del proceso batir manualmente #solicitar el recurso yield request,self,factory.batidomanual #ocupar el recurso yield hold,self,tbatidomanual #liberar el recurso yield release,self,factory.batidomanual #eventos del proceso extraer suero 30% y sustituir por agua hervida #a 45 grados #solicitar el recurso yield request,self,factory.extraersuero30 #ocupar el recurso yield hold,self,textraersuero30 #liberar el recurso yield release,self,factory.extraersuero30
APENDICE A
118
#eventos del proceso colocar 0.5 kgs de sal por cada 100 lts y #batir manualmente #solicitar el recurso yield request,self,factory.colocarsalbatido #ocupar el recurso yield hold,self,tcolocarsalbatido #liberar el recurso yield release,self,factory.colocarsalbatido #eventos del proceso extraer suero 40% #solicitar el recurso yield request,self,factory.extraersuero40 #ocupar el recurso yield hold,self,textraersuero40 #liberar el recurso yield release,self,factory.extraersuero40 #eventos del proceso llenar los moldes #solicitar el recurso yield request,self,factory.llenarmoldes #ocupar el recurso yield hold,self,tllenarmoldes #liberar el recurso yield release,self,factory.llenarmoldes #eventos del proceso dejar reposar #solicitar el recurso yield request,self,factory.reposar #ocupar el recurso yield hold,self,treposar #liberar el recurso yield release,self,factory.reposar #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual2 #ocupar el recurso yield hold,self,ttmanual2 #liberar el recurso yield release,self,factory.tmanual2 #eventos del proceso prensar y voltear #solicitar el recurso yield request,self,factory.prensar #ocupar el recurso yield hold,self,tprensar #liberar el recurso yield release,self,factory.prensar #eventos del proceso colocar en salmuera #solicitar el recurso yield request,self,factory.salmuera #ocupar el recurso yield hold,self,tsalmuera #liberar el recurso yield release,self,factory.salmuera #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual3 #ocupar el recurso yield hold,self,ttmanual3 #liberar el recurso yield release,self,factory.tmanual3 #eventos del proceso dejar madurar #solicitar el recurso yield request,self,factory.maduracion #ocupar el recurso yield hold,self,tmaduracion #liberar el recurso yield release,self,factory.maduracion
APENDICE A
119
#eventos del proceso envolver los quesos #solicitar el recurso yield request,self,factory.envoltura #ocupar el recurso yield hold,self,tenvoltura #liberar el recurso yield release,self,factory.envoltura queso.quesolisto+=1 print"\n****************************************************************" print "* El queso Nro ",queso.quesolisto," termino en el tiempo ",now(), print"****************************************************************\n" class mantequilla(Process): mantequillalista=0 def productm(self,factory): #eventos del proceso ordegnar las vacas #solicitar el recurso yield request,self,factory.ordegno #ocupar el recurso yield hold,self,tordeg #liberar el recurso yield release,self,factory.ordegno #eventos del proceso transporte carretilla #solicitar el recurso yield request,self,factory.carretilla #ocupar el recurso yield hold,self,tcarretilla #liberar el recurso yield release,self,factory.carretilla #eventos del proceso hacer analisis a la muestra de leche #solicitar el recurso yield request,self,factory.analisis #ocupar el recurso yield hold,self,tanalisis #liberar el recurso yield release,self,factory.analisis #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual1 #ocupar el recurso yield hold,self,ttmanual1 #liberar el recurso yield release,self,factory.tmanual1 #eventos eventos del proceso de descremar la leche #solicitar el recurso yield request,self,factory.descremado #ocupar el recurso yield hold,self,tdescrem #liberar el recurso yield release,self,factory.descremado #eventos eventos del proceso de pasteurizar la crema #solicitar el recurso yield request,self,factory.pasteurizado #ocupar el recurso yield hold,self,tpasteurizado #liberar el recurso yield release,self,factory.pasteurizado #eventos del proceso de enfriar la crema a 22 grados #solicitar el recurso yield request,self,factory.enfriado #ocupar el recurso yield hold,self,tenfriado #liberar el recurso yield release,self,factory.enfriado #eventos del proceso transporte manual
APENDICE A
120
#solicitar el recurso yield request,self,factory.tmanual2 #ocupar el recurso yield hold,self,ttmanual2 #liberar el recurso yield release,self,factory.tmanual2 #eventos del proceso de dejar madurar la crema #solicitar el recurso yield request,self,factory.madurado #ocupar el recurso yield hold,self,tmadurado #liberar el recurso yield release,self,factory.madurado #eventos del proceso enfriar en cava a 4 grados #solicitar el recurso yield request,self,factory.enfriarcava #ocupar el recurso yield hold,self,tenfriarcava #liberar el recurso yield release,self,factory.enfriarcava #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual3 #ocupar el recurso yield hold,self,ttmanual3 #liberar el recurso yield release,self,factory.tmanual3 #eventos del proceso batir manualmente para extraer suero #solicitar el recurso yield request,self,factory.batidomanual #ocupar el recurso yield hold,self,tbatidomanual #liberar el recurso yield release,self,factory.batidomanual #eventos del proceso lavar la crema y batir manualmente #solicitar el recurso yield request,self,factory.lavarbatido #ocupar el recurso yield hold,self,tlavarbatido #liberar el recurso yield release,self,factory.lavarbatido #eventos del proceso amasar la crema #solicitar el recurso yield request,self,factory.amasar #ocupar el recurso yield hold,self,tamasar #liberar el recurso yield release,self,factory.amasar #eventos del proceso envasar la mantequilla #solicitar el recurso yield request,self,factory.envasado #ocupar el recurso yield hold,self,tenvasado #liberar el recurso yield release,self,factory.envasado mantequilla.mantequillalista+=1 print"\n******************************************************************" print "* La mantequilla Nro ",mantequilla.mantequillalista," termino en el tiempo ",now()," *" print"******************************************************************\n" class yogurt(Process): yogurtlisto=0 def producty(self,factory): #eventos del proceso ordegnar las vacas
APENDICE A
121
#solicitar el recurso yield request,self,factory.ordegno #ocupar el recurso yield hold,self,tordeg #liberar el recurso yield release,self,factory.ordegno #eventos del proceso transporte carretilla #solicitar el recurso yield request,self,factory.carretilla #ocupar el recurso yield hold,self,tcarretilla #liberar el recurso yield release,self,factory.carretilla #eventos del proceso hacer analisis a la muestra de leche #solicitar el recurso yield request,self,factory.analisis #ocupar el recurso yield hold,self,tanalisis #liberar el recurso yield release,self,factory.analisis #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual1 #ocupar el recurso yield hold,self,ttmanual1 #liberar el recurso yield release,self,factory.tmanual1 #eventos eventos del proceso de descremar la leche #solicitar el recurso yield request,self,factory.descremado #ocupar el recurso yield hold,self,tdescrem #liberar el recurso yield release,self,factory.descremado #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual2 #ocupar el recurso yield hold,self,ttmanual2 #liberar el recurso yield release,self,factory.tmanual2 #eventos del proceso colocar colocar en batidora y agregar Y1 y Y2 #solicitar el recurso yield request,self,factory.colocarY1Y2 #ocupar el recurso yield hold,self,tcolocarY1Y2 #liberar el recurso yield release,self,factory.colocarY1Y2 #eventos del proceso batir en la maquina batidora #solicitar el recurso yield request,self,factory.batidomaquina #ocupar el recurso yield hold,self,tbatidomaquina #liberar el recurso yield release,self,factory.batidomaquina #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual3 #ocupar el recurso yield hold,self,ttmanual3 #liberar el recurso yield release,self,factory.tmanual3 #eventos del proceso de pasteurizar la crema a 85 grados #solicitar el recurso
APENDICE A
122
yield request,self,factory.pasteurizado #ocupar el recurso yield hold,self,tpasteurizado #liberar el recurso yield release,self,factory.pasteurizado #eventos del proceso enfriar a 45 grados #solicitar el recurso yield request,self,factory.enfriado #ocupar el recurso yield hold,self,tenfriado #liberar el recurso yield release,self,factory.enfriado #eventos del proceso colocar 200 ml de yogurt y batir manualmente #solicitar el recurso yield request,self,factory.batidoyogurt #ocupar el recurso yield hold,self,tbatidoyogurt #liberar el recurso yield release,self,factory.batidoyogurt #eventos del proceso envasar el yogurt #solicitar el recurso yield request,self,factory.envasado #ocupar el recurso yield hold,self,tenvasado #liberar el recurso yield release,self,factory.envasado #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual4 #ocupar el recurso yield hold,self,ttmanual4 #liberar el recurso yield release,self,factory.tmanual4 #eventos del proceso colocar en incubadora a 45 grados #solicitar el recurso yield request,self,factory.incubadora #ocupar el recurso yield hold,self,tincubadora #liberar el recurso yield release,self,factory.incubadora #eventos del proceso transporte manual #solicitar el recurso yield request,self,factory.tmanual5 #ocupar el recurso yield hold,self,ttmanual5 #liberar el recurso yield release,self,factory.tmanual5 #eventos del proceso refrigerar #solicitar el recurso yield request,self,factory.refrigerar #ocupar el recurso yield hold,self,trefrigerar #liberar el recurso yield release,self,factory.refrigerar yogurt.yogurtlisto+=1 print"\n****************************************************************" print "* El yogurt Nro ",yogurt.yogurtlisto," termino en el tiempo ",now()," *" print"****************************************************************\n" class llamada: # llamada a la libreria procesos.py d=procesoproductivo() ordegno=d.maquina("Ordegnar las vacas","Unidad",1,FIFO,False,True,Monitor) carretilla=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor)
APENDICE A
123
analisis=d.maquina("Analisis a la leche","Unidad",1,FIFO,False,True,Monitor) tmanual1=d.transporte("Transporte manual","Unidad",1,FIFO,False,True,Monitor) descremado=d.maquina("Descremadora","Unidad",1,FIFO,False,True,Monitor) mezclado=d.maquina("Mezcladora","Unidad",3,FIFO,False,True,Monitor) pasteurizado=d.maquina("Pasteurizadora","Unidad",1,FIFO,False,True,Monitor) madurado=d.maquina("Deposito Maduracion","Unidad",10,FIFO,False,True,Monitor) enfriado=d.maquina("Enfriadora","Unidad",1,FIFO,False,True,Monitor) enfriadoyogurt=d.maquina("Enfriadora","Unidad",1,FIFO,False,True,Monitor) enfriadoflact=d.maquina("Enfriadora","Unidad",1,FIFO,False,True,Monitor) batidocuaj=d.maquina("Batido cuajo a mano","Unidad",3,FIFO,False,True,Monitor) esperarcuaj=d.deposito_temporal("Esperar que cuaje","Unidad",10,FIFO,False,True,Monitor) cortadoqueso=d.maquina("Cortado de queso","Unidad",3,FIFO,False,True,Monitor) batidomanual=d.maquina("Batido a mano","Unidad",3,FIFO,False,True,Monitor) extraersuero30=d.maquina("Extraer suero 30%","Unidad",3,FIFO,False,True,Monitor) colocarsalbatido=d.maquina("Colocar sal y batir","Unidad",3,FIFO,False,True,Monitor) extraersuero40=d.maquina("Extraer suero 40%","Unidad",3,FIFO,False,True,Monitor) llenarmoldes=d.maquina("Llenar moldes","Unidad",1,FIFO,False,True,Monitor) reposar=d.deposito_temporal("Reposar","Unidad",10,FIFO,False,True,Monitor) tmanual2=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) prensar=d.deposito_temporal("Prensado","Unidad",10,FIFO,False,True,Monitor) salmuera=d.deposito_temporal("Salmuera","Unidad",2,FIFO,False,True,Monitor) tmanual3=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) maduracion=d.deposito_temporal("Maduracion","Unidad",15,FIFO,False,True,Monitor) envoltura=d.maquina("Envoltura","Unidad",1,FIFO,False,True,Monitor) enfriarcava=d.maquina("Enfriar en la cava","Unidad",3,FIFO,False,True,Monitor) lavarbatido=d.maquina("Lavar la crema y batir","Unidad",3,FIFO,False,True,Monitor) amasar=d.maquina("Amasar","Unidad",1,FIFO,False,True,Monitor) envasado=d.maquina("Envoltura","Unidad",1,FIFO,False,True,Monitor) colocarY1Y2=d.maquina("Colocar en Maquina batidora","Unidad",1,FIFO, False,True,Monitor) batidomaquina=d.maquina("Batido en maquina","Unidad",1,FIFO,False,True,Monitor) batidoyogurt=d.maquina("colocar yogurt y batir","Unidad",10,FIFO,False,True,Monitor) tmanual4=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) incubadora=d.maquina("Incubadora","Unidad",3,FIFO,False,True,Monitor) tmanual5=d.transporte("Carretilla","Unidad",1,FIFO,False,True,Monitor) refrigerar=d.maquina("Refrigerador","Unidad",3,FIFO,False,True,Monitor) ## Model def model(): initialize() for quename,arrivaltime in quesolist: que=queso(name=quename) activate(que,que.productq(factory=llamada),at=arrivaltime) for manname,arrivaltime in mantequillalist: man=mantequilla(name=manname) activate(man,man.productm(factory=llamada),at=arrivaltime) for yogname,arrivaltime in yogurtlist: yog=yogurt(name=yogname) activate(yog,yog.producty(factory=llamada),at=arrivaltime) simulate(until=simtime) ## Experiment data lleg=procesoproductivo() # solicita al usuario el numero de quesos n=int(raw_input("\n Introduzca el numero de quesos: ")) quesolist = lleg.llegada(n,"Queso",1) # solicita al usuario el numero de mantequillas n=int(raw_input("\n Introduzca el numero de mantequillas: ")) mantequillalist = lleg.llegada(n,"Mantequilla",1) # solicita al usuario el numero de yogurts n=int(raw_input("\n Introduzca el numero de yogurts: ")) yogurtlist = lleg.llegada(n,"Yogurt",1) q=procesoproductivo() tordeg=120 tcarretilla=5
APENDICE A
124
tanalisis=2 ttmanual1=1 tdescrem=q.uniforme(14,16) tmezclado=q.uniforme(14,16) tpasteurizado=q.uniforme(14,16) tmadurado=30 tenfriado=q.uniforme(18,22) tenfriadoyogurt=q.uniforme(9,11) tenfriadoflact=q.uniforme(9,11) tbatidocuaj=5 tesperarcuaj=35 tcortadoqueso=q.uniforme(9,11) tbatidomanual=10 textraersuero30=q.uniforme(4,6) tcolocarsalbatido=10 textraersuero40=q.uniforme(4,6) tllenarmoldes=q.uniforme(4,6) treposar=10 ttmanual2=1 tprensar=1440 tsalmuera=1440 ttmanual3=1 tmaduracion=43200 tenvoltura=30 tenfriarcava=2160 tlavarbatido=q.uniforme(4,6) tamasar=q.uniforme(2,3) tenvasado=q.uniforme(8,12) tcolocarY1Y2=q.uniforme(1,2) tbatidomaquina=q.uniforme(9,11) tbatidoyogurt=2 ttmanual4=1 tincubadora=240 ttmanual5=1 trefrigerar=180 simtime=1000000000 ## Experiment model() ## Analysis/output print "\n\nEl proceso completo finalizo en el tiempo %s"%now(),"Minutos" a=now() horas=a/60 dias=horas/24 print "\nEn",horas,"","horas" print "\nEn",dias,"","dias\n"