Simulación de línea de producción y servicios

132
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

Transcript of Simulación de línea de producción y servicios

Page 1: Simulación de línea de producción y servicios

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

Page 2: Simulación de línea de producción y servicios

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.

Page 3: Simulación de línea de producción y servicios

iii

Palabras Claves.

� Procesos

� Simulación

� Programación

� Simulación de procesos productivos

� Simulación por eventos discretos

� SimPy

Page 4: Simulación de línea de producción y servicios

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

Page 5: Simulación de línea de producción y servicios

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

Page 6: Simulación de línea de producción y servicios

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

Page 7: Simulación de línea de producción y servicios

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

Page 8: Simulación de línea de producción y servicios

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

Page 9: Simulación de línea de producción y servicios

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.

Page 10: Simulación de línea de producción y servicios

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

Page 11: Simulación de línea de producción y servicios

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.

Page 12: Simulación de línea de producción y servicios

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.

Page 13: Simulación de línea de producción y servicios

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

Page 14: Simulación de línea de producción y servicios

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.

Page 15: Simulación de línea de producción y servicios

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.

Page 16: Simulación de línea de producción y servicios

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

Page 17: Simulación de línea de producción y servicios

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

Page 18: Simulación de línea de producción y servicios

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.

Page 19: Simulación de línea de producción y servicios

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

Page 20: Simulación de línea de producción y servicios

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.

Page 21: Simulación de línea de producción y servicios

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

Page 22: Simulación de línea de producción y servicios

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

Page 23: Simulación de línea de producción y servicios

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

Page 24: Simulación de línea de producción y servicios

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.

Page 25: Simulación de línea de producción y servicios

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:

Page 26: Simulación de línea de producción y servicios

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.

Page 27: Simulación de línea de producción y servicios

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á

Page 28: Simulación de línea de producción y servicios

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.

Page 29: Simulación de línea de producción y servicios

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

Page 30: Simulación de línea de producción y servicios

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.

Page 31: Simulación de línea de producción y servicios

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

Page 32: Simulación de línea de producción y servicios

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.

Page 33: Simulación de línea de producción y servicios

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

Page 34: Simulación de línea de producción y servicios

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

Page 35: Simulación de línea de producción y servicios

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.

Page 36: Simulación de línea de producción y servicios

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.

Page 37: Simulación de línea de producción y servicios

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.

Page 38: Simulación de línea de producción y servicios

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).

Page 39: Simulación de línea de producción y servicios

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

Page 40: Simulación de línea de producción y servicios

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.

Page 41: Simulación de línea de producción y servicios

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.

Page 42: Simulación de línea de producción y servicios

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

Page 43: Simulación de línea de producción y servicios

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

Page 44: Simulación de línea de producción y servicios

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.

Page 45: Simulación de línea de producción y servicios

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).

Page 46: Simulación de línea de producción y servicios

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.

Page 47: Simulación de línea de producción y servicios

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.

Page 48: Simulación de línea de producción y servicios

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

Page 49: Simulación de línea de producción y servicios

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.

Page 50: Simulación de línea de producción y servicios

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.

Page 51: Simulación de línea de producción y servicios

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

Page 52: Simulación de línea de producción y servicios

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.

Page 53: Simulación de línea de producción y servicios

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

Page 54: Simulación de línea de producción y servicios

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.

Page 55: Simulación de línea de producción y servicios

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.

Page 56: Simulación de línea de producción y servicios

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.

Page 57: Simulación de línea de producción y servicios

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

Page 58: Simulación de línea de producción y servicios

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)

Page 59: Simulación de línea de producción y servicios

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

Page 60: Simulación de línea de producción y servicios

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: []

Page 61: Simulación de línea de producción y servicios

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.

Page 62: Simulación de línea de producción y servicios

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

Page 63: Simulación de línea de producción y servicios

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.

Page 64: Simulación de línea de producción y servicios

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.

Page 65: Simulación de línea de producción y servicios

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

Page 66: Simulación de línea de producción y servicios

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"

Page 67: Simulación de línea de producción y servicios

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 * ************************************************

Page 68: Simulación de línea de producción y servicios

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 * *************************************************

Page 69: Simulación de línea de producción y servicios

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

Page 70: Simulación de línea de producción y servicios

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.

Page 71: Simulación de línea de producción y servicios

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

Page 72: Simulación de línea de producción y servicios

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

Page 73: Simulación de línea de producción y servicios

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

Page 74: Simulación de línea de producción y servicios

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: []

Page 75: Simulación de línea de producción y servicios

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.

Page 76: Simulación de línea de producción y servicios

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

Page 77: Simulación de línea de producción y servicios

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.

Page 78: Simulación de línea de producción y servicios

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

Page 79: Simulación de línea de producción y servicios

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

Page 80: Simulación de línea de producción y servicios

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.

Page 81: Simulación de línea de producción y servicios

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:

Page 82: Simulación de línea de producción y servicios

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']

Page 83: Simulación de línea de producción y servicios

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

Page 84: Simulación de línea de producción y servicios

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

Page 85: Simulación de línea de producción y servicios

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

Page 86: Simulación de línea de producción y servicios

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

Page 87: Simulación de línea de producción y servicios

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.

Page 88: Simulación de línea de producción y servicios

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.

Page 89: Simulación de línea de producción y servicios

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.

Page 90: Simulación de línea de producción y servicios

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.

Page 91: Simulación de línea de producción y servicios

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

Page 92: Simulación de línea de producción y servicios

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

Page 93: Simulación de línea de producción y servicios

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

Page 94: Simulación de línea de producción y servicios

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

Page 95: Simulación de línea de producción y servicios

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

Page 96: Simulación de línea de producción y servicios

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.

Page 97: Simulación de línea de producción y servicios

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 * *************************************************** ***************

Page 98: Simulación de línea de producción y servicios

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

Page 99: Simulación de línea de producción y servicios

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á

Page 100: Simulación de línea de producción y servicios

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.

Page 101: Simulación de línea de producción y servicios

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: []

.

.

Page 102: Simulación de línea de producción y servicios

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.

Page 103: Simulación de línea de producción y servicios

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

Page 104: Simulación de línea de producción y servicios

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

Page 105: Simulación de línea de producción y servicios

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:

Page 106: Simulación de línea de producción y servicios

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.

Page 107: Simulación de línea de producción y servicios

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

Page 108: Simulación de línea de producción y servicios

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: [email protected]

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.

Page 109: Simulación de línea de producción y servicios

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,

Page 110: Simulación de línea de producción y servicios

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

Page 111: Simulación de línea de producción y servicios

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.

Page 112: Simulación de línea de producción y servicios

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.

Page 113: Simulación de línea de producción y servicios

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

Page 114: Simulación de línea de producción y servicios

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

Page 115: Simulación de línea de producción y servicios

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

Page 116: Simulación de línea de producción y servicios

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)

Page 117: Simulación de línea de producción y servicios

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 *

Page 118: Simulación de línea de producción y servicios

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

Page 119: Simulación de línea de producción y servicios

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)

Page 120: Simulación de línea de producción y servicios

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

Page 121: Simulación de línea de producción y servicios

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

Page 122: Simulación de línea de producción y servicios

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)

Page 123: Simulación de línea de producción y servicios

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"

Page 124: Simulación de línea de producción y servicios

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

Page 125: Simulación de línea de producción y servicios

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

Page 126: Simulación de línea de producción y servicios

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

Page 127: Simulación de línea de producción y servicios

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

Page 128: Simulación de línea de producción y servicios

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

Page 129: Simulación de línea de producción y servicios

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

Page 130: Simulación de línea de producción y servicios

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)

Page 131: Simulación de línea de producción y servicios

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

Page 132: Simulación de línea de producción y servicios

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"