F. Javier Otamendi
Universidad Rey Juan Carlos, Madrid,
ISBN: 978-0-9829782-4-5
Modelización y Simulación: Libro de Prácticas
con SIMIO
Jeffrey Allen Joines
Stephen Dean Roberts
North Carolina State University
F. Javier Otamendi
Universidad Rey Juan Carlos
Madrid, España
Noviembre 2010
Edición 1.1
Los autores v
F. JAVIER OTAMENDI es Profesor Titular del Departamento de Economía Aplicada I en
la Universidad Rey Juan Carlos de Madrid y Coordinador de las Titulaciones Económicas.
Obtuvo sus títulos de Ingeniería Industrial y Management (B.S y M.S) en Oklahoma State
University. Con posterioridad obtuvo el título de Licenciado en Administración y Dirección
de Empresas en la Universidad Complutense de Madrid y el título de Doctor por la
Universidad Politécnica de Cartagena por el Programa de Tecnologías Industriales. Su
principal interés estriba en la optimización de sistemas vía simulación así como la aplicación de la
simulación en las ciencias económicas y del transporte. Su carrera docente empezó en la Universidad Carlos
III de Madrid enseñando simulación y gestión de calidad, y siguió en la Universidad Complutense de Madrid
y en Saint Louis University, Madrid, enseñando estadística para las ciencias sociales. En la actualidad,
imparte clases de estadísticas en los grados y de dirección de operaciones y simulación en postgrado.
También estuvo dos años como investigador en el Centro COTEC I+D aplicando simulación en aeropuertos.
El Dr. Otamendi ha sido el Conference Chair y Proceedings Editor de European Conference in Modelling
and Simulation en 2009 (ECMS09). Es miembro del Consejo de ECMS desde 2007. Ha participado como
ponente, track chair o session chair en ECMS, SCSC y otros congresos de simulación.
Este libro es distinto a la mayoría. Para empezar, está escrito en lo que se podría llamar un estilo
participativo. El lector no se puede sentar a leerlo sin un ordenador en el que esté instalado SIMIO. Con este
libro se espera que se participe activamente mediante la utilización de SIMIO a medida que se vayan
pasando las páginas. Nosotros, los autores, intentamos mantener una conversación con usted, lector. Nuestro
convencimiento es que la simulación no es un deporte para el espectador. Tiene que trabajar a la vez para
desarrollar competencias con el SIMIO, competencias que se desarrollan a través de la práctica. Este libro le
invita a practicar y a utilizar sus conocimientos y capacidades.
En segundo lugar, el libro se enfoca en la modelización con SIMIO, dejando aparte la mayoría del análisis
estadístico y de toma de decisiones, ya que estos conceptos se deben aprender en otra parte. No es que no
pensemos que estos temas sean importantes, porque son vitales (y cuando enseñamos simulación los
incluimos como una parte fundamental del curso), pero no vamos a emplear demasiado tiempo en este
documento, porque existen libros excelentes que pueden cubrir el vacío que dejamos. Sugerimos que, si el
lector está enseñando/aprendiendo simulación, que a la vez disponga de uno de estos libros que no están
basados en un software en particular1
Por último, este libro es deliberadamente barato (tanto el libro electrónico como su versión en papel). Un
nuevo lenguaje de simulación como SIMIO va a estar cambiando constantemente. De hecho, la gente de
SIMIO intenta tener nuevas versiones (llamadas “sprints”) una vez cada tres meses. Cualquier libro que
describa las tripas de SIMIO se volverá obsoleto rápidamente, por lo que queremos que se añadan las nuevas
características en nuevas versiones a menudo. Es posible que cambiemos algo el contenido del libro a
medida que encontremos nuevos ejemplos o enfoques. Si el lector no paga mucho por el libro, es posible que
vuelva a adquirir nuevas versiones para estar al día con los nuevos contenidos.
Nuestra intención es que usted, como lector, se convierta en un alumno activo y, como sugiere el título,
trabaje a la vez que lee. Nuestra experiencia en las aulas es que el alumno aprende más al hacer los trabajos,
por lo que este “manual de trabajo” se centra en el trabajo de laboratorio, en lo que nuestros alumnos hacen
en clase. Los capítulos de este libro generalmente corresponden a una sesión de practica de laboratorio. Si el
lector no es alumno de enseñanza reglada, pero quiere aprender SIMIO por su cuenta, pensamos que este
enfoque es atractivo para la auto-enseñanza. Un capítulo se puede cubrir en una tarde.
1
Por ejemplo, Discrete-Event System Simulation (5th Edition), Jerry Banks, John Carson, Barry Nelson, David Nicol, Prentice-Hall,
2010 (622 páginas)
Para asegurar que todos los implicados participan en este proceso activo de enseñanza, normalmente
entregamos al principio de la clase una o dos páginas con preguntas que deben surgir al resolver el ejercicio.
Hemos incluido algunas de ellas a lo largo y ancho del libro. Son preguntas que tienen respuestas cortas y
que requieren que los alumnos presten atención a lo que van desarrollando. El resultado es una clase con un
alto nivel de asistencia y participación, aunque no se controle oficialmente la asistencia, porque puntuamos a
aquéllos que entregan los ejercicios al finalizar la clase. Asignaturas en la que se sigue esta metodología
docente se crean una reputación de obligada asistencia.
Bajo nuestro punto de vista, la modelización vía simulación es una forma de “ingeniería de sistemas”,
entendidos sistemas como procesos productivos o logísticos, incluso administrativos. Nuestra intención es
hacer ingeniería o re-ingeniería de un proceso o sistema, pero, al ser complejo, dificultoso o incluso
imposible experimentar con tal sistema, necesitamos desarrollar un modelo en un ordenador a imagen y
semejanza del real o del futuro sistema, y experimentar con ese modelo (de forma similar a lo que hacen con
un túnel de viento los diseñadores de nuevos aviones). La actividad crítica es el “desarrollo del modelo” – lo
que se llama “modelización mediante simulación”, o “simulación” simplemente. Este tipo de modelización
no es una ciencia exacta, pero se basa en un enfoque de resolución de problemas. Para desarrollar un modelo
se necesita: (1) un conjunto robusto de conceptos sobre modelización (y el lenguaje en que se realiza la
simulación), y (2) una implantación en un ordenador. Luego para ser un buen “simulador”, es necesario que
adquieras conocimientos sobre los conceptos de modelización y experiencia en su uso.
SIMIO proporciona un amplio abanico de conceptos y posibilidades sobre modelización vía simulación así
como capacidades atractivas tanto visuales como tabulares para presentar resultados numéricos. Sin
embargo, cualquiera que haya tenido experiencia en simulación sabe que los lenguajes y las herramientas
tienen limitaciones y alguna vez no han podido desarrollar el modelo como les hubiera gustado. En lugar de
utilizar el enfoque de “unidad/objeto, atributo y recurso”, SIMIO se basa en un paradigma con orientación a
objetos más general, en el que los objetos ejecutan “procesos u órdenes”. Así, además de disponer de los
objetos y procesos incluidos en una librería estándar, el usuario puede añadir más, quitar los actuales o
cambiarlos para satisfacer sus necesidades particulares.
Por lo que aprender a utilizar SIMIO requerirá de un cambio de mentalidad. Tendrá el usuario que apartar los
enfoques que hayan utilizado con otros lenguajes y empezar a adoptar otra visión a la hora de atacar el
proceso de desarrollo del modelo. Pensamos que si se trabaja este libro con cariño y atención, se aprenderá
lo suficiente sobre el enfoque que sigue SIMIO como para poder subir un nivel y convertirlo en su propio
enfoque sobre simulación.
Este libro está organizado de forma conceptual para hacer modelos rápidamente. En los primeros cinco
capítulos, nos concentramos en el uso de la Librería de Objetos Estándar, “Standard Library Objects”, de
SIMIO. Se puede realizar mucha modelización sin necesidad de recurrir a conceptos u objetos más
complejos. Los siguientes siete capítulos explican cómo ampliar los objetos estándar utilizando procesos,
viii Modelización y Simulación: Libro de Prácticas con SIMIO
“processes”. Este aprendizaje dota de mayor flexibilidad a la modelización sin necesidad de inventar una
nueva librería de objetos. Los últimos capítulos se utilizan para discutir la creación de nuevos objetos y la
modificación de los ya existentes en SIMIO, de forma que se demuestre todo el poder de este enfoque
orientado a objetos.
El libro está diseñado para que sea lea capítulo a capítulo, aunque sea posible elegir ciertos conceptos y
temas. En los primeros capítulos, construimos modelos de forma directa sin mucha explicación de cómo se
seleccionan ciertas características. En los últimos capítulos, por el contrario, se argumentan las elecciones de
las distintas opciones así como otras posibles vías de modelización. Otros capítulos al final del libro
profundizan también en ciertos temas vistos con anterioridad, puesto que es sabido que la redundancia en el
aprendizaje ayuda a fortalecer los conceptos. Para cuando se acabe con el libro, se debe por tanto estar bien
preparado para construir modelos en SIMIO y entender las bondades de los distintos enfoques que se pueden
utilizar.
Al final de la mayoría de los capítulos, se incluyen comentarios sobre los temas tratados. Se enfatizarán las
fortalezas y debilidades del enfoque de modelización y el lenguaje utilizado (no tenemos intereses
financieros en SIMIO). Los diseñadores de SIMIO fueron también los diseñadores de Arena, por lo que se
encontrarán trazas y reminiscencias de Arena en SIMIO. Ya que alguno de los lectores migrará desde Arena,
proporcionaremos información sobre estas trazas. Sin embargo, prepárense para ir mucho más allá de lo
aprendido con otros lenguajes de simulación.
Cuando se compara Arena y SIMIO, no se encontrarán en SIMIO rutinas de análisis para datos de entrada o
de salida. SIMIO probablemente nunca tendrá la capacidad de analizar los datos de entrada, ya que hay
muchos disponibles2. Cuando se usa un modelizador de datos de entrada, es necesario establecer de forma
correcta una relación entre los parámetros estimados por el modelizador y los parámetros necesarios en
SIMIO. El analista de resultados, “Output Analyzer”, y el analista de procesos, “Process Analyzer”, han sido
incorporados a SIMIO, con la posibilidad de escribir información en ficheros externos para su posterior
análisis. SIMIO está mejorando la presentación de resultados casi de forma diaria. También ha incorporado
recientemente rutinas sobre selección y ranking de subconjuntos de alternativas, así como posibilidades de
optimización.
En un sentido muy limitado, SIMIO es como Arena con las capacidades de Siman para analizar procesos.
Sin embargo, esta visión no hace justicia a la mayor flexibilidad y las enormes posibilidades ofrecidas por
SIMIO. Además, SIMIO presenta la posibilidad de representar a escala el modelo en 3D, y posee una
orientación a objetos que permite añadir y modificar objetos de forma sencilla. SIMIO dispone de una
apariencia y una disposición más modernas y, en nuestra opinión, unas posibilidades mayores que las de la
mayoría de los otros lenguajes de simulación.
Ciertos estilos se utilizan en este libro para ilustrar objetos, nombres y parámetros y para diferenciarlos
claramente. Los objetos estándar de SIMIO se escriben en Versales y una fuente Courier New (SERVER)
mientras que los creados por el usuario también irán en negrita (DELAYOBJECT). Las propiedades asociadas
con estos objetos se incluyen en cursiva (Processing Time). Los nombres de los procesos irán en cursiva y
entre-comillados, como “OnEnteredProcessing”, mientras que los disparadores de proceso, “triggers”
(Exited) sólo irán en cursiva al ser propiedades. Etapas en los procesos, como Assign se presentan en
cursiva y en Courier New. SIMIO utiliza también muchas expresiones, que se indican en Courier New (
SrvOffice.Contents >0). Los nombres de los objetos que han sido definidos por el usuario irán en
negrita (incluir un servidor, SERVER, de nombre SrvOffice). Los valores asociados con las propiedades se
incluirán de la misma forma que las expresiones o entre comillas para cadenas de texto (“True”).
2
Por ejemplo, véase EasyFit en http://www.mathwave.com/
Queremos dar las gracias a nuestros alumnos, que han ayudado mucho a nuestra comprensión del proceso de
aprendizaje y que a menudo nos hacen que demostremos nuestra ignorancia o nuestra falta de preparación.
Apreciamos también la respuesta amable de la gente de SIMIO a nuestra inacabable batería de preguntas y
dudas, en especial a Dave Sturrock y a Dennis Pegden. Finalmente, queremos dar las gracias a nuestras
familias por su comprensión y paciencia porque a menudo pasamos más tiempo hablando entre nosotros que
con ellos.
Por favor, hágannos saber cómo mejorar este “workbook” y cómo podemos satisfacer mejor sus necesidades.
La simulación es divertida. Se pueden crear modelos que sean atractivos visualmente y SIMIO eleva el
disfrute a niveles insospechados con su capacidad de presentación en 3 dimensiones (3D). Lo que significa
que no sólo el lector puede ver cómo se comporta el modelo, sino también los que trabajan con él,
aumentando la credibilidad del proceso.
Asumimos que ha instalado SIMIO en su ordenador y que está listo para empezar.
Paso 1: Abra SIMIO o bien a través del menú Inicio en Windows o bien haciendo clic en un icono de
SIMIO, “ ”, que quizás haya incluido en la barra de herramientas de Windows o en el Escritorio.
Barra de
Parece MS SIMIO
Office
Crear un
nuevo modelo
Información
General de SIMIO
Modelos
Elementales
Versión
Modelos
Completos
Undo/Redo
MySimioProject
Unidades
Pestaña de
Ejecución Objetos in
Pestaña MySimioProject
Abrir/Cerrar
Panel de
[Librería Navegación
Tapiz de
Estándar] Diseño
Inspector de
Propiedades
[Librería de
Proyecto]
Paso 3: Haga clic con el botón derecho del ratón en MODELENTITY y MODEL en el Panel de Navegación,
Navigation Panel, y seleccione las propiedades o características del modelo, Model Properties.
3
Las versiones “Sprint” de SIMIO salen aproximadamente una vez cada tres meses, por lo que el software irá cambiando
rápidamente. Asegúrese de conseguir las actualizaciones con nuevas características y con correcciones de posibles errores.
2 Modelización y Simulación: Libro de Prácticas con SIMIO
Pregunta 2: ¿Cuál es el tipo de objeto de MODEL?
Paso 4: Tenga en cuenta siempre los botones Undo/Redo. Se pueden utilizar para corregir errores y recuperar
componentes del modelo previamente utilizados. Cuando una acción no pueda ser revertida, SIMIO
lanzará una advertencia.
Paso 5: Las unidades (“Units”) son una forma conveniente de especificar las unidades por defecto de tiempo,
distancia o longitud y de flujo.
Una pequeña tienda de helados vende cucuruchos de helado. Los clientes llegan y esperan en cola hasta ser
atendidos por uno de los dos dependientes. Estos dependientes reciben y preparan el pedido y se lo entregan
al cliente, quien se dirige al cajero para pagar. Después de pagar, los clientes se van de la tienda. Mientras se
prepara la simulación, suele ser conveniente realizar un diagrama de proceso o flujograma. La Figura 1.3
muestra los cuatro procesos en que se divide la compra y el pago del helado.
Que los clientes llegan a la tienda según un modelo de probabilidad exponencial, con un tiempo
medio entre llegadas de 0.5 minutos.
Que el tiempo que tarda el dependiente en interactuar con el cliente y entregarle el cucurucho de
helado se puede representar mediante un modelo de probabilidad triangular, con un mínimo 0.4
minutos, una moda o valor más habitual de 0.9 minutos, y un máximo de 1.5 minutos.
Que el tiempo que emplea el cajero en cobrar sigue también una distribución triangular con un
mínimo de 0.3, una moda de 0.4 minutos, y un máximo de 0.6 minutos.
Que el tiempo de desplazamiento entre cada proceso es de 15 segundos.
Si ambos dependientes están ocupados, los clientes esperarán en una única cola según lleguen, siguiendo lo
que se denomina una prioridad FCFS (first-come, first-served; o FIFO; al primero que entra, primero se le
atiende). También hay cola única delante del cajero. Asumiremos también que no hay problemas de espacio.
Paso 1: Debería estar bastante claro que los clientes deberían ser modelizados con un MODELENTITY mientras
que el MODEL representará el flujograma presentado en la Figura 1.3.
Paso 2: Añada objetos en el modelo haciendo un clic sobre el objeto que se desee en la [Standard Library].
Arrastre el objeto sobre el tapiz de diseño y vuelva a hacer clic para colocarlos en posición (también
puede hacer clic y arrastrar los objetos para recolocarlos o borrarlos del modelo). Cuando haga clic en un
objeto, sus propiedades aparecen en el inspector de propiedades, property inspector (que suele estar
colocado en el panel inferior derecho) - véase Figura 1.4.
Objeto Fuente
(Source)
Propiedades
Seleccionado
de la Fuente
Servidor
Nombre
del Objeto
Camino con
Tiempo de
Desplazamiento
Pregunta 3: Un objeto servidor, SERVER, tiene tres líneas (“lines”) que lo rodean. ¿Cómo se llaman?
Pregunta 4: Un objeto SERVER tiene un nodo “input” y otro “output”. Estos nodos son también objetos
de la [Standard Library]. ¿Cuál es el nombre en la librería estándar del nodo de entrada?
4
Haga doble click encima del objeto para cambiar el nombre directamente.
4 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 4: Haga clic en cada objeto y rellene sus propiedades según las hipótesis y los datos de partida. La
Figura 1.5 muestra las propiedades asociadas con el objeto fuente, SOURCE.
Nombre de la Entidad
Propiedades
Objeto Fuente Llegadas en función
de Tiempo entre
Llegadas
Unidades de
Tiempo Editor de
Expresiones
Revela
Detalles
Descripción de
la Propiedad
Object.SubObject.SubObject(parámetros)
Para activar el editor de expresiones, empiece por especificar un carácter. Selecciona el objeto, su(s)
subobjeto(s), y su(s) propiedades. Los editores de expresiones tienen la facilidad de “auto-completar”, lo que
significa que se completará el nombre a partir de los primeros caracteres. También indica si existen
subobjetos disponibles para este objeto en particular.
Paso 6: Antes de ejecutar el modelo, vamos a cambiar el momento de tiempo en el que acabará la simulación
en el configurador Run Setup, en la pestaña Ejecutar (“Run”), como muestra la Figura 1.6.
Determinando
el final
Paso 7: Ahora, simulemos durante un rato – haga clic en el botón para empezar la simulación.
Paso 8: Vea cómo se mueven las entidades, MODELENTITIES ( ), por los caminos, TIMEPATHS. Las
entidades se acumulan en el lugar denominado contenidos de la fila de entrada,
INPUTBUFFER.CONTENTS, y se procesan en la fila PROCESSING.CONTENTS, ambos mostrados como
“líneas” que rodean los objetos servidor. Puede mover los objetos mientras el modelo está en ejecución.
Pregunta 7: Mantenga apretado el botón izquierdo del ratón, y muévalo a derecha y a izquierda, arriba y
abajo. ¿Qué sucede?
Pregunta 8: Mantenga apretado el botón derecho del ratón, y muévalo a derecha y a izquierda, arriba y
abajo. ¿Qué sucede?
Paso 10: Cambie entre las vistas 2-D y 3-D usando las teclas “2” y “3”
Pregunta 9: ¿Qué sucede en 2-D cuando se mantiene apretado el botón izquierdo del ratón, y éste se
mueve a derecha y a izquierda, arriba y abajo?
Pregunta 10: ¿Qué sucede en 2-D cuando se mantiene apretado el botón derecho del ratón, y éste se
mueve a derecha y a izquierda, arriba y abajo?
Paso 11: Experimente en 2-D y 3-D mientras mueve las estaciones y cambia el “layout” del modelo.
Cambie el tiempo de desplazamiento del puesto Pedir a 50 segundos para percibir otro tipo de cambio.
La animación, Animation, es a menudo lo que interesa a la gente acerca de un modelo. Un modelo de SIMIO
en 3-D, aunque pueda requerir algo de trabajo adicional, puede motivar cierta atención extra. En esta
sección, le daremos instrucciones para crear una animación que se asemeje a lo que se muestra en la Figura
1.7.
Paso 2: Seleccione el objeto Pedir y elija una mesa, “table”, como figura. Repita el procedimiento para el
objeto Pagar. Ajuste el tamaño de los objetos SERVER para que correspondan con el tamaño de una
persona.
Paso 3: Ahora, añadamos gente de pie detrás de las mesas. Para hacerlo, cambie a 3-D y seleccione la
pestaña para dibujar, “Drawing”. Haga clic en el botón “Place Symbol” y seleccione una persona que
represente al dependiente. Cuando la persona ha sido posicionada, puede hacer clic en una de las
esquinas y presionar la tecla Ctrl para rotar el dibujo. Sitúe a la persona detrás de la mesa. Duplique al
dependiente utilizando la secuencia Ctrl-V y Ctrl-P. Haga lo mismo para el objeto Pagar.
Paso 4: Mueva los símbolos por el tapiz para conseguir una mejor visualización de la tienda de helados.
Puede ahora añadir paredes utilizando la herramienta “Polyline” del Drawing panel. Asegúrese de incluir
la altura del objeto en la sección “Object”. Debe darse cuenta de que las medidas de distancia están
especificadas en metros salvo que lo especifique en Unidades. Puede que tenga que modificar la altura
de los objetos para que sean consistentes.
Paso 5: En una animación anterior, el camino entre Pagar y Salida debería también incluir un “path
decorator”. Los decoradores de caminos se pueden invocar seleccionando el camino y seleccionando
“Decorator”. Para visualizar mejor a la gente en este camino, el tiempo de desplazamiento a 300
segundos.
Paso 1: Primero, miremos los resultados del modelo básico, mostrados en la Figura 1.8. Quizá podamos
denominar a este modelo “sistema actual” (“present system”). En la pestaña de ejecución, “Run”, cambie
la duración de la simulación a 8 horas. Los resultados de las simulación se pueden ver en la pestaña de
resultados, “Results”.
Pestaña de
Resultados
Atributos Filtro
Variable
Reordenar
Resultados
Paso 3: Cada atributo va acompañado de dos símbolos – uno para re-ordenar la columna y otro para filtrar o
seleccionar lo que se muestra en cada columna.
Pregunta 12: Filtre la estadísticas para mostrar sólo las medias para MODELENTITY. ¿Cuál es el número
medio en el sistema, Number in System, y el tiempo medio de permanencia en el sistema, Time in
System?
Paso 5: Haciendo clic con el botón derecho en “Results Field”, puede mostrar “show field list.” Así puede
añadir otros campos de cálculo a las columnas.
Paso 6: Las categorías, “Categories”, para las que se pueden obtener estadísticas son: Contenido, Content,
Producción total, Throughput, Capacidad, Capacity, Tiempo de flujo, FlowTime, Estado en el que se
encuentra un recurso, ResourceState y Tiempo de espera, HoldingTime. Estos resultados se aplican a
cada fuente de datos.
Paso 8: Advierta que el tiempo de espera se muestra como “HoldingTime” del “InputBuffer” mientras que
“Content” de InputBuffer muestra el número en espera.5
Pregunta 15: ¿Cuál es el tiempo medio de espera (holding time) en el InputBuffer de Pedir?
Pregunta 16: ¿Por qué el número medio de Content de Pedir es igual a la media de unidades
programadas, UnitsAllocated, con anterioridad?
Paso 9: Para volver al modelo, necesita seleccionar la pestaña “Facility”, que está a la misma altura que la
pestaña “Results”.
5
La terminología de SIMIO de “HoldingTime” y “Content” puede parecer que no sea estándar. Generalmente, la Teoría de Colas o
de Líneas de Espera utiliza los términos “waiting time” y “number in queue”. También “waiting line length” o “number waiting” son
términos que se utilizan en vez de “number in queue.”
Si usted está familiarizado con el diseño orientado a objetos, Object Oriented Design (OOD), la librería de
SIMIO, [Standard Library], debería ser denominada más apropiadamente como una librería de clase, “class”
library. Son las clases de las que se crean objetos. La acción de seleccionar y mover al tapiz estos objetos es
lo que permite crear una instancia del objeto. Las propiedades, tal como se muestran en el inspector de
propiedades, son las características básicas de los objetos. Más adelante, verá cómo añadir propiedades. Las
propiedades se pueden inicializar pero no cambiar. Otro tipo de atributo, al que SIMIO denomina variable de
estado, STATE variable, puede ser incluida en el modelo si los atributos han de ser modificados durante la
simulación.
Los pasajeros llegan de acuerdo a un modelo exponencial con una media de un minuto entre llegadas. Se
dirigen andando hacia el mostrador de facturación a un ritmo de entre 2 y 4 millas por hora (según un
modelo uniforme).
Los pasajeros cubren una distancia de 50 yardas desde la entrada al edificio hasta el check-in. Después de la
facturación, han de recorrer 65 yardas hasta el control de seguridad.
Existen en la actualidad 4 mostradores con sus respectivos operarios, que tardan entre 2 y 5 minutos por
pasajero, siguiendo una distribución uniforme. Los pasajeros esperan en una fila común a todos los puestos
según su orden de llegada.
Paso 1: Cree un nuevo modelo, como el que se muestra en la Figura 2.1. Haga clic con el botón derecho en
objetos en el panel [Navigation] y vea sus propiedades. Llame al proyecto, PROJECT, “Aeropuerto”.
Incluya el valor “Pasajeros” en la propiedad Model Name. Llame al modelo, MODEL, “Aeropuerto”.
Añada una fuente o llegada, SOURCE, un servidor, SERVER, y un sumidero o salida, SINK, de a librería
estándar al tapiz Facility, y conéctelos utilizando un camino, PATH (todo esto puede ser realizado
utilizando el Add-In desde “Project Home”).
Paso 2: Haga clic y arrastre dentro del tapiz una entidad de MODELENTITY desde el panel [Project Library].
Cambie los nombres de los objetos para identificar el puesto o la operación que representan. Cambie
también el nombre de DefaultEntity a Pasajero. Cambie su símbolo a una persona utilizando la librería
de objetos y personas.
Paso 4: Para los caminos, cambie la propiedad Drawn to Scale , dibujar a escala, a “FALSE” e incluya las
distancias correctas en ambos objetos. Recuerde que el camino desde la entrada a check-in es de 50
yardas mientras que el camino entre check-in y seguridad es de 65 yardas.
Paso 1: Aunque ya podríamos ver la simulación, cambiemos el símbolo del CheckIn. Se puede hacer tanto
haciendo clic en el objeto y cambiando el símbolo a alguno de los predeterminados de SIMIO, o
descargando nuevos símbolos desde Google’s 3D Warehouse. O si ya dispone de modelos en su
ordenador, importando dibujos desde ellos.
Paso 2: Para utilizar nuevos símbolos, seleccione el objeto CheckIn y elija alguna de las opciones de Project
Symbols. “Google’s 3D Warehouse” debería aparecer cuando selecciona el botón “Download Symbol”,
que le permitirá buscar el modelo que quiera. Cuando lo haya encontrado, haga clic en “Download
Model” y SIMIO los importará en una ventana en la que se pueden cambiar sus propiedades, como el
tamaño y la orientación. Pruebe a buscar “Airport Baggage”.
Paso 3: Cuando haya descargado de Google, aparece la ventana “Import”. Puede ver el símbolo descargado
en 2D o 3D. El símbolo tiene su longitud, anchura y altura en metros, variables que pueden ser
modificadas. También se muestra una ayuda, “hint”, sobre la altura, en relación a la de una persona.
Finalmente, se puede rotar el objeto de forma que tenga la orientación6 adecuada.
Paso 4: Posicione el CheckIn de forma que el input BASICNODE, la fila InputBuffer, y la fila de Processing
se asemejen a un aeropuerto, siguiendo la Figura 2.2.
Paso 5: Ejecute el modelo y ajuste la animación (en 2D y 3D). Modifique la fila Processing de CheckIn de
forma que sólo 4 personas puedan estar en proceso a la vez (recuerde que la capacidad es cuatro).
6
Utilice la ventana “hint”, que se abre al presionar la tecla “h” del teclado: ayuda a rotar, dimensionar y mover objetos en SIMIO.
12 Modelización y Simulación: Libro de Prácticas con SIMIO
Processing (para Símbolo
4 puestos) Descargado
Input
Input Buffer
Queue
Los resultados de una simulación son variables aleatorias producidas por las entidades que fluyen por el
modelo y son procesadas. Su llegada es aleatoria lo mismo que los tiempos de proceso. Así, una repetición o
ejecución del modelo resulta en un único valor experimental. Este valor no es preciso, por lo que
necesitamos hacer muchas repeticiones para mejorar la precisión.
Paso 1: Cambie la duración de una repetición a 24 horas y ejecute la simulación. Cuando finalice, haga clic
en “Results” y accede a la pantalla de resultados.
Pregunta 3: ¿Piensa que son buenos resultados? ¿Por qué sí o por qué no?
Paso 2: Para ganar en confianza en nuestros resultados, el modelo ha de ser simulado varias veces. En la
pestaña “Project Home” se puede añadir un experimento que facilite la ejecución múltiple de un modelo.
En la pestaña “Design”, cambie el número de repeticiones a 10 y realice el experimento. Debe tardar
poco y el final de cada repetición debe ir apareciendo en la ventana de comentarios en la parte de debajo
de la pantalla. Las repeticiones no tienen que ser realizadas en un orden secuencial, pues dependerá de
las características del ordenador.
Paso 3: Puede ver los resultados en la tabla “Pivot Grid” o en la pestaña “Reports”. Los campos incluidos
ahora son el mínimo “Minimum”, el máximo “Maximum”, y el error “Half-width”. El error es la mitad
de la anchura de un intervalo de confianza del 95%. El nivel de confianza, “Confidence Level”, puede
ser modificado en las propiedades del experimento, Experiment Properties.
Pregunta 4: ¿Cuáles fueron los resultados para el número de pasajeros en el sistema de facturación, en
términos medios, mínimos y máximos, y de error?
Paso 4: Se puede añadir la desviación típica o estándar de la media haciendo clic con el botón derecho sobre
Filter Fields, y seleccionando la opción Std. Dev de “Show Field List”.
Pregunta 5: ¿Qué valor ha obtenido para la desviación típica del número de pasajeros en el sistema?
Suponga ahora que queremos analizar el efecto de los cambios en la capacidad o número de operarios en los
mostradores de facturación o check-in. Podríamos simplemente cambiar la capacidad y volver a ejecutar la
simulación para obtener nuevos resultados. Una forma mejor es montar un experimento de SIMIO,
“experiments”.
Paso 1: En el panel Facility, seleccione el objeto CheckIn. Haga clic con el botón derecho en la propiedad
capacidad inicial, Initial Capacity, y seleccione “Set Referenced Property”. Cree una nueva propiedad,
“Create New Referenced Property”, y denomínela CheckInCapacity.
Paso 2: En la pestaña “Project Home”, cree un nuevo experimento, “New Experiment”, y vea la pestaña de
diseño, “Design”. Se muestra nuestra nueva propiedad de referencia en una nueva columna.
Paso 3: Añada nuevos escenarios, nuevas filas en la tabla, y cambie los valores de la nueva variable
CheckInCapacity a 2, 3 y 4. Puede añadir filas haciendo clic en el símbolo asterisco “*” de la primera
columna. La tabla del experimento debe asemejarse a la mostrada en la Figura 2.3.
Propiedad de
Referencia
Paso 5: Advierta que la tabla de resultados, Pivot Grid, incluye ahora columnas para cada escenario.
Paso 6: La pestaña de resultados, “Reports”, es una buena forma de comparar escenarios, pues estos se
ordenan bajo cualquier variable.
Pregunta 7: ¿Cuál es el valor medio y el error para el tiempo medio de permanencia en el sistema? ¿Por
escenario?
Paso 7: Suele ayudar y es aconsejable añadir variables de salida o respuesta, “responses”, en el experimento.
Simplemente, haga clic en “Add Response” en la pestaña “Design”. Añada las siguientes dos respuestas
con las siguientes expresiones:
Paso 8: Haga reset y empiece otra vez la simulación mirando a los resultados en los gráficos de respuesta
(“Response Chart” results) a la vez que la tabla de resultados (véase Figura 2.4). Para organizar las
Respuestas
Gráficos de
Máximo respuesta
Media
Percentil del
25% Mediana
Paso 10: Puede modificar la gráfica utilizando las opciones proporcionadas por el “Response Chart”.
La gráfica muestra por defecto el máximo valor observado de la variable, el percentil del 75% o cuartil
3, la mediana o el percentil del 50%, el percentil del 25% o cuartil 1 y el mínimo (véase Figura 2.4). La
sombra proporciona además el intervalo de confianza de la media, con el nivel de confianza especificado
en el experimento.
Paso 1: Borre el objeto EXPERIMENT del modelo del aeropuerto desarrollado en el capítulo anterior.
Mejoraremos el modelo para incluir la elección de tres posibles rutas a seguir por los pasajeros que
llegan al aeropuerto. Los pasajeros que necesitan facturar y coger sus billetes pueden tanto facturar en la
acera exterior del terminal o en los mostradores principales dentro del aeropuerto, mientras que el resto
que no ha de facturar puede ir directamente hacia el control de seguridad (véase Figura 3.1).
Ruta1
Ruta2
Ruta3
Ruta2: Los pasajeros que han realizado la facturación online y no necesitan pasar por el mostrador,
sólo necesitan recorrer las 125 yardas hasta el control de seguridad.
Ruta3: El resto de pasajeros, que van a utilizar los mostradores dentro del edificio, necesitan recorrer
50 yardas hasta alcanzar uno de los dos mostradores que existen. Los operarios emplean por pasajero
entre 3 y 10 minutos, según un modelo uniforme. Para llegar al control de seguridad, han de recorrer
65 yardas más.
Paso 2: Se ha observado la distribución de probabilidades por ruta de los pasajeros (Tabla 3.1).
Paso 3: Para modelizar la decisión de un pasajero sobre su posible ruta, se ha de utilizar la propiedad
Selection Weight , de los objetos camino, PATH. La probabilidad de elegir una ruta en particular es el
peso otorgado a esa ruta dividido por la suma de los pesos otorgados a cada una de las rutas alternativas.
Incluya ahora los pesos a cada ruta (véase Figura 3.2).
Peso según
Probabilidad
Reglas de
Conexión
Pregunta 1: ¿Cuál es el número medio de pasajeros esperando tanto en la acera como en los
mostradores?
Caminos con Desvíos, Tablas de Ritmos y Dependencias entre Entidades: Aeropuerto bis 17
Pregunta 3: ¿Cuál es el tiempo medio de espera en el sistema de facturación?
Los pasajeros no suelen llegar con un ritmo constante a lo largo de todo el día a un aeropuerto (incluso si
llegan de forma aleatoria), por lo que debemos ampliar nuestro modelo para manejar esa situación. Nuestro
nuevo enfoque es permitir variaciones en los ritmos de llegada a lo largo del día. Para modelizar estos
cambios de ritmo, utilizaremos un objeto en SIMIO que se denomina tabla de ritmos, RATE TABLE. Esta
tabla se ha de referenciar cuando se determine la lógica de llegadas de un objeto fuente, o SOURCE. Es
importante comprender que los tiempos entre llegadas consecutivas para estos ritmos asumirán que
provienen, como es habitual, de una distribución exponencial. La media de esta distribución es lo que cambia
durante el día. Si estos tiempos son uniformes, es conocido que el número de llegadas sigue una distribución
Poisson. Como el parámetro (su media) cambia con el tiempo, se denomina formalmente como un proceso
de llegadas “Poisson no-homogéneo”, o NHPP (Non-Homogeneous Poisson Process). De esta forma, cuando
se utiliza una tabla de ritmos de SIMIO, se asuma que el proceso de llegadas es NHPP.
Paso 1: Para crear un patrón de llegadas, RATE TABLE, seleccione los datos en la pestaña “Data” y luego
haga clic en Create→Rate Table, asignando el nombre PassengerArrivalRate. La Tabla 3.2 muestra el
flujo por hora a lo largo de las 24 horas del día. Se muestra que llegan más pasajeros por la mañana entre
las 6 y las 9 y por la tarde entre las 18 y las 20 horas. Un ritmo de 0 implica que no llegan clientes
durante esa hora.
Modifique las
llegadas
Pregunta 4: ¿Cuál es el tiempo medio de espera en cada uno de los tipos de mostrador?
En un aeropuerto aparecen distintos tipos de pasajero. Algunos son viajeros nacionales mientras que otros
son viajeros internacionales. Algunos pasajeros son minusválidos y requieren atención especial. Los
diferentes tipos de pasajeros implican distintos tipos de proceso. Para modelizar estos tres casos, se usan
tablas de datos, Data Tables.
Paso 1: Para crear una tabla de datos, DATA TABLE, haga clic en “Tables” en la pestaña “Data”, y luego en
“Add Data Table.” Llámela PassengerTable. En nuestra tabla de datos, se ha de mostrar el tiempo de
procesos para cada uno de los tres tipos de pasajero en cada mostrador de facturación. Seleccione las
propiedades en la opción “Standard Property” en la sección Properties. La propiedad PassengerPriority
será de tipo entero, Integer, mientras que los tiempos de facturación serán propiedades tipo Expression7.
Las prioridades 1, 2, y 3 representan los pasajeros nacionales, internacionales y minusválidos (Figura
3.5).
Propiedades
7
Si primero especifica el nombre “General”, se convertirá en el valor por defecto de la propiedad “DisplayName”.
Caminos con Desvíos, Tablas de Ritmos y Dependencias entre Entidades: Aeropuerto bis 19
Aunque los tiempos de facturación estén en minutos, no tenemos que especificar sus unidades, “Unit
Type” (véase Figura 3.68).
Dejar sin
Especificar las
Unidades de
Tiempo
Distribución
Prioridad Discreta donde
Inicial cada tipo de
pasajero es
igualmente
posible (un
tercio)
8
Puede parecer obvio que las unidades de las propiedades de tiempo se deben especificar; sin embargo, si las unidades de tiemp o no
están en horas (véase Paso 3), SIMIO no hará la interpretación apropiada. Por eso es mejor dejar las unidades sin especificar y no se
intentarán convertir los datos hasta que se usen.
20 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 4: Necesitamos ahora especificar el tiempo de proceso de los distintos mostradores de facturación para
que dependa del tipo de pasajero. Para ello se trabaja con la variable de estado Priority:
En CurbSideCheckin:
PasajeroTabla[Pasajeros.Priority].CurbSideCheckInTime
En CheckIn:
PasajeroTabla[Pasajeros.Priority].InsideCheckInTime
Perciba que lo que va entre corchetes [] se usa para designar la fila específica dentro de la tabla, de
forma similar a las matrices en los lenguajes de programación. Desafortunadamente, el editor de
expresiones no conoce las propiedades de la tabla de datos, DATA TABLE, por lo que se debe teclear la
propiedad dentro de la expresión. También, asegúrese de que las unidades del tiempo de proceso son
minutos.
Paso 5: Ejecute el modelo. Acuérdese de que no llega nadie hasta las 5am, por lo que no hay animación
hasta ese momento.
Pregunta 7: ¿Cuál es el tiempo medio de espera por tipo de facturación (Curbside y Inside)? 9
Hay veces que las filas en los mostradores tradicionales de dentro del edificio parecen saturadas. Decidimos
añadir un segundo mostrador dentro del terminal para atender a los pasajeros durante los períodos pico.
Esencialmente, los pasajeros se dirigirán a aquella fila que tenga menos gente. La distancia desde este
segundo grupo de mostradores al control de seguridad es de 75 yardas.
Paso 1: Añada el segundo mostrador. Llámelo CheckIn2. Asuma que tiene una capacidad de 1 y un tiempo
de proceso igual a los de los otros mostradores. Añada un camino adicional de 75 yardas hasta el control
de seguridad, Security.
Paso 2: Hay que modelizar la decisión que toman los pasajeros que facturan en el interior del terminal de
forma que se dirijan a la fila con menos gente. Hay varias formas para modificar el modelo. Quizá la
forma más obvia sea añadir un TRANSFERNODE que manda pasajeros a la cola más corta. La distancia
desde LLEGADA a este TRANSFERNODE es de 50 yardas (recuerde que el peso es 70 para este camino y que
tendrá que borrar el camino original hacia el objeto CheckIn).
En el TRANSFERNODE se debe especificar la regla Outbound Link Rule como “By Link Weight”
Marque las propiedades de pesos, Selection Weights, de los dos caminos que salen del
TRANSFERNODE (el “valor” de una expresión verdadera, “true”, es 1 y 0 si es falsa, “false”)
9
Los resultados del modelo no se separan automáticamente por tipo de pasajero. Hay que utilizar conceptos (por ejemplo, añadir tus
propias variables de resultados) que se describen en el Capítulo 5 y en el Capítulo 6.
Caminos con Desvíos, Tablas de Ritmos y Dependencias entre Entidades: Aeropuerto bis 21
(2) Hacia CheckIn2:
CheckIn2.InputBuffer. Contents.NumberWaiting <
CheckIn.InputBuffer.Contents.NumberWaiting
Pregunta 9: ¿Cuál de los dos mostradores es el elegido cuando existen empates porque las filas
InputBuffer tienen el mismo número de pasajeros (por ejemplo, si las dos están vacías)?
Pregunta 10: ¿Cuál es la utilización de CheckIn2? ¿Tiene sentido tener los dos mostradores?
Supongamos que deseamos tener abierto el segundo mostrador sólo entre las 10am y las 6pm. Esta
problemática requiere la utilización de horarios de trabajo, que serán especificados con el componente
“Schedules” de la pestaña “Data”.
Paso 1: Haga clic en el botón “Add Schedule” en el icono “Schedules” de la pestaña “Data”. Denomine este
horario como SecondCheckInStation. Cambie el patrón de días de trabajo, Days in Work Pattern, a 1 –
este horario se repetirá todos los días.
Paso 2: En la pestaña de ciclo de trabajo, “Work Cycle”, haga clic con el botón derecho en la ventana para
que aparezca el editor de ciclos, “Edit Cycle Item”. Incluya un valor de 1 en la variable que especifica
que este recurso sí trabaja durante un período reducido, On Shift Value, y que empieza su jornada a las
10am y la acaba a las 6pm.
Paso 3: En la tapiz Facility, haga clic en el objeto CheckIn2. Cambie el tipo de capacidad de trabajo,
Capacity Type a WorkSchedule y el horario Work Schedule a SecondCheckInStation (Figura 3.8).
Horario de
Trabajo
Input@CheckIn
Llegada de
Pasajeros TRANSFERNODE en el que se
elige la fila más corta
Nuevo TRANSFERNODE
para elegir un mostrador Input@CheckIn2
que esté abierto
Pregunta 12: ¿Cuál es el tiempo medio de espera de un pasajero en el mostrador situado en la acera?
Pregunta 13: ¿Cuál es el tiempo medio de espera de un pasajero en el mostrador del terminal?
Pregunta 14: ¿Cuánto tiempo está trabajando el operario que está situado en el mostrador de la acera?
¿Porcentaje de utilización?
Pregunta 15: ¿Cuánto tiempo están trabajando los operarios que están situados en los mostradores
interiores? ¿Porcentaje de utilización?
Paso 6: Dése cuenta que en la simulación, hay pasajeros que están en fila cuando el mostrador CheckIn2
cierra porque acaba su jornada. Allí se quedan estancados; solucionaremos el problema en otro capítulo
más adelante.
Caminos con Desvíos, Tablas de Ritmos y Dependencias entre Entidades: Aeropuerto bis 23
Capítulo 4
Secuencias y Viajeros: Célula de Fabricación
Más opciones de modelización utilizando objetos básicos SOURCE, SERVER, y SINK.
Secuencias de entidades.
Uso de vehículos
Una pequeña célula de fabricación está compuesta por tres estaciones de trabajo en la que se procesan cuatro
piezas distintas. Las estaciones A, B, y C, se disponen de forma que las piezas sigan una ruta circular (Figura
4.1). Si una pieza cumple su último proceso en la Operación C, tendrá que ir a la Operación A y luego a la B
antes de dirigirse hacia la salida. Se desea realizar una simulación de una semana de 5 días, con un jornada
de trabajo diaria de 8 horas, para un total de 40 horas en una semana.
Llegada Salida de
de Piezas Dirección de Piezas
Movimiento
Cada una de los tipos de piezas (entity) presenta una ruta distinta de procesamiento. De hecho, no todas
tienen que pasar por todas las estaciones. Las secuencias se muestran en la Tabla 4.2.
Tabla 4.2: Secuencia por Pieza
Paso 1 2 3
Pieza 1 Operación A Operación C
Pieza 2 Operación A Operación B Operación C
Pieza 3 Operación A Operación B
Pieza 4 Operación B Operación C
La Operación B tiene dos máquinas, cada una con un tiempo de proceso que varía entre 5 y 11
minutos, con un tiempo más habitual de 9 minutos.
La Operación C se compone de dos máquinas que operan durante las cuatro primeras horas de cada
día y una máquina que lo hace durante las últimas cuatro horas. Cada una tiene un tiempo de proceso
que varía entre 2 y 11 minutos con una moda de 6 minutos.
Paso 1: Primero, cree el modelo en SIMIO utilizando cuatro fuentes, SOURCES, para cada una de las cuatro
entidades (arrastrando cuatro MODELENTITIES dentro del tapiz). Son necesarias cuatro fuentes de piezas
porque cada una tiene su propio proceso de llegada. Necesitaremos tres servidores, SERVERS (uno para
cada estación) y un único sumidero, SINK. Denomine cada objeto de forma que sean fácilmente
reconocibles (Figura 4.2).
Paso 2: Probablemente el mejor método para simular la circulación circular sea utilizar un nodo básico
BASICNODE, tanto en la entrada como en la salida de cada estación11. Esto permite a las entidades seguir
el patrón de las secuencias sin tener que añadir procesos no deseados.
10
Por ahora, le dejaremos pensar sobre cuál es la distribución más adecuada en función de estos parámetros.
Conectores
Nodo
Básico
Caminos
Paso 5: Cambie las propiedades de las fuentes de forma que incluyan la pieza y los patrones de llegada
correctos. Elegimos la distribución Exponencial, Normal, y Uniforme, respectivamente, para los tiempos
de llegada de las piezas 1, 2, y 3, incluyendo los parámetros proporcionados para cada caso. Para la
Pieza 4, elegimos un tiempo entre llegadas constante de 70 minutos y en la propiedad lote, Entities Per
Arrival, introducimos un valor de 5.
Paso 6: Incluya las distancias entre estaciones que cubren cada uno de los cinco caminos. Tendrá que
especificar como “False” la propiedad Drawn To Scale para cada camino.
Paso 7: Utilice para el tiempo de proceso de cada estación la distribución Beta habitual en la técnica Pert de
control de duración de tareas, Pert (BetaPert). En general, se prefiere la distribución Beta a Triangular.
Se especifican las dos con los mismos parámetros (mínimo, moda, máximo), pero no son tan probables
los valores extremos, lo que suele representar más fiablemente los tiempos de proceso.
Paso 1: Especifique las capacidades de la Operación A y la Operación B como “1” y “2”, respectivamente.
Para la Operación C, necesitaremos añadir un horario que recoja los cambios en capacidad a lo largo de
la jornada.
11
Un TRANFERNODE para la entrada/salida de una estación romperá la secuencia interna de SIMIO en cuanto a los pasos de las piezas
si no es cuidadoso.
12
Seleccione las cuatro entidades utilizando la tecla Ctrl y especifique la velocidad simultáneamente para todas las entidades.
26 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 2: En la pestaña “Data”, seleccione “Schedules” en el panel izquierdo, y luego “Add Schedule”. Llame
al horario, work schedule, ScheduleForC y deje sin rellenar la propiedad de fecha de inicio, Starting
Date, que será identificada en las opciones del menú de ejecución, Run.
SIMIO repetirá el ciclo de trabajo tantas veces como días haya en el patrón de trabajo. Dado que
nuestra simulación empezará a las 12am y durará 40 horas, hemos de rellenar el campo “días” como
“1” en la propiedad Work Pattern y dejar que se repita el ciclo una vez pasadas 24 horas.
Señale ahora las cuatro primeras horas de la pestaña “Work Cycle” empezando a las 12am y haga
clic con el botón derecho para añadir un nuevo elemento en el ciclo de trabajo. Cuando aparezca la
ventana de diálogo, cambie la opción a On Shift con un valor de “2” y haga clic en OK. Señale
después las cuatro siguientes horas, añada un elemento, y cambie la opción a On Shift con un
valor de “1”. Repita este proceso para todo el día.
Paso 3: Vuelva a la pestaña “Facility” y asigne a la propiedad Capacity Type de la Operación C el valor
“WorkSchedule”, incluyendo ScheduleForC.
Según la configuración actual de nuestro modelo, las entidades se separarán en los nodos en función de
pesos y de la dirección del enlace. Sin embargo, deseamos que las piezas sigan una secuencia establecida de
estaciones. Queremos estar seguros que siguen una ruta circular hasta que lleguen al nodo que les dirige a la
estación apropiada. Para modelizar esta situación, utilizaremos las denominadas Tablas de Secuencias,
“Sequence Tables” (pestaña “Data”).
Paso 1: Haga clic en el botón con el que se añade una tabla, “Add Sequence Table”, y denomine la nueva
tabla como SequencePart1 para que corresponda con la primera pieza. Añada otras tres tablas, una para
cada una de las otras tres piezas.
Paso 2: Añada la secuencia de nodos que debe seguir la Pieza 1. Sólo es necesario incluir los nodos a visitar
así como la salida. Una vez que la secuencia está lista, siempre seguirá la ruta más corta hasta llegar al
primer nodo de la lista. La secuencia correcta para la Part1 se detalla en la Figura 4.313.
Asegúrese de
incluir la salida en
la secuencia
13
Vea que se especifican los nodos de entrada de los SERVERS y SINK en vez de los objetos.
Paso 5: Para cada uno de los 7 nodos, TRANSFERNODES (nodos de salida de cada fuente y estación), cambie la
propiedad de destino, Entity Destination Type, a “By Sequence”. Cuando por primera vez una entidad
pasa por uno de los nodos en que la opción es “By Sequence”, el nodo marca como destino de la entidad
el valor del indicador de la primera fila de la tabla de secuencias, SEQUENCE TABLE. Después de eso,
cada vez que una unidad pasa por un nodo de transferencia con destino “By Sequence”, el indicador de
fila de la tabla se incrementa en 1 y el destino de la entidad se marca como el siguiente nodo en la
tabla14.
Pregunta 4: Al pasar por un BASICNODE, ¿cambiará el indicador de fila de una tabla de secuencias,
SEQUENCE TABLE?
Paso 6: Antes de ejecutar la simulación, puede ser apropiado cambiar los colores de cada una de las piezas
de forma que sea fácil distinguirlas en el modelo. También ayudará para verificar que siguen la
secuencia correcta. Ejecute la simulación durante 40 horas a un ritmo lento para cerciorarse de que las
piezas siguen la secuencia correcta.
Pregunta 5: Desactive las llegadas de todos los tipos de piezas menos de 1. ¿Sigue la secuencia correcta?
Podemos ahora aprender que en lugar de que dejen el sistema, las piezas han de ser transportadas en un
carrito hasta el almacén que está situado a 300 yardas. El carrito puede transportar un máximo de 3 piezas a
una velocidad de 4 pies por segundo. Después de descargar las piezas, ha de volver a recoger un nuevo lote
de piezas o esperar a que haya alguna para ser transportada. El carrito no tiene por qué estar lleno para
dirigirse al almacén, esto es, llevará las piezas que estén disponibles, en este caso, 1, 2 ó 3.
Paso 1: Borre el conector entre el objeto salida y el nodo básico anterior. Incluya un nodo de transferencia,
TRANSFERNODE, entre los dos. Llame a este nuevo nodo TransferCart. Conecte el BASICNODE al
TRANSFERNODE con un camino, PATH, de 10 yardas de longitud. Conecte el nodo de transferencia al
sumidero con un camino o PATH (asegurando que es bidireccional, bidirectional, de forma que el carrito
pueda moverse en ambas direcciones). Fije la longitud del camino en 300 yardas.
Paso 2: Arrastre dentro del tapiz un vehículo, VEHICLE de la [Standard Library]. Los cambios deben
asemejarse a lo mostrado en la Figura 4.4.
14
Si el indicador de fila corresponde a la última fila y la entidad entra en un TRANSFERNODE con un destino “By Sequence”, el
indicador de fila volverá a tomar el valor 1.
28 Modelización y Simulación: Libro de Prácticas con SIMIO
Parking del Cart
Figura 4.5: Especificando el Nodo para que las Entidades Utilicen un Transportador
Paso 4: Use la Figura 4.6 como guía para que el vehículo Cart circule con la velocidad deseada, Initial
Desired Speed, 4 pies por segundo, así como su capacidad de transporte, Ride Capacity, a 3. Recuerde
también que debe asignar el sitio donde debe aparcar un vehículo, Initial Node(Home), como
TransferCart. Cambie ahora la propiedad Idle Action a “Park At Home”, con lo que el vehículo se
dirigirá a su garaje cuando no hay entidades que hayan lanzado peticiones de transporte. Si no lo indicara
así, el vehículo se mantendría en la salida hasta recibir una nueva petición. Aumente también el tamaño
del lugar donde las entidades esperan a ser recogidas (Figura 4.4).
Paso 7: El modelo no muestra cuántas piezas están esperando al carrito en el nodo de transferencia, por lo
que será útil ver cuántas se encuentran esperando en cualquier momento de la ejecución. Podemos añadir
la denominada Fila Separada, “Detached Queue.”
Paso 8: En la pestaña de “Animation”, haga clic en “Detached Queue.” Aparecerá un cursor en el tapiz
principal. Haga clic con el botón izquierdo en el sitio donde quiere que empiece la fila y después con el
derecho en el lugar que quiere que finalice (antes de hacer clic con el botón derecho para localizar el
final de la fila, puede continuar haciendo clic con el botón izquierdo para añadir más vértices). Como se
aprecia en la Figura 4.7, dibuje la fila en forma de “L”. De otra forma, una entidad parece que está
intentando entrar en el nodo y al sobreponer “L” se muestran todas las entidades que están esperando ser
transportadas.
Fila Separada
para las entidades
que esperan para
ser recogidas
15
La fila de aparcamiento sólo es para la animación, puesto que el transportador está físicamente en el nodo incluso si no se muestra
en pantalla.
30 Modelización y Simulación: Libro de Prácticas con SIMIO
Haga clic ahora en la cola y en la ventana de propiedades cambie Queue State a
TransferCart.RidePickupQueue, donde TransferCart es el nombre del nodo de
transferencia en donde se recogen las piezas acabadas. Su nombre puede ser diferente.
Pregunta 6: ¿Cuál es el porcentaje de utilización del carrito durante las 40 horas que dura la repetición?
Los horarios y patrones de trabajo, Work schedules, las secuencias, sequences, las colas
separadas, detached queues, y los transportadores o vehículos, presentan en SIMIO
características similares a las de Arena.
La animación en SIMIO garantiza un vista atractiva, mucho más realista que la de Arena.
El uso de vehículos en SIMIO es fácil de implantar y más fácil de usar que en Arena.
Las tarjetas de memoria contienen unos chips de memoria insertados mediante una operación de ensamblaje,
con capacidad 4. Cada tarjeta de memoria requiere cuatro chips. Las tarjetas de memoria, así como los chips,
llegan de forma aleatoria, por lo que el ensamblador espera a tener cuatro chips del mismo tipo y una tarjeta
antes de realizar el ensamblado. Después, la tarjeta de memoria ensamblada se manda a una de tres
estaciones de empaquetado, cada una con un operario. Las tarjetas se mandan a la fila de empaquetado con
un menor número de unidades esperando. Estas características numéricas se resumen en la Tabla 5.1.
Paso 1: Cree un nuevo modelo con dos fuentes, SOURCES, una para tarjetas y otra para chips de memoria.
Añada dos entidades, MODELENTITIES, en el modelo, una denominada MemoryBoard para tarjetas, y
otra denominada Memory para chips.
Paso 2: Utilice distintos símbolos para diferenciar las entidades (Figura 5.1). Puede utilizar sus propios
símbolos si hace clic en el botón “New Symbol” en la sección “Create” de la pestaña “Project Home”.
Cuando cree un símbolo nuevo, debe especificar su altura, “height”, en metros. En el caso mostrado en
la Figura 5.1, se ha creado un rectángulo con una altura de 0.5 metros16. No hay que preocuparse en
16
Las tarjetas de memoria no son de 0.5 metros de ancho pero se ha hecho así para facilitar su visión en 3-D.
32 Modelización y Simulación: Libro de Prácticas con SIMIO
exceso sobre las especificaciones exactas ya que el símbolo puede ajustarse manualmente después de
hacer clic en el símbolo de MemoryBoard y utilizando nuestro nuevo símbolo (haciendo clic en
SYMBOL1 y en Symbols→Project Symbols).
Paso 3: Para los chips de memoria, añada un símbolo adicional17, coloreando este segundo símbolo con un
color diferente para diferenciarlos en el sistema.
Paso 6: Volviendo a la pestaña “Facility”, haga clic en MemoryArrivals. Para asignar la nueva variable
ChipType, se especificará una asignación, Before Existing State Assignment, de forma que se
otorgue un valor a ChipType antes de que la entidad abandone la fuente. Haga clic en la opción
que se encuentra a la derecha de Before Exiting State Assignments para que aparezca el editor de
propiedades, “Repeating Property Editor”, y añada la siguiente propiedad:
Paso 7: Ahora, agrupe (batch) 4 miembros en el COMBINER mediante la especificación de Match Members
como una regla de agrupación, Matching Rule, con ModelEntity.ChipType como una propiedad
Member Match Expresión (Figura 5.2).19
17
Seleccione Memory y luego el botón Symbols→Additional Symbols→Add Additional Symbol.
18
La distribución Discrete debe ser especificada según las probabilidades acumuladas.
Utilice este
TRANSFERNODE
Paso 10: Cuando una tarjeta ya está ensamblada, puede seleccionar uno de tres destinos:
Input@Packer1, Input@Packer2, o Input@Packer3. Cree un nuevo nodo LIST (pestaña
“Definitions”) y denomínelo LstPackers, empezando con Input@Packer1 (Figura 5.4).
19
Los combinadores pueden casar entidades entre sí, casar miembros entre sí o casar ciertos miembros con padres.
34 Modelización y Simulación: Libro de Prácticas con SIMIO
Selection Expression: Candidate.Node.NumberRoutingIn+
Candidate.Server.InputBuffer.Contents.NumberWaiting+
Candidate.Server.Processing.Contents.NumberWaiting20
Pregunta 1: Examine la expresión de selección, Selection Expression, y advierta que se compone de tres
componentes. ¿Qué representan cada uno de ellos?
Paso 12: Especifique la forma de trasladarse desde las empaquetadoras a la salida utilizando una
propiedad del modelo, “Model Property”, que se encuentra en la pestaña “Definitions”. Incluya una
propiedad numérica de tipo real, “Real” , elegida del menú “Standard Property” y opción TimeToExit, y
especifique su valor por defecto, Default Value, como “3.5”, con las unidades por defecto en minutos
(Unit Type, Time; Default Units, Minutes).
Paso 13: Ahora ya puede especificar el tiempo de desplazamiento, Travel Time, de cada uno de los
caminos hasta la salida21 como , esto es, con una propiedad de referencia, reference
property. Si desea cambiar ahora el tiempo de desplazamiento de los tres caminos a la vez, sólo hay que
cambiar la nueva propiedad.
Paso 14: Guarde el modelo y ejecútelo durante 10 horas, y conteste a las siguientes preguntas.
Supongamos que es necesario cambiar el ritmo de operación de Packer1 en función del número de tarjetas
que están esperando (tamaño de la fila). Específicamente, la eficiencia de la empaquetadora es sólo del 80%
cuando no hay tarjetas esperando, 90% cuando hay 1, y 100% cuando hay al menos dos.
Paso 1: Necesita ahora incluir una tabla de eficiencias, “efficiency” table, para determinar el tiempo de
proceso. Esta tabla puede ser también modelizada como una tabla “Function” en SIMIO (dicho de otra
forma, f(x)). En la pestaña “Data”, añada una tabla discreta, “Discrete Function Table”, cuyos valores
son 0.8 cuando x = 0, 0.9 cuando x = 1, 1 cuando x = 2, y 1 cuando x = 100 (Tabla 5.2).
20
La designación de candidato, Candidate, es una referencia que toma como valor la identidad del objeto al que está haciendo
referencia. Aquí hace referencia al nodo hacia el que la entidad está siendo dirigida y la fila específica de entrada, INPUTBUFFER, o
de procesamiento, PROCESSING, de la estación que está al final del camino.
21
Seleccione a la vez los tres caminos y después haga click con el botón derecho en la propiedad Travel Time y seleccione la nueva
propiedad de referencia TimeToExit.
Recuerde que la tabla interpola para valores que se encuentren entre los valores especificados. Denomine
Efficiency a la tabla.
Random.Triangular(3,5,8)/
Function.Efficiency[Packer1.InputBuffer.Contents.NumberWaiting]
Pregunta 5: ¿Por qué dividimos el tiempo original del proceso entre la eficiencia?
Paso 3: Quisiéramos estar seguros de que nuestra función “eficiencia” está funcionando. Para comprobarlo,
utilizaremos un gráfico de estado, “Status Plot”, que se puede encontrar en la pestaña “Animation”.
Utilice las siguientes especificaciones para el gráfico.
Function.Efficiency[Packer1.InputBuffer.Contents.NumberWaiting]
Paso 1: Arreglemos primero la animación de la tarjeta de memoria de forma que parezca que los chips están
pegados. Haga clic en el símbolo de MEMORYBOARD y añada una fila del tipo BATCHMEMBERS que está
incluida en “Attached Animation” en el menú “Draw Queue”. Posiciónela encima del MEMORYBOARD
como se muestra en la Figura 5.6.
BATCHMEMBERS
Paso 2: Utilicemos el color de las tarjetas para designar y diferenciar entre los dos tipos. Para hacer esto,
haga clic en la entidad MEMORY y después en “Add Additional Symbol” en la sección “Additional
Symbols” dentro de la pestaña Symbols. Puede colorear un símbolo en rojo y el otro en verde mediante
la simple selección de un símbolo, activándolo como “Active Symbol”, y cambiándolo de color. Fíjese
que los dos símbolos han sido numerados como 0 y 1 (no 1 y 2).
Paso 3: También se puede asignar colores a los diferentes tipos de chip. Seleccione la fuente
MemoryArrivals. Haga clic en el recuadro que se encuentra a la derecha de Before Exiting State
Assignments, dado que queremos asignar el color antes de que la entidad se vaya de la fuente. Se abre
entonces el editor de propiedades “Repeating Property Editor”. Se debe añadir una variable de estado
adicional con las características siguientes:
El valor de una variable de estado, “state variable”, en contraposición al de una propiedad, puede ser
modificado durante la simulación, y el dibujo de una entidad se trata en SIMIO como si fuera una
característica de la entidad (lo que a veces se denomina como un atributo de la entidad).
Paso 5: Supongamos que queremos que el símbolo que sale de la estación de empaquetado parezca un
“paquete”. Se puede realizar la animación de diversas formas. Una forma fácil es utilizar una asignación
22
Recuerde que la tecla “h” hace aparecer instrucciones sobre cómo mover los objetos tanto en 2D como en 3D, así como ideas
sobre cómo manipular objetos. Presionando la tecla “h” otra vez hace desaparecer las instrucciones.
Puede que tenga que experimentar con el valor. La idea es cambiar la altura, “height”, de la tarjeta
de memoria de forma que encapsule los chips para que no se vean (se esconde entonces los
miembros del lote dentro de la tarjeta).
Paso 6: Ejecute el modelo y ajuste la altura hasta que el icono que sale de la empaquetadora parezca un
paquete. Tendrá que realizar el mismo cambio en el resto de empaquetadoras.
Paso 8: Guarde el modelo y ejecútelo durante un período de 10 horas y conteste a las preguntas siguientes.
Paso 1: Considere primero la variable eficiencia. Para calcular su valor, tenemos que definir una variable de
estado. En la pestaña “Definitions”, seleccione “States” y haga clic en “Discrete State” para definir una
nueva variable Packer1Efficiency.
23
No confundir una variable de estado, “state variable”, con una estadística de estado, “state statistic”.
38 Modelización y Simulación: Libro de Prácticas con SIMIO
Pregunta 15: Existen diversas variables de estado, pero la única discreta es la relevante. ¿Qué hay de
discreto en los cambio en eficiencia?
Paso 2: Para garantizar que Packer1Efficiency proporciona el valor correcto, modifiquemos las
asignaciones, “State Assignments”, en Packer1. En particular, hagamos la siguiente asignación al entrar
en la estación, On Entering:
Paso 3: Finalmente, necesitamos definir la estadística del tipo estado, “State Statistic”, lo que podemos
realizar desde la pestaña “Definitions”, pero en la sección de elementos, “Elements”. Denominémosla
Packer1Utilization y usemos Packer1Efficiency como nombre de la variable de estado, State Variable
Name.
Paso 5: Obtengamos también estadísticas sobre el tiempo de permanencia en el sistema tanto de las tarjetas
de memoria como de los chips. Una vez más, hay diversas formas de hacer esto. Aunque piense que
tiene que proporcionar información adicional a SIMIO, este es un caso en el que podemos ayudarnos en
la forma en que SIMIO calcula estadísticas. Recuerde que automáticamente se obtiene el tiempo en el
sistema de las entidades que cruzan el sumidero o salida. Utilizaremos esta forma de modelizar.
Paso 6: Para obtener resultados de las tarjetas y los chips, podemos separarlos y mandarlos a salidas distintas
– y hacerlo sin cambiar las estadísticas habituales. Nuestro enfoque se muestra en la Figura 5.7.
Miembros
separados
Figura 5.7: Separando Entidades
Se sustituye el sumidero, SINK, por un separador, SEPARATOR, de la [Standard Library], para que ayude
a separar los “padres” de los “miembros”. Los miembros se separan y se mandan a diferentes salidas.
Los distintos objetos se conectan con conectores, CONNECTORS.
La separación de miembros se basa en pesos, “Selection Weight.” El peso para las RedLeaves es:
ModelEntity.ChipType==1. Y para las GreenLeaves es: ModelEntity.ChipType==2.
Las funciones y las gráficas de SIMIO se asemejan a las de Arena. En cambio, las capacidades
de animación de SIMIO son claramente mejores.
El cálculo de estadísticas para variables de estado en SIMIO es similar al usado en Arena para
las variables que dependen del tiempo. El cálculo de estadísticas basadas en observaciones en
SIMIO no puede ser realizado en un módulo como en Arena. Sin embargo, como veremos en el
siguiente capítulo, el uso de procesos puede fácilmente adaptarse para obtener este tipo de
información.
Típicamente, los procesos se invocan mediante acciones de los objetos durante la simulación o por eventos
que el modelizador diseña. Escribir un proceso es similar a crear un flujograma estilizado, con excepción de
que los componentes del flujograma son etapas lógicas como Asignar, Decidir, Contar, Transferir, Apresar,
Retrasar, Liberar ... La ejecución de un proceso se realiza con una señal, ficha o “token.” Las fichas (o
fichas) provocan la realización de los pasos del proceso para un objeto, normalmente, el objeto que lanza la
ficha o aquel cuyo comportamiento se ve modificado por el proceso.
Casi todos los objetos de SIMIO tienen disparadores, “Add-On Process Triggers”. Estos disparadores hacen
que se ejecuten procesos externos, esto es, procesos arbitrarios diseñados por el propio usuario para cambiar
o expandir el comportamiento de un objeto (por ejemplo, SERVER). La otra opción sería clonarlos o hacer
subclases de los objetos (vea el Capítulo 18 para más información sobre subclases).
En el Capítulo 5, se cambiaron ciertas características o atributos de las entidades. En un caso, los distintos
tipos de una entidad (chips) se colorearon para facilitar su diferenciación, y, en un segundo caso, se
incrementó la altura de otra entidad (tarjeta de memoria) para mejorar la animación del modelo. En ambos
casos, cambiamos los valores de variables de estado, “state variables”, utilizando las propiedades de
asignación de estados, “State Assignments”. Verá que las posibilidades de realizar este tipo de asignaciones
son limitadas, mientras que son más numerosas si se utilizan disparadores. Más aún, los “State Assignments”
sólo pueden asignar valores, mientras que un proceso puede incorporar lógica más compleja que las
asignaciones simples.
Paso 1: Veamos cómo se pueden replicar las asignaciones, “State Assignments”, utilizando disparadores.
Abra el modelo usado en el Capítulo 5. Primero, elimine los “State Assignment” de MemoryArrivals
(utilizando el editor de propiedades).
Pregunta 1: ¿Qué disparadores están disponibles para los objetos fuente, SOURCE?
Pregunta 2: ¿Cuándo se pueden utilizar “State Assignments” con los objetos fuente?
Paso 3: Elija el disparador que se dispara cuando sale una entidad, “Exited”. Haciendo doble clic en este
disparador se creará un nuevo proceso denominado MemoryArrivals_Exited y se le remitirá a la
pestaña de procesos, “Processes”. Verá un flujograma con un comienzo, “Begin”, y un final, “End”
(Figura 6.1). Haciendo clic en uno de los pasos del proceso, puede insertarlo en el flujograma, que se
ajustará automáticamente.
Pregunta 3: Enumere alguno de las etapas disponibles que se pueden utilizar para crear un proceso.
Paso 6: Borre la asignación “On Entering” en Packer1. Cree un disparador “Entered” e introduzca un
proceso Assign que hace lo siguiente:
En el modelo del Capítulo 5, la asignación utilizada para cambiar la altura de las tarjetas de memoria para
que la entidad se asemejara a un paquete compacto fue realizada en cada empaquetadora. Por supuesto, este
enfoque puede ser duplicado mediante la creación de un disparador “Exited” para cada una de las
empaquetadoras. Sin embargo, la misma lógica de asignación de la altura ha de ser incluida en cada uno de
los tres disparadores “Exited”. Creemos entonces un proceso que pueda se referenciado por cada una de las
Paso 1: En la pestaña “Processes”, haga clic en el botón de creación de un proceso, “Create Process”,
denominando el nuevo proceso como Packaged. Añada una etapa Assign al flujograma con las
siguientes asignaciones.
Paso 3: Vaya al disparador “Exited Add-On Process Trigger” de cada uno de las empaquetadoras. En lugar
de crear uno nuevo, seleccione el disparador Packaged de la lista.
Recuerde que las estadísticas basadas en la observación se denominan TALLY en SIMIO. Estas estadísticas se
recogen como observaciones durante la ejecución de una simulación. Como ejemplos más habituales se
pueden citar los tiempos de permanencia en una fila, los tiempos totales de permanencia en el sistema o los
tiempos de ciclo. En general, son estadísticas cuyas observaciones son intervalos de tiempo.
Paso 1: Consideremos que son necesarias las estadísticas TALLY del tiempo que están tanto las tarjetas de
memoria como de los chips hasta que empiezan a ser empaquetadas en Packer1. Necesitamos definir
primero un nuevo elemento. En la sección “Definitions→Elements”, haga clic en “Tally Statistic” para
crear una nueva variable denominada SystemTimePacker1.
Paso 2: Necesitamos definir el proceso de recogida de observaciones. Inserte una etapa Tally en
Packer1_Entered (Figura 6.2). En este caso:
Figura 6.2: Utilizando una Etapa Tally para Controlar el Tiempo antes de la Empaquetadora 1
Pregunta 6: ¿Podría ser el valor simplemente ModelEntity.TimeInSystem?
24
TimeNow es la hora actual del reloj de la simulación y la función TimeCreated devuelve la hora en que la entidad fue creada.
Pregunta 7: ¿Cuál es el tiempo que tardan tanto las tarjetas como los chips desde la entrada hasta el
comienzo de la operación de empaquetado 1?
Paso 4: Suponga que ahora queremos saber el tiempo que emplea una entidad ensamblada desde que
empieza en la estación Packer1 hasta la salida después de 4 horas de simulación. Tenemos que
modificar nuestro proceso para que sólo se obtengan las observaciones referidas a las tarjetas pasadas las
primeras cuatro horas.
Paso 5: Modifique nuestro proceso “Packer1_Entered” y añada una etapa decidir, Decide, antes de
Tally (Figura 6.3). Esta etapa Decide es similar a una función SI en Excel donde si una condición es
verdadera el proceso continuará por una rama del flujograma, la rama “True”, y en caso contrario seguirá
por la otra rama, “False”. La propiedad que marca el tipo de decisión, Decide Type, debe basarse en una
condición, “ConditionBased”, con una expresión Expression que indique: TimeNow > 4.
Pregunta 8: ¿Qué tiempo de permanencia obtiene para las tarjetas y los chips desde que llegan hasta el
momento en que empiezan a ser empaquetados en Packer1?
Paso 7: Es posible que desea usar etapas de proceso para reemplazar los cambios en la modelización que se
realizaron sobre el modelo del Capítulo 5 de forma que se obtengan estadísticas de tiempo en el sistema
por tipo de chip (verde o rojo) y para las tarjetas.
Conecte las tres operaciones de empaquetado con el sumidero de forma similar a lo que se hizo en la
Figura 5.3.
Paso 8: Definamos tres nuevas estadísticas TALLY (recuerde que son elementos, “Elements”), denominadas
BoardTimeInSystem, RedTimeInSystem, y GreenTimeInSystem.
25
Cuando borra un nodo, desaparecen todas sus conexiones. Puede conectar nodos rápidamente si aprieta las teclas Shift y Ctrl, y
hace clic en el nodo de origen y arrastra el conector hasta el destino. Tendrá que seleccionar el tipo de conexión.
44 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 6.4: Proceso de Destrucción de Entidades
Ha sido necesario incluir una etapa previa, para desagrupar, UnBatch, las entidades. Ha sido
elegida del panel de etapas y del conjunto de todas las etapas, “All Steps (A-Z)”. La etapa UnBatch
funciona como un objeto separador, SEPARATOR, excepto que se utiliza para desagrupar los “padres”
y los “miembros” y dirigirlos por las ramas correctas.
Pregunta 9: ¿Cuáles son las ventajas y las desventajas de este enfoque frente al original donde el modelo
físico se cambió para obtener estadísticas?
Pregunta 10: ¿Qué otras etapas que aparecen en la lista “All Steps (A-Z)” no aparecen en las etapas más
comunes, “Common Steps”?
Paso 10: Guarde y ejecute el modelo de forma que observe si hay diferencias con el modelo anterior.
Pregunta 11: ¿Cuánto tiempo están las tarjetas de memoria en el sistema (desde la entrada a la salida)?
Pregunta 12: ¿Cuánto tiempo están los chips verdes en el sistema (desde la entrada a la salida)?
Pregunta 13: ¿Cuánto tiempo están los chips rojos en el sistema (desde la entrada a la salida)?
Paso 11: Los resultados deben ser comparables con los obtenidos en el capítulo anterior.
Pregunta 14: Dado que los resultados son comparables, ¿qué enfoque es más fácil para usted?26
26
La gente suele intentar no utilizar procesos al principio, especialmente si pueden realizar los modelos sin ellos (esta es parte de la
nueva forma de pensar que require SIMIO). Sin embargo, encontrará que el tiempo invertido en aprender a utilizarlos vale la pena en
cuanto se enfrente a sistemas más complicados. El resto de capítulos ilustrará por qué los procesos son tan esenciales.
A veces la capacidad no se reduce a objetos como SERVERS o COMBINERS, que se basan en sus capacidades
internas. En cambio, la limitación puede no estar fijada en el sentido de que la capacidad está situada en una
localización concreta. Por ejemplo, supongamos que la operación de ensamblaje de las tarjetas de memoria
requiere de un accesorio o útil para ensamblar los chips en la tarjeta de memoria. Además, el mismo útil se
utiliza para transferir la unidad ensamblada hasta empaquetado. Para cada operación de ensamblaje, el útil
debe acercarse desde la empaquetadora, para lo que se tarda unos 3 minutos. Asumamos que existen 10
útiles idénticos disponibles para la doble operación ensamblaje-empaquetado.
Paso 1: Primero, arrastre y deje un objeto recurso, R ESOURCE27 en el tapiz, quizá debajo del combinador,
COMBINER como se nuestra en la Figura 6.5. Llame al recurso Fixture y asígnele una capacidad inicial,
Initial Capacity, de 10 (no modificaremos la capacidad en este caso).
Es un recurso
RESOURCE fijo
27
El Capítulo 13 cubrirá con más detalle el objeto RESOURCE.
46 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 6.6: Apresando una Unidad de Útil y Acercándolo
Paso 4: Cuando se acaba un paquete, se libera el útil para poder ser utilizado otra vez en el ensamblaje. Este
proceso tiene que ser modelizado para cada uno de las tres empaquetadoras, de forma que será más
fácil utilizar el proceso reutilizable Packaged, al que se llama cuando la tarjeta de memoria sale de
la estación de empaquetado. A partir de la pestaña “Processes”, incluya la etapa soltar o liberar,
Release (Figura 6.7), lo que liberará una unidad de Fixture.
Pregunta 15: ¿Cuál es la diferencia en el tiempo en el sistema de tarjetas y chips si se comparan los
resultados de los dos escenarios (10 frente a 20 útiles)?
Las bondades de los procesos lógicos de SIMIO es una de sus características sobresalientes, pues
permite extender y particularizar los modelos de forma única y poderosa. Su uso puede requerir
un cambio de mentalidad en la forma de enfocar la simulación.
En Arena los bloques y los elementos de SIMAN corresponden someramente con las etapas y los
elementos en SIMIO. Sin embargo, en Arena los módulos han sido compuestos a partir de los
componentes de SIMAN, por lo que todo viene de SIMAN. En SIMIO, los objetos son
totalmente nuevos y existen varias definiciones y procesos disponibles para alterar el
comportamiento de los modelos estándar de SIMIO. El potencial de estas características de
SIMIO no se encuentra en Arena/SIMAN.
Se pueden realizar muchos tipos de modelizaciones diferentes utilizando recursos, una cualidad
que exploraremos en otros capítulos (Capítulo 13, Capítulo 14, Capítulo 16, etc.).
Recuerde el enunciado del problema del Capítulo 4 donde el objetivo era modelizar cuatro tipos de piezas
que pasaban por tres estaciones: A, B, y C. Las estaciones estaban situadas de forma que el patrón de
movimiento es circular y unidireccional (Figura 7.1). Por ejemplo, si se termina una pieza en la Operación C,
tendrá que recorrer el camino hasta la Operación A, y luego hasta la Operación B, antes de que puede
dirigirse hasta la salida. Queremos simular un período de 40 horas. Las piezas se mueven a una velocidad de
2 millas por hora.
Llegada Salida de
de Piezas Travel Direction Piezas
También en el Capítulo 4, las piezas llegaban desde cuatro fuentes distintas, cada una con su propio patrón
de llegadas. Algunas veces, es necesario modelizar utilizando una única fuente, aunque haya cuatro tipos
distintos de piezas, cada uno con un porcentaje sobre el total (Tabla 7.2).
Paso 1: Abra en primer lugar el modelo del Capítulo 4, guárdelo con otro nombre, y borre todas las fuentes
menos una (Figura 7.2).
Única Fuente
Nodo básico
de Salida
Paso 3: En la pestaña “Data”, haga clic en SequencePart1 que está asociada con la Pieza 1. Debido a que
los tiempos de proceso pueden seguir cualquier distribución (o expresión válida), añada una columna
Tiempos de Proceso Específicos por Pieza y Fuentes Únicas: Célula de Fabricación bis 49
nueva para incluir expresiones denominada ProcessingTimes a partir del menú Standard Property.
Asegúrese de que la columna tiene las unidades apropiadas haciendo que Unit Type sea “Time” y las
unidades por defecto, Default Units, “minutes.”
Paso 4: Fije el tiempo de proceso para StationA según la función Pert, Random.Pert(2,5,8), el de
StationC según Random.Pert(2,6,11)y finalmente Exit en 0 (Figura 7.3).
Paso 6: Para que una única fuente sea capaz de producir múltiples tipos de entidades, se ha de crear una
nueva tabla de datos para especificar el tipo de pieza de las entidades así como el mix de producto en
porcentaje. Añada una tabla nueva denominada TableParts con cuatro columnas (Tabla 7.4).
A continuación, especifique cada entidad como una nueva fila con la información correspondiente
(Tabla 7.5).
Paso 7: Para que se pueda utilizar tiempos de proceso dependientes del tipo de pieza, cambie las expresiones
de tiempo de proceso en las tres estaciones de forma que se lean losvalores
TableParts.ProcessingTime. Más en concreto, esta lógica hace que el tiempo de proceso se lea de la
columna ProcessingTime de la tabla de datos, TableParts. Como cada pieza se mueve en función de las
filas de su propia tabla de secuencias, obtendrá el tiempo de proceso de la fila correspondiente. La
propiedad es ahora una propiedad del tipo referencia
Paso 8: Para generar múltiples tipos de piezas de la misma fuente, el tipo de entidad, Entity Type, necesita
ser modificado para incluir cada tipo de entidad. En la fuente, SOURCE, especifique que el valor de Entity
Type se busque en TableParts.PartType. Esta especificación permite que Entity Type pueda ser de
cualquiera de los tipos especificados en la tabla.
Paso 9: Haga que el tiempo entre llegadas sucesivas de piezas se comporte según una distribución
Exponential con una media 10 minutos.
Paso 10: Para determinar qué tipo de pieza se crea, se debe incluir en las propiedades del objeto los
porcentajes del mix de productos. La fuente, SOURCE, tiene una categoría de propiedades para asignar
valores de una tabla, “Table Reference Assignment”. Existe la posibilidad de realizar dos asignaciones:
antes de la creación de una entidad, Before Creating Entities, o justo después de haberlas creado, On
Created Entity. En este caso, queremos realizar la asignación antes de la creación deforma que se cree el
tipo de pieza de forma correcta (Figura 7.4).
Tabla de
Piezas
Fila
Paso 11: La asignación a una tabla de referencia se puede realizar de forma alternativa utilizando un
disparador, “Add-On Process Triggers”, en el objeto fuente, SOURCE. El proceso que se dispara puede
añadir flexibilidad (aunque no sea necesario en este ejemplo), puesto que el objeto dispone de cuatro
disparadores distintos (Tabla 7.6).
Tiempos de Proceso Específicos por Pieza y Fuentes Únicas: Célula de Fabricación bis 51
fuente
Paso 12: El tipo de pieza se tiene que determinar antes de crear la entidad (Creating Entities). Para
llamar a este proceso de creación, Creating Entities, haga doble clic en la etiqueta para crear un proceso,
o utilice la pestaña “Processes”. Esta acción añadirá un proceso SrcParts_CreatingEntities así como
que hará que “Processes” sea la pestaña activa.
Paso 13: Hay que asociar también una fila de la tabla de piezas a la entidad que se va a crear. Incluya
la etapa Set Table (listada en la sección All Steps (A-Z)), arrastrándola entre Begin y End (Figura
7.5).
Paso 15: Ejecute la simulación por un período de 40 horas a velocidad lenta para asegurarse de que
las piezas siguen su secuencia correctamente y conteste a las preguntas siguientes:
Suponga ahora que la transferencia entre las estaciones de la célula de fabricación se realiza con un carril de
transferencia, que es una cinta transportadora continua, continuous conveyor, posiblemente en circuito
cerrado, que tiene estaciones de carga/descarga. Cuando una pieza se sitúa en una de estas estaciones, la
línea entera se para hasta que la pieza se coloca sobre ella o se retira de ella. Estas operaciones tardan entre
0.5 y 1.5 minutos.
SIMIO dispone de dos formas de modelizar las cintas: acumuladoras, accumulating, y no acumuladoras,
non-accumulating. Las cintas acumuladoras permiten que las piezas se junten al final, puesto que la cinta se
sigue moviendo aunque no pueda descargar en una estación. Como ejemplo, se pueden mencionar las cintas
de rodillos. Una cinta no acumuladora se debe parar hasta que la operación de carga/descarga finaliza. Como
ejemplo, se puede mencionar los sistemas aéreos con balancinas que llevan piezas durante el ensamblaje de
coches.
Las cintas en SIMIO no tienen estaciones de carga/descarga, por lo que el carril de transferencia tendrá que
ser modelizado como una serie de cintas individuales. Como el carril se para durante las operaciones, el
concepto de no acumulación es el que hay que emplear, aunque las cintas deben coordinarse entre sí.
Paso 1: Cambie todos los caminos interiores del modelo a cintas. Seleccione un camino y acceda haciendo
clic con el botón derecho al submenú Convert To Type. Para mejorar visualmente el modelo, añada
decoradores de caminos para las cintas (Figura 7.7) a través de la pestaña “Path Decorators”.
Paso 2: Modifique también los símbolos de las piezas de forma que sus dimensiones sean de 1 un metro de
ancho por 1 metro de largo por medio metro de alto. Seleccione las cuatro piezas y cambie sus
dimensiones utilizando la propiedad General→Size and Location. Tendremos que ser un poco más
específicos sobre estas dimensiones cuando dimensionemos también la cinta. Hemos creado estos
símbolos utilizando la sección “Create” de la pestaña “Project Home”, y haciendo clic en “New Symbol”
y seleccionando “Create a New Symbol”. Cuando estemos creando el símbolo, debemos prestar atención
a su tamaño (la cuadrícula está en metros).
Nuevos Símbolos
para las piezas
Cintas
Tiempos de Proceso Específicos por Pieza y Fuentes Únicas: Célula de Fabricación bis 53
Paso 4: En la propiedad de alineamiento de la entidad, Entity Alignment, elija la opción Cell Location. Esta
opción equivale conceptualmente a dividir la cinta en celdas. Las piezas que van sobre la cinta han de ser
posicionadas sobre una celda. Así, fije el número de celdas en el número asociado a la longitud de la
cinta. Si no es así, y selecciona la opción Any Location, una pieza puede ir sobre la cinta en cualquier
lugar, incluso interfiriendo con otras.
Paso 5: Repita el paso anterior para cada cinta que conforma el carril de transferencia.
Paso 6: Dado que el carril de transferencia está formado por muchas cintas en vez de una, hay que
sincronizarlas de forma que cuando las piezas se cargan/descargan de una de las cintas, el carril entero
(el conjunto de cintas) se para hasta que acabe la operación.28 Defina primero una variable discreta de
estado (a partir de la pestaña “Definitions”) y denomínela como número de nodos funcionando,
NumberNodesWorking. Esta variable representará el número de nodos que están o colocando o
retirando piezas del carril. Cuando esta variable es 0, el carril se moverá, y cuando la variable de estado
sea al menos 1, el carril entero se pasará.
Paso 7: Añada ahora un proceso Nuevo (a través de la pestaña “Processes”, seleccione “Create Process”).
Llámelo On_Off_Entered. Este proceso consistirá en las etapas incluidas en la Figura 7.8.
28
La sincronización no es exacta dado que la cinta aguas abajo no conoce que una celda de la cinta aguas arriba está ocupada y que
piezas que están en una celda pueden entrar en conflicto con otras piezas que llegan de una cinta anterior.
54 Modelización y Simulación: Libro de Prácticas con SIMIO
La etapa Decide se basa en la condición de que el número de nodos en espera es 0,
NumberNodesWaiting == 0, lo que significa que no hay otros nodos cargando o descargando
sobre el carril.
La última etapa Assign hace que las cintas vuelvan a arrancar. SIMIO guarda internamente todos
las velocidades en metros por hora, por lo que una asignación de 0.5 se guardará como 0.5 metros
por hora. Si la variable de estado tiene unidades distintas, éstas se pueden especificar vía
asignaciones. Asegúrese de que cambia las unidades a metros por segundo o una especificación de
0.5 metros por segundo será tratada como 0.5 metros por hora 29. Puede convertir 0.5 metros por
segundo en 1800 metros por hora para que sean unidades consistentes con la interpretación de cómo
SIMIO realiza las asignaciones, así como evitar tener que hacer la conversión todas las veces. La
Figura 7.10 muestra cómo se arranca el carril.
Tabla 7.7: Todos los Disparadores que Deben ser Incluidos en la Lógica de Carga/Descarga
Disparador de Procesos A qué Objeto se Asocia
Exited Output@SrcParts (TRANSFERNODE)
Entered Input@StationA (BASICNODE)
Exited Output@StationA (TRANSFERNODE)
Entered Input@StationB (BASICNODE)
Exited Output@StationB (TRANSFERNODE)
Entered Path7 (PATH): El camino que sale de la célula.
Entered Input@StationC (BASICNODE)
Exited Output@StationC (TRANSFERNODE)
Pregunta 6: ¿Por qué no usar simplemente el proceso On_Off_Entered en el BASICNODE de
entrada/salida de la cinta?
Paso 9: Ejecute la simulación durante 40 horas a velocidad lenta para asegurarse de que las piezas siguen de
forma correcta la secuencia y conteste a las siguientes preguntas.
29
La presunción de un tiempo interno representa una elección de eficiencia en contra de la facilidad de uso.
Tiempos de Proceso Específicos por Pieza y Fuentes Únicas: Célula de Fabricación bis 55
Pregunta 7: ¿Cuánto tiempo está cada tipo de pieza en el sistema?
Los fallos son parte de la mayoría de sistemas mecánicos. SIMIO proporciona algunos métodos
relativamente simples para modelizar estos fallos o roturas dentro de la sección de fiabilidad, “Reliability
Logic”, de los objetos SERVER (y también de otros objetos). Por supuesto, en el caso de un carril de
transferencia, se necesita parar el carril cuando una de las máquinas o estaciones esté siendo reparada.30
Asumamos que la Operación C, StationC, es poco fiable. En particular, asumamos que el tiempo entre
fallos, MTBF (Mean Time Between Failures), sigue una distribución exponencial con una media de 10
horas, mientras que el tiempo medio de reparación, MTTR (Mean Time To Repair), se modeliza con una
distribución Triangular (0.5, 1, 2), en horas.
Paso 1: En la sección “Reliability Logic” de la Operación C, especifique que el tipo de fallo, Failure Type,
se base en el tiempo, “Calendar Time Based”, que el tiempo entre fallos, Uptime Behavior, sea
Random.Exponential(10), con Units en horas, y que el tiempo de reparación, Time To Repair, sea
Random.Triangular(0.5,1,2), con unidades en horas (Figura 7.11).
30
El coste tremendo de parada debido a que se paraliza el carril entero es la razón fundamental de por qué cada vez es más difí cil
encontrar carriles y otros sistemas totalmente automatizados.
56 Modelización y Simulación: Libro de Prácticas con SIMIO
cintas si no hay nodos realizando operaciones de carga/descarga (asignando DesiredSpeed = 0.5
para todas las cintas) como se aprecia en la Figura 7.12.31
Paso 4: Finalmente, cambie la animación de StationC de forma que tome el color rojo cuando ha fallado.
Seleccione StationC y haga clic en el botón “Add Additional Symbol”. Cambie el color del segundo
símbolo a rojo utilizando la sección Decoration. Después de seleccionar la estación StationC, asigne la
propiedad Current Symbol Index de StationC a Math.if(StationC.Failure.Active ==
1,1,0), lo que hará que el símbolo tome el valor 0 o 1 (acuérdese de que el indicador de símbolo
empieza en 0).33
Paso 5: Ejecute el modelo y asegúrese de que el carril se detiene cuando la estación está siendo reparada.
31
Copie las etapas Decide y Assign del proceso On_Off_Entered.
32
La función Object.Failure.Active devolverá “true” si el objeto ha fallado.
33
En el Capítulo 10 se discutirá en profundidad sobre fallos.
Tiempos de Proceso Específicos por Pieza y Fuentes Únicas: Célula de Fabricación bis 57
58 Modelización y Simulación: Libro de Prácticas con SIMIO
Capítulo 8
“Material Consumido”, Cambios, Propiedades: Un
Ensamblaje
El objeto Estación de Trabajo, Workstation
Tiempos de preparación dependientes de la secuencia
Material consumido
Propiedades
Un proceso de ensamblaje de una maqueta es un proceso en el que se construye una maqueta a partir de los
componentes disponibles. Las peticiones de ensamblaje llegan a una estación de trabajo siguiendo una
distribución Poisson con un tiempo entre llegadas de 3 minutos. La orden se realiza por una cantidad de
unidades iguales. Las maquetas se ensamblan a partir de 3 componentes; un subcomponente SubA, un
subcomponente B, y dos conectores – este estructura de producto se denomina también lista de materiales o
Bill of Materials (BOM). Cada maqueta se procesa en un tiempo que se asemeja a una distribución triangular
de parámetros (0.1, 0.2, 0.3) minutos. Sólo se puede ensamblar una unidad a la vez en la estación. Se desea
obtener para el análisis de la estación el número de unidades producidas así como de componentes utilizados,
así como información sobre el cumplimiento de los pedidos.
Existen cuatro tipos de maquetas producidas a partir del mismo BOM, según el color: 15% amarillas, 20%
rojas, 35% azules, y 10% verdes. Después de completar un pedido, se necesita 1 minuto para limpiar la
estación, así como 2 minutos para prepararse para el siguiente pedido. Esta restricción sufrirá modificaciones
más adelante. Finalmente, los pedidos tardan en llegar a la estación entre 1 y 2 minutos, lo mismo que tardan
para llegar a la salida desde la estación.
Paso 1: Cree un nuevo modelo que tenga una fuente, SOURCE (OrdersArrive), un sumidero, SINK
(OrdersLeave), y una estación de trabajo, WORKSTATION (KitOperation) .
El tiempo requerido para cada maqueta se modeliza como Triangular(0.1, 0.2, 0.3)
minutos.
La limpieza es de 1 minuto.
Paso 3: Añada 3 símbolos adicionales para la entidad Orders. Seleccione Order y haga clic en el botón Add
Additional Symbol. Asigne color a los símbolos adicionales: “Amarillo”, “Rojo”, y “Azul”. Los símbolos
se enumeran empezando en 0.
Las propiedades, Properties, y los estados, States, se añaden utilizando la pestaña “Definitions”.
Seleccione MODELENTITY en el panel [Navigation] y seleccione la sección Definitions→States. Cada
pedido ha de tener una cantidad diferente y se necesita una variable de estado para almacenar esa
información.
Debe usar la variable de estado discreta, “Discrete State Variable”, de nombre Picture, para
representar la imagen que va a representar a la entidad. Esa variable la proporciona SIMIO.
Debe añadir, en cambio, otra variable de estado discreta, “Discrete State Variable”, de nombre
OrderQuantity, que representará la cantidad de maquetas en el pedido.
Paso 5: Se necesita una tabla para determinar el porcentaje de veces de cada tipo de pedido y el número
correspondiente al dibujo del símbolo. Seleccione MODEL en el panel [Navigation]. Cree una
TableSymbol para los dibujos de las entidades (Tabla 8.1) a través de la pestaña “Data”.
Paso 6: Hay que determinar el tipo de pedido (Verde, Amarillo, etc.), la cantidad que lleva el pedido, o
tamaño del pedido, y el dibujo correcto. Las asignaciones de valores a las variables de estado para las
entidades entrantes a través de la fuente serán realizadas por el disparador de procesos denominado
“procesado”, “Processed” y cuyo nombre será OrdersArrive_CreatedEntity. Es este proceso,
podemos realizar las asignaciones de los valores de las variables de estado para las piezas entrantes,
como se muestra en la Figura 8.1.34
Pregunta 1: ¿Por qué se decidió utilizar la tabla en el disparador “Created” en vez de en el disparador
“Creating” como se hizo en la Figura 7.5?
34
En lugar de utilizar un disparador de procesos, se podía haber utilizado la asignación On Created Entity Table Reference
Assignment para conseguir el mismo objetivo.
60 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 8: Asigne el dibujo correcto así como el tamaño del pedido. Puede hacer esto en dos etapas diferentes o
en una misma etapa con múltiples filas, si hace clic en el botón “0 Rows”. Tiene que añadir cada
asignación como se muestra desde la Figura 8.2 hasta la Figura 8.4.
Use el editor “Repeating Property Editor” para hacer asignaciones múltiples (Figura 8.2).
Cuando la estación de procesado de las maquetas cambia de un color a otro, se incurre en un tiempo de
cambio o preparación de máquina que depende del color que precedió al pedido actual. El tiempo de cambio,
en minutos, se muestra en la Tabla 8.2.
Añadamos los tiempos de cambio, dependientes de la secuencia, en nuestro modelo. En las propiedades de la
estación, WORKSTATION, se puede especificar los tiempos de cambio como si fueran constantes (Specific) (dos
minutos para cada operación). Pero antes de utilizar tiempos que dependan de la secuencia, debemos ver
cómo se incorporan los tiempos de cambio en un modelo de SIMIO.
Paso 1: Primero, se necesita una lista, LIST, de identificadores que se puedan utilizar en una tabla de
cambios, en la que, en este caso, se escriba como una lista de caracteres, Strings. Utilizando la pestaña
“Definitions”, genere una lista, LIST, de caracteres, de nombre Colors. Los contenidos de la lista Colors
corresponderán con los nombres de los colores asignados: “Green”, “Yellow”, “Red”, y “Blue” como se
muestra en la siguiente Figura. Es importante que se incluyan en el orden correspondiente a los símbolos
(0, 1, 2, y 3).
Paso 3: Especifique la lógica de los tiempos de cambio en la estación KitOperation (Figura 8.6).
Paso 5: La estación puede estar en estados distintos: esperando piezas, starved, procesándolas, processing,
preparándose, setup, y limpiando, teardown. Para ver cómo varían los porcentajes a lo largo del tiempo,
añada un gráfico de tarta, “Status Pie” a partir de la pestaña “Animation”. Especifique la propiedad Data
Type, como una lista de estados, ListState, que debe relacionarse con
KitOpereaton.ResourceState.
Paso 6: Guarde el modelo y ejecute la simulación para un período de 1 hora. Luego, ejecútelo en modo
rápido, fast-forward, para un período de 2, 4, y 8 horas. Después de 8 horas, conteste a lo siguiente.
El objeto “estación de trabajo” tiene más posibilidades que un objeto “server”. Por ejemplo, puede utilizarse
para controlar las materias primas que tiene que consumirse, según lo especificado en el “bill of materials”
de la pieza que se está procesando. Si las materias primas no están disponibles, las piezas no pueden ser
procesadas.
Paso 2: Tenemos que declarar la existencia de las materias primas que lleva una maqueta así como la lista de
materiales que especifica la cantidad de cada tipo de materia prima que se necesita para fabricar una
maqueta. Se necesita definir cuatro nuevos “Elements”, del tipo MATERIAL, a partir de la sección
Definitions→Elements.
Cree SubA, SubB, y Connectors como tipos de material, todos con una cantidad inicial, Initial
Quantities, de “0” unidades, lo que será cambiado en breve.
Cree KitsBOM como un elemento tipo MATERIAL, pero utilizando el editor de propiedades
BillofMaterial, como muestra la Figura 8.7, en la que se define qué materiales componen el producto
final (1 SubA y 1 SubB y 2 Connectors).
Paso 3: Como el nivel de inventario es una característica física de nuestro modelo y sólo necesita ser
inicializado al comenzar la simulación, es el momento ideal de utilizar una propiedad de SIMIO.
Utilizando la pestaña “Definitions”, haga clic en “Properties” para añadir nuevas propiedades a los
objetos. Cree tres nueva propiedades “Standard Real Properties”, InitInvA, InitInvB, e InitInvC.
Coloque estas propiedades en la nueva categoría InvModel. La primera vez, hay que teclear el nombre
de la nueva categoría (InvModel) en la ventana correspondiente. Para las dos nuevas propiedades puede
seleccionar la categoría del desplegable.
Paso 4: Vuelva a “Elements” e indique Initial Quantity, de cada uno de los tres materiales como una
propiedad de referencia hacia las nuevas propiedades definidas. Recuerde que esta operación se realiza
haciendo clic con el botón derecho en el desplegable y seleccionando la propiedad de referencia.
Paso 5: Como parte del análisis, cree algunas estadísticas para estudiar los materiales que se han consumido
así como sobre el producto final. Existen tres tipos de estadísticas que se pueden definir. Recuerde que
una estadística “Tally” es una estadística basada en observaciones (por ejemplo, tiempo de espera en una
fila). Una estadística de estado, “State statistic”, es en cambio una estadística basada en el tiempo que
monitoriza una variable de estado (número en una fila). Una estadística de final de simulación, “Output
Statistic” puede utilizarse para mostrar el valor de una expresión, una vez al final de cada repetición.
Añada 4 estadísticas finales, OUTPUT STATISTICS, con los siguientes nombres y expresiones.
Paso 6: Vuelva a KitOperation y rellene las propiedades Other Requirements (por ejemplo, Material
Consumido, Material Consumption, Nombre del Material Consumido, Consumed Material Name,
Cantidad Consumida, Consumed Quantity, Producción de Materiales, Material Production, Nombre del
Material Producido, Produced Material Name, y Cantidad Producida, Produced Quantity) como se
muestra en la Figura 8.8. Estas propiedades harán que la estación consuma materiales según lo indicado
en el BOM cuando se procesan las maquetas.
Paso 8: Guarde el modelo y ejecútelo por un período de 8 horas y observe las estadísticas. Aunque desee ver
la animación durante un rato, necesitará ejecutarlo en modo rápido hasta el final para obtener los
resultados.
Pregunta 9: Después de analizar el número de maquetas producidas, ¿tiene alguna duda sobre las
especificaciones del modelo?
Paso 9: Cambie el valor del inventario inicial para permitir que se produzcan maquetas durante las 8 horas.
En lugar de que las materias primas estén disponibles para todo el período de 8 horas al principio de la
simulación, las materias primas han de llegar cada dos horas, empezando en 0. ¿Cómo se modeliza esta
nueva situación en SIMIO?
Paso 1: Tome algunas estadísticas sobre los niveles de inventario para las tres materias primas a lo largo de
un día: SubA, SubB, y Connectors. Dado que el inventario es una estadística basada en el tiempo, hay
Paso 3: Implementemos ahora un sistema de reposición en el que un operario aparece por la estación de
maquetas cada dos horas, empezando en 0, y rellena stock de SubA, SubB, y Connectors hasta un nivel
prefijado.
Paso 5: Utilizando la sección Definitions→Elements, añada un temporizador, TIMER, que lanzará un evento
basado en un intervalo de tiempo (un “timer event” es una interrupción en la simulación que permitirá
que un proceso se ejecute).
Ejecute el temporizador en 0.0 (la propiedad Time Offset debe ser 0) y debe activar un proceso cada
2 horas (Time Interval debe ser 2).
Llame StockerArrives al temporizador.
SubA.QuantityAvailable = SubAOrderQty
SubB.QuantityAvailable = SubBOrderQty
Connectors.QuantityAvailable = ConnOrderQty
El ejemplo anterior asume que el reponedor llegará exactamente cada dos horas y subirá el nivel de stock
hasta el límite establecido. Sin embargo, la compañía desea implantar una filosofía de producción similar al
Just-In-Time (JIT). Tienen un proveedor que tiene un almacén situado muy cerca de la planta y que
responderá a los pedidos rápidamente. La compañía ha implantado un sistema de monitorización tal que
cuando un pedido hace que el inventario baje por debajo de un límite, se lanza un pedido al proveedor que lo
ha de atender en 1 hora.
Paso 1: Guarde el modelo con su propio nombre. Tiene que borrar ahora el temporizador StockerArrives y
el proceso RespondToTimerEvent o deshabilítelo cambiando el valor de la propiedad Initially Enabled
a False, utilizando la propiedad “General” del temporizador, TIMER.
Paso 2: Añada un nuevo sumidero, SINK, InventoryLevel. Posiciónelo debajo de la estación que fabrica la
maqueta.
Paso 3: Vaya a la pestaña “Definitions” y añada tres elementos controladores, MONITOR, MonitorA,
MonitorB, y MonitorC, utilizando la sección “Element”. Un elemento controlador puede ser utilizado
para monitorizar el valor de una variable de estado cuando ésta cambia su valor o cuando el valor cruza
un límite. Las propiedades de MonitorA se pueden ver en la Figura 8.10.
Paso 5: Añada tres Fuentes, SOURCES (suppliers), SupplierA, SupplierB, y SupplierC, que enviarán las
materias primas a la estación, como se muestra en la Figura 8.11.
35
SIMIO proporciona una etapa producir, Produce, que hace esencialmente lo mismo y otra consumir, Consume, con la que se
realiza una resta, pero la lógica utilizando una etapa Assign parece directa.
68 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 8.12: Incrementando la Cantidad Disponible
Paso 7: Repita el proceso para las otras dos materias primas al final de sus respectivos caminos.
Paso 8: En las propiedades del modelo, fije los valores iniciales de las materias principales SubA, SubB, y
Connectors otra vez en 250, 250, y 500, dado que la acción de reposición se activa convenientemente.
Fije los puntos de pedido y los tamaños de pedido en los valores incluidos en la Tabla 8.3.
Tabla 8.3: Punto de Pedido (Reorder Point) y Tamaño de Pedido (Order Quantity)
Materia Punto de Tamaño de
Prima Pedido Pedido
SubA 125 200
SubB 125 200
Connector 250 400
Paso 9: Añada seis etiquetas de estado, “Status Labels” utilizando la pestaña “Animation”, para que se
muestren las cantidades disponibles de cada uno de los tres niveles de materias primas disponibles:
SubA, SubB, y Connectors (Figura 8.13). Estas primeras tres etiquetas son simplemente texto, mientras
que las otras tres tendrán una expresión (Figura 8.14) para mostrar la cantidad disponible
QuantityAvailable.
Este es uno de los capítulos más interesantes en cuanto que ilustra cómo modelizar lo que se
considera un operación compleja compuesta no sólo por temas de inventarios, sino también por
conceptos relacionados con la cadena de suministros, que serán nuevamente explorados en el
Capítulo 12, Capítulo 22 y Capítulo 25.
Se han introducido otras capacidades muy valiosas en este capítulo que deberían ser ampliadas,
lo que haremos en capítulos futuros.
Como si fuera un ejercicio de modelización, ¿cómo construiría un modelo equivalente en otro
lenguaje de simulación?
Las variables continuas son variables cuyo valor puede cambiar durante la simulación (al contrario que las
variables discretas). Las variables continuas se conocen en SIMIO como variables de nivel, “Level State”–
véase “States” en la pestaña “Definitions”. Cuando se crea una variable de nivel, puede especificar también
el flujo, utilizando la propiedad Rate Value, así como su valor inicial, Initial State. Al contrario que las
variables discretas, DISCRETE STATE, las variables de nivel, LEVEL STATE, pueden cambiar de forma
continua en función de un ritmo.
Paso 1: Cree un nuevo modelo. Vamos a gestionar un simple tanque de gasolina, haciendo que cambia el
valor de su ritmo de llenado y/o vaciado. Asumiremos que el volumen del tanque puede variar entre 0 y
100 galones.
Paso 3: Cree un nuevo símbolo, TankSymbol, para asociarlo con el tanque (Project Home→New
Symbol→Create Symbol), y que se asemeje al mostrado en la Figura 9.1. El símbolo que representa el
interior es un cuadrado con una altura de 10 metros (la altura determina el contenido/nivel del tanque).
Añada un textura Gold Comb para asemejarlo al color de la gasolina.
36
Este ejemplo de un “tanque simple” ha sido elegido de los “SimBits” que proporciona SIMIO. Se le aconseja revisar a menudo los
pequeños modelos, Simbits, a medida que aprende SIMIO.
Paso 6: Añada dos elementos controlador, MONITOR: TankEmpty y TankFull. Estos controladores
detectarán si el valor TankLevel cruza los valores 0 y 100 respectivamente.
Paso 7: Para TankEmpty, fije sus propiedades como se muestra en la Figura 9.3.
37
Seleccione el objeto y elija los símbolos de la pestaña “Symbols”.
72 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 9: Cree un nuevo proceso para los dos disparadores del tipo On Event Process, y defínalos según la
Figura 9.5 y la Figura 9.6.38
Paso 11: El proceso que indica que el tanque está lleno, “TankFull_OnEventProcess”, se activa
cuando el tanque llega a su nivel máximo. Las etapas del proceso son, entonces, parar de llenar, esperar a
que llegue demanda, y empezar a vaciar (Figura 9.6).
Paso 12: Finalmente, tenemos que tener cuidado con la altura del tanque en la animación. Lo haremos
en el proceso que se ejecuta al iniciar la simulación, “OnInitialized”. Utilizando la pestaña “Processes”,
seleccione OnInitialized del desplegable “Select Process”. La etapa ejecutar, Execute39, hace que se
inicialice “TankEmpty_OnEventProcess” y empiece el tanque a llenarse. La etapa Delay hará que el
proceso se pare durante un minuto y la etapa Assign fija la altura Tank.Size.Height en
TankLevel/10 (Figura 9.7).
38
Puede o bien crear el proceso aquí para que responda al evento generado por MONITOR o bien puede crear un proceso genérico con
la propiedad Triggering Event fijada en dicho evento, TankFull.Event.
39
La etapa Execute iniciará cualquier proceso que haya sido definido.
Paso 13: Para que el nivel se muestre durante la animación, el indicador Current Symbol Index de la
sección “Animation” del Tank, debe ser fijado en 0, por lo que el proceso durante la inicialización,
“OnInitialized” se usa para especificar el cambio de altura. Seleccione el tanque Tank y un símbolo
adicional, y fije la propiedad Current Symbol Index en 0.
Paso 14: Para completar la animación, añada tres etiquetas de estado, Status Labels, en la pestaña
“Animation” y etiquetas de texto, Floor Labels (Text) (Figura 9.8). Las expresiones correspondientes
son, respectivamente, TankLevel.Rate, TankLevel, y Tank.Size.Height.
Etiquetas de Etiquetas de
Estado Texto
40
En la vista 3D, use la tecla shift para mover el medidor y colocarlo justamente encima.
74 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 9.10: Añadiendo un Medidor Circular al Nivel del Tanque
Paso 17: Guarde el modelo y ejecútelo mientras observa las etiquetas de estado y los gráficos.
Cambie a 3D para ver cómo sube y baja el contenido del tanque.
Una gasolinera tiene 4 surtidores con el mismo tipo de gasolina. Todos los surtidores se abastecen del mismo
tanque. Los coches que llegan pueden entonces acceder a cualquier surtidor. Si el tanque se vacía por debajo
de 100 galones, los surtidores se cierran, aunque finalizan las operaciones en curso. Cualquier coche en
espera continuará en la fila, pero los coches que llegan nuevos se irán. Un camión aparece de vez en cuando
a reponer gasolina. Llena el tanque (10000 galones), y los surtidores se vuelven a abrir.
El problema se puede atacar desde distintos puntos de vista. Una variable continua se puede utilizar para
modelizar el tanque, y los coches y el camión son los que van cambiando los flujos de entrada y de salida al
tanque. Los vehículos serán entonces nuestras entidades activas. La cantidad que repostan los coches en
galones sigue una distribución Triangular (4, 9.5, 25). El flujo de llenado de los coches en galones por hora
es Triangular (100, 125, 175). El camión llenará el tanque a 20000 galones por hora.
Paso 1: Modificaremos el tanque modelizado en la sección anterior. Añada dos fuentes, SOURCES, un
servidor, SERVER, tres sumideros, SINKS y dos entidades, MODELENTITIES, denominadas Cars y
RefillTrucks (Figura 9.11). Los coches Cars llegan según un modelo exponencial de media 1.5
minutos, con la primera llegada en 0.1, mientras que los camiones RefillTrucks llegan con una
separación en horas según una distribución uniforme entre 6.75 y 8.25. Use conectores, CONNECTORS,
para unir los objetos.
Paso 3: Especifique el valor inicial, Initial State Value, de la variable de nivel, “LEVEL STATE”, denominada
TankLevel como 100.
Paso 4: Modifique los dos controladores, MONITOR, que vigilan el tanque y cree eventos que determinen que
el tanque está lleno o vacío. Cambie la propiedad de valor límite, Threshold, de TankEmpty a 100 de
forma que nuestro tanque no se vacíe completamente, y el valor TankFull a 10000 galones.
Paso 5: Inserte un elemento estadística de estado, STATE STATISTIC, de nombre StatisticsTank. Este
elemento proporcionará una estadística basada en el tiempo sobre el nivel del tanque (inventario medio).
Paso 6: Para los coches (MODELENTITY), definamos sus estados. Seleccione MODELENTITY en el panel
[Navigation]. Incluya los dos siguientes estados que serán característicos de cada coche a su llegada.
Gasolina necesaria, GasNeeded, es una variable de estado discreta, “Discrete State”, con un valor
inicial, Initial State Value, de 0.
Ritmo o flujo de llenado, CarPumpingRate, es otra variable de estado discreta, “Discrete State”,
con un valor inicial, Initial State Value, de 0.
Paso 7: Cuando los coches dejan su fuente, defina un proceso que se dispara con el disparador “Exited” de
Output@scrCars como se muestra en la Figura 9.12, para asignar las características al coche.41
41
A lo largo y ancho de este ejemplo utilzaremos la etapa Assign en vez de las asignaciones de estado, Assignments, incluidas en los
objetos. Las etapas Assign son más generales puesto que las asignaciones sólo están disponibles en la entrada y la salida de un
objeto.
76 Modelización y Simulación: Libro de Prácticas con SIMIO
La etapa Assign garantiza con las variables de estado siguientes que el flujo es negativo.
ModelEntity.GasNeeded = Random.Triangular(4,9.5,25)
ModelEntity.CarPumpingRate = -Random.Triangular(100,125,175)42
-ModelEntity.GasNeeded/ModelEntity.CarPumpingRate
La expresión toma en consideración la cantidad total de gasolina necesaria dividida por el flujo posible
de llenado. El signo negativo denota que el ritmo de llenado es negativo. Asegúrese que la propiedad de
capacidad inicial, Initial Capacity, de la estación SrvPumpGas se fija en 4 para indicar que hay sitio
para cuatro coches.
Paso 9: Si los surtidores están encendidos, los coches serán dirigidos hacia los surtidores, y si están apagados
se mandarán directamente al sumidero SnkCarsNoGas. Los pesos de los caminos que salen de las
fuente se definen como sigue para garantizar que un camino tenga un peso de 1 y el otro de 0.
Para la conexión hacia SnkCarsNoGas, fije el peso, Selection Weight, como 1 – PumpOn.
Para la conexión hacia SvrPumpGas, fije el peso, Selection Weight, como PumpOn.
Paso 10: Todos los lenguajes de simulación utilizan eventos y en SIMIO el usuario puede definir los
suyos propios. Utilizando la pestaña “Definitions”, añada un nuevo evento, EVENT, de nombre
EvntStartPumps, que permitirá que las entidades esperen a que los surtidores estén encendidos otra vez
después de que fueran apagados.
Paso 11: Considere lo que sucede cuando el camión llega (Figura 9.13). El camión apagará los
surtidores y empezará a llenar el tanque con una velocidad de 20000 galones por hora. El camión seguirá
llenando hasta que el tanque esté lleno (cuando TankFull alcance el límite). Utilice el disparador
“Entered” en el nodo de entrada de SnkTankLeaves (cuando el camión entra en el sumidero
correspondiente).43
42
Un flujo negativo implica la salida de gasolina del tanque y uno positivo llenado del tanque.
43
Es necesario invocar este proceso después de que el camión abandone el nodo de salida de la fuente para que se pueda calcular el
tiempo que está el camión en el sistema. Si el proceso se invoca antes de que salga de la fuente, el tiempo en el sistema no se
actualiza.
Paso 14: Haga el proceso correspondiente a cuando el tanque se queda vacío, utilizando el
controlador TankEmpty (Figura 9.18). Elimine las dos últimas etapas, dejando sólo la etapa Assign
que apagará los surtidores (PumpOn = 0.0) y cambie la velocidad a 0 (TankLevel.Rate =
0.0).
Paso 16: Cuando el evento EvntStartPumps se dispara, el camión que está esperando para que se
acabe el llenado se activa, lo mismo que los coches que están en espera.
En el modelo anterior se asumía que cuando el camión llegaba y se apagaban los surtidores, los coches
seguirían esperando a que se volvieran a encender. Modifiquemos el modelo de forma que todos los coches
que están esperando abandonen la fila y se vayan.
Paso 1: Cuando el camión llega, los coches que están esperando han de ser sacados de la fila de entrada de la
estación SrvPumpGas. Cuando se apague el surtidor, añada una etapa Search, que busque una
colección de objetos en una tabla, una lista, una instancia de un objeto, una fila, así como objetos
apresados por el padre o por objetos asociados. En este caso, fije la colección, Collection Type, a
“QueueState”, y el nombre de la fila, Queue State Name, a SrvPumpGas.AllocationQueue, por
lo que se buscarán coches en esa fila (Figura 9.20).
Paso 2: La búsqueda ha de encontrar todos los coches que están esperando, por lo que debe fijar la propiedad
del límites de entidades, Limit, en infinito, Infinity. La condición de casamiento, Match Condition,
permitirá que se busque ciertos objetos. Se podía haber dejado en blanco en este caso para que
devolviera un lista con todos los coches. Sin embargo, si elegimos caminos para unir objetos y un coche
estuviera en el camino y llegara a la vez que llega el camión, podría haber un coche que hubiera
accedido a un surtidor y estuviera en el estado espera para que el surtidor arrancara.
Figura 9.20: Haciendo que Abandonen Todos los Coches que están en Espera cuando se Apagan los
Surtidores
Paso 4: Añada un sumidero, SINK, denominado SnkCarsRenege, que ayudará a obtener estadísticas de los
coches que abandonan y se retiran.
Paso 5: Incluya un nodo, Set Node, que identifique la fila de entrada de SnkCarsRenege,
Input@SnkCarsRenege, como el nodo al que se envían los coches que abandonan. Hágalo con una
transferencia, Transfer, desde la operación actual hasta ese nodo.
Paso 6: Guarde el modelo y ejecútelo, observando qué sucede cuando llega el camión.
Pregunta 8: ¿Abandonan los coches que están esperando (es posible que tenga que mirar en los
resultados)?
En el modelo anterior, los coches que estaban esperando en el surtidor abandonaban la gasolinera cuando los
surtidores se apagaban. Los coches que estaban ya obteniendo gasolina del surtidor, seguían llenado el
depósito, y después se iban. Ningún otro coche debía ser enviado a los surtidores mientras están apagados.
Supongamos ahora que queremos que se interrumpa el suministro incluso para los coches que están en
operación. Estos coches dejarán el sistema utilizando también la misma salida, EXIT, SnkCarsRenege.
Paso 1: Para interrumpir el proceso de llenado, incluya una etapa interrumpir, Interrupt, antes de la
etapa Search (Figura 9.21). Esta etapa conecta los coches que han sufrido el parón con Set Node,
que había sido utilizado previamente para forzar a que los coches usaran el mismo sumidero
correspondiente a los coches que abandonan el sistema.
Pregunta 11: ¿Cuántos coches utilizaron el sumidero de abandonos durante las 48 horas de simulación?
Hasta ahora, seguro que ha cometido algún que otro fallo. SIMIO advierte de algunos de estos fallos. Sin
embargo, hay muchos otros que pasan sin que SIMIO lance ningún mensaje de advertencia o error. Quizás
sólo advierta que las entidades no se movían como esperaba. O quizás las estadísticas no parecían las
correctas. Podemos catalogar estos errores como lógicos. El modelo puede ser un modelo válido, SIMIO y
ser ejecutado sin errores, pero puede no estar funcionando como debiera.
En la pestaña “Project Home”, se encuentra la sección “Windows” que incluye ventanas para perseguir un
valor, “Trace”, mostrar errores, “Error”, vigilar una variable, “Watch”, o buscar algo, “Search”. Sólo esta
última ventana, “Search”, puede ser utilizada directamente para buscar lo que desee. La ventana “Error” se
activa cuando SIMIO detecta un error.
Paso 1: En la pestaña “Run”, haga clic en “Model Trace” y advierta que la ventana correspondiente se abre.
Si ejecuta la simulación haciendo clic en el botón “Step” de la sección “Run”, verá que se ejecuta cada
paso de la simulación.
Paso 2: Haga clic en “Step” varias veces. Se describe la información sobre la hora, Time, la entidad, Entity,
el objeto, Object, el proceso, Process, la ficha, Token, la etapa, Step, y la acción, Action. ¡Es mucha
información!44
Paso 3: Puede hacer clic con el botón derecho en una línea concreta así como filtrar por objeto o proceso.
Pregunta 12: Si en la hora 0.0 llegan un camión y un coche, ¿cuál llega primero?
Pregunta 13: Si en la hora 0.0 llegan un camión y un coche, ¿qué condición es necesaria para evitar que el
coche se aprovisione con gasolina?
Paso 4: Haga clic con el botón derecho en SnkCarsWithGas e introduzca un punto para que el modelo se
pare, breakpoint. Deje funcionado la lupa, Trace.
Paso 5: Haga clic con el botón derecho en SnkCarsWithGas y elimine el punto de parada, breakpoint. En la
pestaña “Run”, pare y resetee. Haga clic con el botón derecho en SnkTankerLeaves y seleccione
44
La información se vuelca automáticamente en un fichero con extension CSV, que se almacena en el mismo directorio que donde se
guarda el modelo. Se puede abrir con Excel para su análisis. Recomendamos utilizarlo para buscar y filtrar la información.
82 Modelización y Simulación: Libro de Prácticas con SIMIO
vigilar, “Watch”. Cambie la duración de la repetición a 24 horas y ejecute prestando atención a la nueva
ventana.
Paso 6: Desactive la ventana watch de SnkTankerLeaves y haga clic en la pizarra, “Open Dashboard
Window”, del objeto SrvPumpGas. Haga que la pizarra sea lo suficientemente grande como para verla
entera. Ejecute el modelo, pero párelo, Pause, de vez en cuando y ejecútelo paso a paso, “Step”.
Pregunta 20: Incremente la llegada de coches (tiempo entre llegadas de 2 minutos) de forma que haya más
actividad en la pizarra. ¿Aparece ahora el gráfico con los contenidos de la fila de entrada,
InputBuffer.Contents?
Paso 7: Algunas veces, incluso las numerosas ventanas no son suficientes. Una forma interesante para ver
cómo cambian las variables de estado para las entidades a medida que se mueven por el sistema, es
utilizar una etiqueta de estado, “Status Label.” Seleccione el símbolo Cars y en la pestaña “Symbols”
seleccione “Status Label”. Cuando hace esta selección, el cursor cambia a una cruz, y puede colocar un
rectángulo cerca de los símbolos cuyo contenido es una expresión. Fije la propiedad Expression asociada
a STATUS LABEL con el valor de la variable de estado GasNeeded.
Paso 8: Ejecute el modelo de cero y durante un rato. Párelo y ejecútelo paso a paso.
Paso 9: Puede añadir y mostrar otras expresiones como etiquetas de estado para las entidades o para otros
objetos.
Las variables continuas en SIMIO pueden ser muy útiles, aunque los cambios de velocidad
(segunda derivada) son constantes. La modelización de estos cambios es más flexible en Arena
ya que permite introducir sistema de ecuaciones diferenciales.
El uso de los “Simbits” no debe ser infravalorado. Contienen numerosos ejemplos de enfoques
muy útiles sobre ciertos temas clave.
Se han introducido los conceptos de abandono e interrupción en este capítulo. El abandono de
una fila permite que las entidades se muevan o sean destruidas. Los procesos también pueden ser
interrumpidos. Estas características no se usan a menudo, pero cuando son necesarias, son muy
valiosas. Advierta también que la modelización se consigue utilizando procesos, no a través de
especificaciones adicionales y precisas sobre objetos, como suele suceder en otros lenguajes de
simulación. El enfoque dota de una considerable flexibilidad al usuario.
Las posibilidades de detección de errores en SIMIO son amplias. Cuando se combinan con la
animación, los comandos trace, breakpoint, watch, y dashboard window, pueden proporcionar el
detalle necesario sobre el comportamiento del modelo de simulación.
Una nueva clínica de cuidados intensivos de urgencia acaba de ser abierta y a los gerentes les gustaría
analizar su operativa, para asegurarse de que sus clientes no esperan demasiado a la vez que se determina la
plantilla óptima en cuanto a número. Cuando un cliente llega, se da de alta en la ventanilla de la
recepcionista, quien verifica que toda la información es la correcta. Después, espera a que uno de los cuatro
médicos le atienda. Finalmente, los clientes pagan sus facturas al contable y les dan el alta.
Todos los pacientes caminan a una velocidad constante de 4.5 kilómetros por hora. Hay una distancia de 5
metros desde la puerta tanto a la ventanilla de recepción como al contable, y 25 metros desde la sala de
espera hasta las salas. Se observa que los pacientes llegan cada 6.5 minutos. Cada paciente tarda entre 1 y 3
minutos en registrarse y entre 3 y 6 minutos en darles el alta. El tiempo de consulta varía entre 12 y 30
minutos, con un valor más frecuente de 18 minutos. A día de hoy, los médicos pueden atender a cualquier
paciente.
Sección 10.1: Usando una Única Operación para Modelizar Múltiples Recursos
La forma más simple de modelizar la clínica es la utilización de servidores para cada actividad.
Una entidad, MODELENTITY, denominada Patients, una fuente, SOURCE, ScrPatients, una estación
de recepción, SERVER, SrvReceptionist, una estación de atención al paciente, SERVER, SrvMD, una
estación de pago, SERVER, SrvClerk, y un sumidero, SINK, SnkExit. Advierta que los nodos de
entrada y salida se han posicionado de forma que la presentación visual sea más atractiva.
Conecte los objetos con caminos, PATHS. La distancia entre la fuente de pacientes, ScrPatients, a la
recepción, SrvrReceptionist, es 5 metros y las distancias desde y hasta las salas, SrvMD, es de 25
metros.
La entidad, MODELENTITY, Patient, camina con una velocidad constante de 4.5 km por hora o 4500
metros por hora, velocidad que debe ser introducida en la propiedad Initial Desired Speed.
La recepcionista tarda en registrar entre 1 y 3 minutos, mientras que el contable tarda entre 3 y 6
minutos. Cada médico tarda entre 13 y 30 minutos, con un valor más habitual de 18 minutos.
Pregunta 1: ¿Qué distribución se debe utilizar para el tiempo de proceso o de atención, Processing Time,
de los médicos, SrvMD?
Paso 2: Será beneficioso indicar visualmente cuándo un médico está ocupado y trabajando haciendo que el
icono correspondiente se vuelva de color verde. Añada un símbolo adicional haciendo clic en SrvMD y
luego en el botón Add Additional Symbol. Advierta que existen dos símbolos activos ahora (con etiquetas
0 y 1) como se muestra en la Figura 10.2. Asegúrese de que se selecciona el símbolo de código 1.45
Cambiando de
Color
Figura 10.2: Añadiendo y Quitando Símbolos, así como Editando Dibujos y Colores
Podríamos haber añadido símbolos adicionales para indicar el número de médicos que están trabajando.
Paso 3: Cuando todos los médicos, SrvMD, están ociosos, se debería ver el símbolo gris (código 0),
mientras que el símbolo verde corresponde a la situación en que alguno de los médicos está trabajando.
Por defecto, la expresión lógica que está programada en la sección Animation de algún servidor, SERVER,
en indicador de símbolo, Current Symbol Index, es (SrvMD.Capacity.Allocated > 0). Cuando
no se ha asignado ninguna capacidad, la expresión será evaluada como falsa y se mostrará el símbolo
correspondiente al valor 0. Si algo de capacidad se ha asignado, la expresión se evalúa como verdadera y
se mostrará el símbolo con indicador 1.
45
También puede cambiar el símbolo del dibujo además de cambiar el color o la textura. Use el botón Remove Symbol para eliminar
el símbolo selecionado y se reordenarán el resto de símbolos.
Fila de
Contenidos
en Proceso
Pregunta 3: ¿Cuál es el tiempo total que un paciente tiene que esperar para esperar a que un médico le
atienda, así como el número medio de pacientes en espera?
Pregunta 5: ¿Por qué sería más apropiado utilizar cinco repeticiones de 8 horas en vez de una seguida de
40 horas (es un tema tanto estadístico como computacional)?
A menudo, las operaciones (ya sean máquinas, gente u otros recursos) fallan (roturas, excepciones...), lo que
necesita ser incluido en el modelo. Estas situaciones pueden ser modelizadas utilizando la sección sobre la
lógica de fiabilidad, “Reliability Logic”, incluida en operaciones, SERVERS, estaciones de trabajo,
WORKSTATIONS, combinadores, COMBINERS, separadores, SEPARATORS, recursos, RESOURCES, y otros
operarios, WORKERS.
Como parte de su trabajo habitual, la recepcionista recibe y atiende llamadas de teléfono que requieren su
inmediata atención. De media, se recibe una llamada cada 30 minutos (Exponencial). Estas llamadas duran
entre 1 y 6 minutos, con una moda de 3 minutos.
46
Una operación tiene tres estaciones, STATIONS, (InputBuffer, Processing, y OutputBuffer), cada una con su cola asociada de
contenidos, Contents, en donde se almacenan las entidades que están en la estación.
86 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 1: Las opciones sobre cómo introducir fallos se encuentran en la propiedad “Reliability Logic” del
objeto SERVER. En SIMIO, se pretende que el concepto de fallo se use para cualquier tiempo de parada,
excepción, o interrupción no modelizada. Existen 4 tipos de fallos que se pueden especificar, dos de los
cuales se basan en sucesos y los otros en tiempo.
Paso 2: En el caso de las llamadas, es apropiado utilizar un fallo de los basados en el tiempo, “calendar time
based failure”. En tiempo entre fallos, Uptime Between Failures, incluya la expresión
Random.Exponencial(20) minutos y en el tiempo de reparación, Time to Repair, la expresión
Random.Pert(1,3,6 ) minutos como se aprecia en la Figura 10.5. Nota: la operación se parará de
inmediato cuando el fallo ocurre.
Paso 4: Es necesario modificar la propiedad Current Symbol Index e incluir el nuevo símbolo para que sea
usado cuando la operación entra en modo fallo. Cada uno de los objetos que puede incluir lógica sobre
fiabilidad tiene un elemento FAILURE, de nombre Failure. El elemento FAILURE tiene varias funciones
(véase la ayuda de SIMIO). Podemos usar la siguiente expresión que tomará el valor 1 (Verdadero,
“True”, rojo) cuando falla y 0 (Falso, “False”, Gris) en caso contrario.
SrvReceptionist.Failure.Active>0
Paso 5: Cambie el tiempo entre fallos y el tiempo de reparación SvrReceptionist para comprobar que el
modelo funciona como debe.
Pregunta 7: Cuando se ejecuta el modelo, ¿cambian como deben de color las operaciones?
Paso 7: Suponga que también hay llamadas de teléfono que interrumpen la consulta de los médicos. Añada
entonces un tercer símbolo a usar con SrvMD, de forma que haya tres símbolos (0, 1, y 2).
Paso 8: Se necesita modificar la propiedad Current Symbol Index de SvrMD para usar el nuevo símbolo, 2,
cuando se para por la llamada. La siguiente expresión valdrá 0, 1 o 2 utilizando la función SI, If, dentro
del objeto MATH.
Otra forma de modelizar la misma expresión es usar una nueva sentencia matemática como se muestra
más abajo. Si la operación no ha fallado, tomará el valor 0 o 1 como antes, y si falla, el valor 2 o 3. Si el
valor es mayor que el último indicador, se seleccionará el símbolo con el indicador más grande.
Paso 9: Asuma que las llamadas de teléfono a los médico llegan cada 6 horas y su duración está entre 40 y
60 minutos, y lo típico es 55 minutos. Modifique la propiedad “Reliability Logic” de SrvMD.
Paso 10: Ejecute el modelo de simulación (puede que necesite cambiar el tiempo entre fallos para que
llegue una llamada y el icono cambie de color).
Pregunta 8: ¿Cuál es el grado de utilización media de los médicos ahora, así como el tiempo medio de
fallos?
Paso 11: Debe darse cuenta que cuando hay una llamada, se interrumpe la capacidad de la operación,
de todos los médicos. Este tipo de fallo puede modelizar otro tipo de problema, como un fallo eléctrico.
Sin embargo, no es el tipo de fallo deseado en nuestro modelo. Si la capacidad fuera 1, en cambio, sí se
espera que falle toda la operación. La forma correcta de modelizar fallos individuales se incluye en el
Capítulo 11.
Es bastante probable que la clínica no funcione de forma continua. Es más habitual que estén abiertas
durante 8 horas (desde las 11am hasta las 7pm). Es fácil ejecutar la simulación durante exactamente 8 horas,
utilizando la sección “Run Setup” de la pestaña “Run”. Pero suponga que queremos tener las puertas abiertas
desde las 11am a las 7pm, pero que se atenderán a todos los pacientes que hayan entrado durante ese
período. Esta salvedad hace preguntarse dos cosas sobre el modelo. Primero, ¿cómo paramos la llegada de
clientes a las 7pm?; segundo, ¿cómo paramos la simulación cuando se va el último cliente?
Paso 1: Hay varias formas de parar la llegada de pacientes después de 8 horas. Por ejemplo, los podemos
mandar a un sumidero después de las 7pm. Otra forma es crear un controlador, MONITOR, que cambia el
ritmo de llegada. Quizá sea menos obvio el uso de una expresión condicionada en Entities Per Arrival
del objeto SrcPatients, TimeNow < 8; está expresión valdrá 1 si el paciente llega antes de las 8 horas
de simulación, pero 0 después, eliminando toda llegada posterior.
Paso 2: Sin embargo, la forma más directa de parar una llegada es usar las condiciones “Stopping
Conditions” de una fuente, SOURCE, que apagarán el suministro en función de una de las siguientes
condiciones: especificando un número máximo de llegadas o entradas47, un tiempo máximo, o la
ejecución de algún evento. En nuestro caso, podemos especificar un tiempo máximo de 8 horas.
Paso 3: Si ejecuta el modelo con el cambio anterior, verá que los pacientes dejan de llegar, pero que la
simulación continúa enseñando, por ejemplo, los fallos. Para parar la simulación después de la salida del
último paciente, es necesario utilizar una estadística de conteo, TALLY statistic (sección
“Definitions→Elements→Statistics). Incluya una nueva estadística de conteo StopReplication que
utilice la siguiente condición como propiedad de parada, Stopping Condition:
47
Advierta que es número de llegadas y no de entidades.
88 Modelización y Simulación: Libro de Prácticas con SIMIO
Esta expresión dice que se acabará la simulación si es el último paciente en la clínica y el tiempo es
superior a 8 horas (las unidades de tiempo de la simulación son siempre horas).
Paso 4: Haciendo doble clic en el disparador “Destroying Entity” del objeto SnkExit, se creará el proceso
SnkExit_DestroyingEntity. Este disparador se ejecutará justo antes de que se destruya una entidad en el
sumidero, SINK. En este proceso, añada una etapa Tally que referencia el nombre de la estadística de
conteo, Tally Statistic Name, StopReplication, y recopile el tiempo actual, TimeNow, como su valor,
como se muestra en la Figura 10.6.
Paso 6: Recuerde que si hace varias repeticiones, cada una de ellas se parará en un momento diferente. Las
estadísticas finales, output statistics, se usan para recopilar estadísticas cuando la repetición se acaba.
El fallo de toda la capacidad de una operación en SIMIO es igual que en Arena/Siman. Mientras
que Arena/Siman incluye reglas, “rules”, además de liberar, “preempt”, para interrumpir un
proceso en ejecución, SIMIO permite al usuario crear sus propias reglas cuando ocurre el fallo,
como se ha visto en el Capítulo 9.
Usar condiciones arbitrarias con las que terminar una repetición y asociarlas con una estadística
de conteo, TALLY statistic, es diferente de Arena/Siman, que sólo presenta una posible condición
de fin de la ejecución.
En el Capítulo 10, si uno de los médicos recibía una llamada de emergencia, todos los médicos no trabajaban
dado que el fallo estaba asociado a la operación y no a los recursos. Para evitar esta situación, la clínica se
modelizará ahora utilizando cuatro operaciones diferentes y se asignarán los pacientes a cada una de ellas.
Paso 1: Modifique el modelo original de forma que incluya cuatro operaciones con las mismas propiedades
que la estación original SrvMD, salvo que cada una tendrá una capacidad de 1. Llame a cada estación
según el apellido del médico: SrvAllen, SrvBaker, SrvCharles, y SrvDuke (véase la Figura 11.1).
Copie y pegue la operación 3 veces de forma que se mantenga la información sobre fallos, símbolos
y tiempos de proceso, pero cambie sus nombres a SrvBaker, SrvCharles, y SrvDuke.
Cambie la expresión que figura en la propiedad Current Symbol Index de cada una de las
operaciones para que se incluya el nombre de la operación, por ejemplo,
Math.If(SrvAllen.Failure.Active,2,(SrvAllen.Capacity.Allocated >0))
Añada un nodo de transferencia, TRANSFERNODE, antes de las 4 operaciones y haga que los pacientes
se dirijan a este nodo utilizando un conector desde la recepción, SrvReceptionist, y conecte el nodo
con las cuatro operaciones, esta vez utilizando cintas transportadoras, CONVEYORS, (por razones que
luego veremos). Las cintas deben tener una capacidad infinita y una distancia, Logical Length, de 25
metros.
Paso 2: Guarde el modelo y ejecútelo durante un período 40 horas sin una condición de parada, observando
lo que sucede.
Pregunta 1: ¿Qué sucede a los otros médicos ahora, si uno de ellos recibe una llamada de emergencia?
Pregunta 2: ¿Eligen los pacientes la fila más corta (por qué o por qué no)?
Queremos ahora que los pacientes se asignen al médico con un menor número de pacientes en espera.
Paso 1: Vaya a la pestaña “Definitions” y cree una lista, NODE LIST, con el nombre ListStaff, y que
contenga la fila de entrada (Input) de cada uno de los cuatro médicos (Figura 11.2). Esto nos permitirá
seleccionar la fila que es más corta.
Paso 3: Fije la propiedad Selection Goal en el mínimo, Smallest Value, e incluya como Selection
Expression48 la siguiente, con la que se determina la suma del número que se está dirigiendo hacia la
operación y el número en espera, Contents de InputBuffer49, o siendo atendido en la estación
Processing50:
48
No confunda la propiedad Selection Expression con la de Selection Condition que se utiliza para incluir posibles nodos.
49
Los contenidos, Contents, de la estación de entrada, InputBuffer STATION, se usa para ubicar a las entidades que están
esperando a ser procesadas en la operación, SERVER.
50
Los contenidos, Contents, de la estación de procesamiento, Processing STATION, representan la ubicación de las entidades
que se encuentran siendo procesadas en la operación, SERVER.
Modelizando Múltiples Recursos con Múltiples Operaciones: la Clínica de Cuidados Intensivos bis 91
Candidate.Node.NumberRoutingIn +
Candidate.Server.InputBuffer.Contents.NumberWaiting +
Candidate.Server.Processing.Contents.NumberWaiting51
Esta expresión hará que las entidades elijan el médico en función del menor número en espera o en
proceso, o que están andando hacia la zona de espera.
Paso 4: Guarde el modelo y ejecútelo observando lo que sucede cuando llegan los pacientes.
Pregunta 3: ¿Seleccionan las entidades la fila más corta y qué sucede si un médico está atendiendo una
llamada?
Paso 5: Sin embargo, si un médico está atendiendo una llamada urgente, no se le deberían enviar pacientes.
Para realizar esta tarea, la propiedad Select Condition puede incluir sólo ciertos valores de una lista. La
expresión incluida en esta propiedad debe ser evaluada como verdadera antes de que el objeto nodo,
CANDIDATE NODE, sea considerado como adecuado. Cambiemos la propiedad de forma que se seleccione
sólo entre aquellos candidatos que no han fallado (con llamada).
Paso 6: Acuérdese que la función fallo activo, Failure.Active, tomará el valor falso si la operación
está activa, esto es, sin fallo. Si la operación no ha fallado, entonces es cuando hay que reconocerla como
candidata para recibir pacientes, lo que se realiza utilizando la siguiente expresión como se muestra en la
Figura 11.3.52
!Candidate.Server.Failure.Active
Figura 11.3: Especificando la Condición de Selección de Nodo para Excluir las Operaciones que no
están Activas
Paso 7: Guarde y ejecute el nuevo modelo, y observe qué sucede. Puede que sea necesario que reduzca el
tiempo entre llamadas (una cada minuto) para que vea cómo funciona la lógica de direccionamiento.
Pregunta 5: ¿Cuál es el tiempo total que un paciente tiene que esperar a un médico, así como el número
medio en espera, para cada uno de los médicos?
51
El objeto candidato, CANDIDATE, se utiliza para especificar funciones y variables de estado. SIMIO reemplazará el objeto
CANDIDATE con otro objeto de la lista cuando se determine el mínimo valor. Si existe un empate entre nodos, se seleccionará en
función del orden en que se encuentran en la lista.
52
Los operadores ! o Not se utilizan para obtener el complementario de una variable (! Falso es lo mismo que verdadero).
92 Modelización y Simulación: Libro de Prácticas con SIMIO
Pregunta 6: ¿Cuál es el tiempo en el sistema de un paciente?
Cada operación (médico) tiene su propia fila de espera en lugar de que exista una común, lo que suele ser
más habitual en este tipo de clínicas. Juntar estas filas en una sola plantea un problema de modelización que
se puede resolver de distintas formas (¿tiene alguna idea?).
Pregunta 8: ¿Cuándo se prefiere N operaciones con N filas en lugar de N operaciones con una fila?
Paso 1: Guarde el modelo en su forma actual. Modelizaremos una fila única haciendo que los pacientes
esperen en la fila de salida de la operación, SERVER, como se muestra en la Figura 11.4, hasta que uno de
los médicos finalice con un paciente y esté ocioso, y entonces le redirigiremos un paciente.
Utilizar
como Sala Conector
de Espera
Uso de cintas
transportadoras
Incluya un nuevo servidor, SERVER, con el nombre SrvWaitingRoom, y que hará las veces de sala
de espera.
Especifique que la sala tiene capacidad infinita inicial, valor “Infinity” en Initial Capacity, y un 0 de
Processing Time.
53
Recuerde que un conector, CONNECTOR, no ocupa espacio físico en el modelo, lo que hace que el nodo de transferencia y la sala de
espera ocupen el mismo lugar. Un buen enfoque en SIMIO es la utilización de nodos de transferencia, TRANSFERNODES, como
Modelizando Múltiples Recursos con Múltiples Operaciones: la Clínica de Cuidados Intensivos bis 93
Paso 2: Cambie el nombre de las cintas transportadoras a ConvAllen, ConvBaker, ConvCharles, y
ConvDuke54.
Paso 3: Seleccione cada uno de las cuatro cintas simultáneamente (usando la tecla Ctrl) y fije las
propiedades comunes a todos los objetos seleccionados (Figura 11.5).
Fije la velocidad deseada, Desired Speed, de cada una de las cintas en 4.5 km por hora (4500 m por
hora).
Permita que sólo una persona pueda ser transportada a la vez, porque sólo puede haber un paciente
asignado a cada médico.
Paso 5: Dado que el nodo de transferencia, TransferNode, y la fila de salida, “output buffer”, de la
operación SrvWaitingRoom se encuentran en exactamente la misma ubicación, mueva el nodo de
transferencia hasta situarlo justo encima del nodo de salida55.
Paso 6: En la mayoría de las salas de espera, la gente se suele colocar cerca de las paredes en lugar de en una
fila ordenada.
Borre la fila con la que se visualiza la estación de salida de un objeto servidor, SERVER, que por
defecto es la línea verde que se muestra a la derecha del objeto.
Seleccione la sala SrvWaitingRoom y añada de forma manual una fila para la visualización,
utilizando la sección, Symbols→Attached Animation, de los contenidos, Contents, de la estación
OutputBuffer, como se muestra en la Figura 11.6.
conexiones, de forma que si el modelo cambia, la lógica introducida no se pierde cuando se borran objetos (si hubiéramos borrado el
nodo de transferencia y conectado la sala de espera directamente con los médicos, toda la lógica de selección de médicos habría que
haberla desarrollado de nuevo).
54
Este paso ayudará a reducir los errors en los próximos pasos, haciendo que las cintas se asocien instintivamente con un médico en
particular.
55
Advierta que si lo selecciona, el diamante tiene ahora dos mitades, permitiendo así que pueda elegir tanto el nodo de transferencia
como la fila de salida.
94 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 11.6: Añadiendo una Fila para Animación
Dibuje una fila con forma de U haciendo primero clic en el punto superior derecho y luego
dibujando hacia atrás, haciendo clic en cada una de las esquinas que se quieran dibujar (Figura
11.7)56.
Uso: Sala de
Espera TRANSFERNODE
encima de
OUTPUTBUFFER
Figura 11.7: Añadiendo una Fila para Animación con una Forma Diferente
Paso 7: Existen muchas formas de modelizar la situación de forma que los clientes esperen hasta que haya
un médico completamente desocupado. Una de las más sencillas es utilizar un disparador “Add-On
Process Trigger” para bloquear la cinta haciendo que su velocidad sea nula, y volviendo a cambiarla una
vez que el médico vuelva a estar disponible57.
Paso 8: Dado que las cintas sólo van a transportar a los pacientes de uno en uno, deberán pararse cuando el
paciente llegue al final58.
Para crear un disparador, haga doble clic en la etiqueta “Reached End”, lo que creará un nuevo
proceso, que llevará como nombre por defecto, ConvAllen_ReachedEnd, así como activará la
pestaña “Processes”.
56
El primer punto de una fila representa la cabeza de la fila y es la razón por la que se dibuja hacia atrás, de forma que los pacientes
se situarán más cerca del nodo de salida.
57
Los dos tipos de camino, PATHS y TIMEPATHS, tienen un comportamiento similar en cuando a su velocidad, DesiredSpeed, pero esta
propiedad no bloquerá los caminos como sí lo hace con las cintas.
58
Al llegar al final, la lógica de transferencia hacia el nodo se ejecuta incluso si la cinta se ha parado y su última parte no ha llegado
al final del objeto.
Modelizando Múltiples Recursos con Múltiples Operaciones: la Clínica de Cuidados Intensivos bis 95
Figura 11.8: Fijando la Velocidad de una Cinta en Cero
Paso 9: Repita el paso anterior para las otras tres cintas, asegurándose que la variable de estado
correspondiente a la velocidad deseada se fije en 0. Para ser más eficiente, utilice el desplegable (Figura
11.9) para crear un nuevo proceso sin cambiar de la pestaña activa a la pestaña Processes59. Cuando haya
creado los tres disparadores, copie la etapa Assign anterior en cada uno de los procesos nuevos,
asegurándose de cambiar el nombre del objeto CONVEYOR por el correcto.
Paso 11: Es necesario que las cintas vuelvan a funcionar una vez que los médicos acaban con un
paciente. Una vez que uno de ellos deja la sala del médico, la velocidad de la cinta tiene que volver a se
4.5 km por hora.
Para cada uno de los servidores, SERVERS, cree un disparador “Exited” que se dispara cuando sale una
unidad, para que asigne un nuevo valor a la velocidad de la cinta, como se muestra en la Figura 11.10.
Recuerde que SIMIO convierte todo a horas y metros de forma interna, por lo que se necesita
especificar la nueva velocidad como 4500.
Pregunta 11: ¿Cuál es el tiempo total que un paciente tiene que esperar para que un médico le atienda, así
como el número medio de personas en espera tanto en la sala como delante de los médicos?
59
Podría haber creado un nuevo proceso mientras estaba en la pestaña Processes y después haberlo seleccionado del desplegable
correspondiente al disparador.
96 Modelización y Simulación: Libro de Prácticas con SIMIO
Pregunta 12: ¿Cuál es el tiempo total de un cliente en el sistema?
Modelizando Múltiples Recursos con Múltiples Operaciones: la Clínica de Cuidados Intensivos bis 97
Capítulo 12
Variables, gráficos SMORE, Optimización: Inventarios y
Cadenas de Suministros
Usando variables de estado discretas, temporizadores y estadísticas
Gráficos SMORE, selección de subconjuntos de escenarios
Ranking y selección, Optimización
Muchas empresas encuentran muchos desafíos a la hora de competir en los nuevos mercados globales.
Variaciones en la demanda, largos tiempos de respuesta y fluctuaciones en la cadena de aprovisionamiento
pueden resultar en excesivos niveles de producto terminado o en un pobre servicio al consumidor final.
Muchas compañías con tiempos de respuesta largos se ven forzados a implantar una política de fabricar para
almacenar (make-to-stock) de forma que sean capaces de responder a la demanda de los clientes de forma
rápida para mantener su cuota de mercado. Excesivos niveles de inventario llevan a costes elevados y alta
obsolescencia mientras que un nivel bajo puede ocasionar roturas de stock y bajos niveles de satisfacción en
los clientes. Así, el diseño y la optimización de la cadena de suministros se ha convertido en una prioridad
puesto que influye en la supervivencia de las compañías. El principal objetivo de cualquier cadena de
suministros es suministrar el producto cuando se requiere y con un precio que maximiza el beneficio. Para
que se consigan ambos objetivos, se necesita balancear el sistema con suficiente stock para satisfacer la
demanda, pero no demasiado como para afectar negativamente la rentabilidad.
La Figura 12.1 muestra una cadena muy simple de suministros de tres etapas en la que los clientes llegan a
una tienda (que bien pudieran ser varias) a comprar un producto. Las tiendas lanzan un pedido al centro de
distribución, en este caso coincide con el fabricante, que suministrará el pedido si lo tiene en stock. El centro
de distribución utiliza un modelo basado en el punto de pedido para lanzar pedidos al proveedor, el cual se
supone que tiene una fuente o almacén lleno. Se tarda entre 3 y 6 días en suministrar con camiones el
producto desde el proveedor hasta el fabricante.
Suministro
Perfecto Clientes
Pedido Pedido
de Materia
Prima
Fabricante
Proveedor Tienda
Centro de
Flujo de Distribución Flujo de
Producto Producto
Paso 1: Cree un nuevo modelo con dos sistemas separados, como se muestra en la Figura 12.2.
98 Modelización y Simulación: Libro de Prácticas con SIMIO
El primer sistema se usará para modelizar los pedidos que se hacen desde la tienda y que deben ser
procesados por el fabricante. Cree una fuente, SOURCE, de nombre SrcOrders, una operación,
SERVER, de nombre SrvOrderProcessing y un sumidero, SINK, de nombre SnkOrderExit. Incluya
también una entidad, MODELENTITY, que se llame Orders, y asegúrese de que son creadas por la
fuente SrcOrders. Use conectores, CONNECTORS, para unir todos los objetos, de forma que se
modelicen las transacciones EDI entre las tiendas y el fabricante.
El segundo sistema modelizará el flujo de productos desde el principio de la cadena hasta el final de
forma que se reponga el inventario en las operaciones correspondientes. Incluya dos servidores,
SERVERS, de nombre SrvSupplier y SrvDC, y un sumidero, SINK, de nombre SnkStore. Conecte
SrvSupplier y SrvDC con un camino TIME PATH en el que se emplea un tiempo entre 1 y 2 días,
siguiendo un modelo uniforme. Use un conector, CONNECTOR, para unir SrvDC y SnkStore, dado
que el modelo se centra en el centro de distribución.
60
Seleccione MODELENTITY en el panel [Navigation] y vaya a la sección Definitions→States para añadir la variable de estado.
61
La primera vez hay que escribir el nombre de la categoría, pero luego ya se puede seleccionar del desplegable correspondiente.
Pregunta 1: ¿Qué ventajas tiene utilizar propiedades y fijar su valor en este modelo?
Paso 5: En el modelo, incluya una variable de estado discreta, DISCRETE STATE, de nombre Inventory que
ha de representar el nivel actual de stock de un producto en el fabricante, y otra con nombre WIP que va
a representar la cantidad total que el fabricante va a pedir al proveedor. La propiedad Initial State Value
debe fijarse en 0 tanto para Inventory como para WIP.
Paso 8: El proveedor tarda entre 10 y 30 minutos, con una moda de 20 minutos en procesar cada producto,
por lo que la propiedad Processing Time debe tomar el valor:
Random.Triangular(10,20,30)*ModelEntity.OrderAmt.
Paso 9: Cuando un producto llega al fabricante DC, el lote entero debe ser empaquetado antes de que esté
disponible para ser mandado a las tiendas. La propiedad Processing Time del fabricante DC debe incluir
la expresión Random.Pert(1,2,5)*ModelEntity.OrderAmt.
Pregunta 2: ¿Cuántos pedidos se producen en ese período de tiempo y cuál es su tiempo medio en el
sistema?
Paso 1: Recuerde que la propiedad de nivel de inventario inicial (InitialInventory) fue especificada para
permitir que se puedan cambiar las condiciones de inicio. Dado que los valores por defecto de las
variables de estado no pueden ser propiedades de referencia, la variable de estado Inventory necesita ser
inicializada al comenzar la simulación mediante la ejecución del proceso “OnInitialized”. Incluya este
proceso utilizando el menú desplegable Processes→Select Process→OnInitialized. Incluya una etapa
Assign con el nuevo valor InitialInventory, como se muestra en la Figura 12.5.
Incluya una etapa Decide que comprueba si la cantidad que lleva el pedido es mayor que cero,
antes de continuar (Figura 12.7).
Añada una etapa Tally que actualizará TallySL con el valor igual a
Math.Min(1,Inventory/ModelEntity.OrderAmt)63.
Incluya una etapa Assign que actualizará Inventory al restarle la cantidad del pedido actual,
OrderAmt. Sin embargo, si Inventory es menor que la cantidad, la resta dará un valor negativo;
como no se permiten roturas de stock, se ha de incluir la expresión (Math.Max(0,Inventory-
ModerEntity.OrderAmt) como se muestra en la Figura 12.7.
Figura 12.6: Proceso para Cumplir con los Pedidos de las Tiendas
62
Se define como posición de inventario el nivel de inventario en stock más el nivel de inventario pedido pero no recibido.
63
Algunos podrán argumentar que este cálculo del nivel de servicio es de hecho un ritmo de llenado, pues si el inventario es mayor
que la cantidad del pedido, el 100% de la demanda se ha cubierto.
Figura 12.8: Etiquetas de Estado que Muestran el Nivel Actual de Inventario, el Nivel Medio y el Nivel
de Servicio
Paso 4: Guarde el modelo y ejecútelo (puede que necesite ajustar el factor de velocidad a 100 o simular sin
animación).
El modelo incluido en la sección previa era capaz de atender los pedidos de las tiendas, pero una vez que se
acababa el stock, no existía reposición desde los proveedores. El nivel de servicio era por tanto bajo. El
temporizador tiene que ser modelizado como para lanzar un pedido de reposición cada cinco días si el nivel
de inventario está por debajo del punto de pedido; ha de lanzar entonces un pedido al proveedor en función
del nivel máximo y del nivel actual de inventario, así como de la cantidad de los pedidos ya lanzados (WIP).
Recuerde que la posición de inventario se define como el inventario en curso más el número pedido pero no
recibido.
Paso 1: Fije el período de revisión. Cree un proceso que responda al temporizador TimerReview. Utilizando
la pestaña “Processes”, cree un nuevo proceso de nombre InventoryReview. Fije la propiedad
Triggering Event para que responda al evento TimerReview.Event, lo que hace que el proceso se
ejecute siempre que se dispara el evento del temporizador (Figura 12.9).
64
La etapa Create puede crear nuevos objetos o copias de los objetos asociados así como de los objetos padre.
La simulación se utiliza a menudo para mejorar el rendimiento de un sistema. ¿Se puede encontrar un valor
de las variables máximo inventario deseado y punto de pedido que mejore el rendimiento del sistema?
¿Puede SIMIO ayudarnos a resolver este tipo de pregunta? ¿Puede SIMIO ayudarnos en la búsqueda de un
sistema mejor? La respuesta es afirmativa.
Paso 2: Incluya 8 escenarios más haciendo clic en la pequeña caja que se encuentra en la última fila de la
tabla. Esta acción copiará todos los parámetros del escenario base. Entonces, cambie el punto de pedido
y el máximo nivel permitido de forma que complete un diseño factorial utilizando tres valores para el
punto de pedido (200, 300, y 400) y otros tres para el máximo nivel (600, 700, 800) como se muestra en
la Figura 12.12.
Figura 12.12: Primer Experimento con Diferentes Valores de Punto de Pedido y Máximo Nivel de
Inventario
Paso 3: Utilizando el botón Design→Experiment→Add Response, incluya tres nuevas variables de respuesta
que serán utilizadas (Figura 12.12) para seleccionar el mejor escenario en función de unos parámetros
dados (Tabla 12.4). Las dos primeras variables de respuesta son muy lógicas. En este modelo, parece que
ambas variables entran en conflicto: si el nivel de stock baja, también lo hace el nivel de servicio. La
65
Se pueden definer otras variables de control adicionales.
104 Modelización y Simulación: Libro de Prácticas con SIMIO
tercera columna convierte un problema multi-objetivo en uno con un solo objetivo. Si el nivel de
servicio sube y el inventario baja, la respuesta también baja. Los límites inferior y superior se utilizarán
para advertir que los valores están fuera de los límites estipulados66. En este caso, deseamos tener un
nivel de servicio superior al 90%.
Paso 4: La Figura 12.13 muestra los parámetros básicos del experimento, pudiéndose determinar el período
de calentamiento, warm up period, y el número de repeticiones por defecto67. En los gráficos SMORE y
la optimización, se mostrarán también el intervalo de confianza de la media así como los percentiles.
También tendrá que identificar cuál es la variable principal que servirá de base para los procedimiento de
ranking y selección así como para Optquest™ (siguientes secciones).
Pregunta 8: Según los valores obtenidos, ¿qué punto de pedido y qué máximo nivel parece que son los
mejores?
Sección 12.5: Usando Gráficos SMORE para Determinar los Mejores Valores
En la sección anterior, simplemente utilizamos la media de las 10 repeticiones para tomar la decisión. La
dificultad estriba en que la variabilidad de un sistema no está incluida cuando se elige el mejor escenario.
Las gráficos de medida del riesgo y el error de SIMIO, SIMIO Measure of Risk & Error (SMORE), ofrecen
la posibilidad de ver la variabilidad así como los intervalos de confianza. Muestran los principales
percentiles (la mediana o el percentil del 50%, así como los percentiles mayor y menor elegidos) y la media,
junto con su intervalo de confianza.
66
Los valores que no cumplen con los límites se muestran en color rojo.
67
El valor por defecto son 10 repeticiones, aunque realizar más hará que la confianza en los resultados aumente.
Figura 12.14: Gráficos SMORE del Nivel de Inventario Medio y del Nivel de Servicio Medio
Paso 2: Mirando a la variable principal, inventario/servicio, de la Gráfica SMORE (Figura 12.15), el
Escenario3 parece que es el mejor. Su gráfica, sin embargo, se solapa mínimamente con la del Escenario
9.
Pregunta 10: ¿Cuál es el escenario que debe ser estadísticamente seleccionado como el mejor de las tres
respuestas?
El modelo actual es bastante sencillo (compuesto sólo por dos variables y el modelo) y 10 repeticiones
parecen suficientes para elegir la mejor opción. Sin embargo, para utilizar los Gráficos SMORE se requiere
un juicio y una identificación. El procedimiento de ranking y selección le permite seleccionar cuál es el
mejor escenario. Una de las ventajas de SIMIO es que tiene incorporado el novedoso método de ranking y
selección basado en las investigaciones de Kim y Nelson (denominado “KN”)68.
Paso 1: Guarde el modelo y presione el botón Reset para borrar los resultados.
Paso 2: Elija de la sección Design→Add-Ins la opción “Select Best Scenario using KN”, lo que añadirá el
algoritmo KN al experimento (
Paso 4: Fije la propiedad de zona de indiferencia, Indifference Zone, en 5, lo que indica que una solución
puede considerarse como mejor que otra sólo si las soluciones difieren en más de 5 unidades. Dado que
el método de ranking y selección cambiará el número de repeticiones, la propiedad Replication Limit
especifica el número máximo de repeticiones a realizar.
68
S. Kim and B. L. Nelson, "A Fully Sequential Procedure for Indifference-Zone Selection in Simulation," ACM Transactions on
Modeling and Computer Simulation 11 (2001), 251-273.
Paso 6: Vuelva a ejecutar el experimento y advierta que el número mínimo de repeticiones se ha elevado a
10. El algoritmo KN requiere que al menos se realicen 10 repeticiones de forma que se detecte de forma
fiable diferencias entre escenarios.
Pregunta 11: Basándose en las diferencias apreciadas en la columna Inv/SL, ¿piensa que es necesario
realizar más repeticiones para encontrar diferencias mayores de 5 unidades?
Paso 7: El algoritmo KN ha seleccionado el Escenario3 como el mejor (es el único seleccionado), como se
muestra en la Figura 12.18. En el caso de modelos más complejos, se necesitarán más de 10 repeticiones.
El algoritmo KN que se ha usado en la sección previa ha ayudado a determinar el escenario óptimo a partir
de un conjunto predeterminado por el usuario. SIMIO dispone de una herramienta adicional, denominada
OptQuest™, que puede realizar optimización tradicional mediante la prueba de otros escenarios no
especificados. Permite además añadir restricciones tanto en las variables de decisión como en las de
respuesta.69
69
OptQuest es una herramienta que debe ser adquirida por separado.
108 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 1: A partir de la sección Project Home→Create, incluya un nuevo experimento, “Experiment”, de
nombre OptQuestExperiment, lo que abrirá una nueva ventana y creará el primer escenario.
Paso 2: Use el botón “Clear” para desactivar el procedimiento de selección de escenarios anteriormente
utilizado y seleccione “OptQuest for SIMIO”.
Paso 3: Añada las tres variables de salida utilizadas con anterioridad (Tabla 12.4).
Paso 4: Ya que el optimizador probará con valores distintos de las variables de control o decisión, hemos de
definir su dominio o rango factible. Seleccione los rangos apropiados así como sus incrementos para
favorecer la convergencia así como la calidad de la solución. Seleccione cada una de las variables de
control y fije sus valores según la Figura 12.19. Como puede apreciar, el nivel de inventario inicial no
está incluido en la optimización. Un incremento, increment, de 25 se ha elegido para las otras dos
variables para que el algoritmo seleccione valores en incrementos de 25.70
Figura 12.19: Fijando los Límites Superior e Inferior de las Variables de Decisión
Paso 5: Elija en la sección Design→Add-Ins “OptQuest for SIMIO”. Añadirá una sección de preparación en
las propiedades del experimento (Figura 12.20). El algoritmo utiliza un nivel de confianza para discernir
entre escenarios. El porcentaje de error relativo se expresa como un error de la media.
Paso 7: Ordene los escenarios de forma ascendente según la columna Inv/SL de forma que se vean los que
presentan un valor menor.
70
Puede que se consigan mejores soluciones con una mayor resolución (incrementos más pequeños). Sin embargo, esto puede afectar
la calidad de la solución. Si la resolución es menor, puede encontrar una primera buena solución rápidamente Una segunda
optimización alrededor del primer valor encontrado puede ayudar a encontrar una mejor solución.
Paso 8: Dado que OptQuest sólo ha usado 5 repeticiones, es posible que la variabilidad sea un problema.
Guarde los mejores 5 escenarios y borre el resto. Desactive OptQuest y seleccione el algoritmo para
seleccionar el mejor escenario. Asegúrese de que la variable de respuesta principal es Inv/SL. Utilice una
zona de indiferencia de 1. Ejecute el algoritmo KN.
Pregunta 14: ¿Qué mejores valores ha obtenido para el punto de pedido y el nivel máximo?
Pregunta 15: ¿Qué escenario o alternativa elige si quiere que el nivel de servicio sea por lo menos del
90%?
Paso 9: Para visualizar cuál es mejor que los otros, examine el gráfico de resultados con los cinco escenarios
(Figura 12.21). Tiene que seleccionarlos para verlos en el gráfico.
Una debilidad de la selección KN es que no considera restricciones ni en las variables de control ni en las de
salida. Aunque OptQuest sólo puede optimizar un único objetivo (como KN), tiene la capacidad de incluir
restricciones en sus valores. Existen dos clases de restricciones en OptQuest para SIMIO: restricciones en las
variables de control y restricciones en las variables de salida.
Paso 1: Consideremos para empezar un problema de optimización algo distinto, en el que deseamos
minimizar el nivel de stock siempre y cuando se mantenga el nivel de servicio por encima del 90%.
Podemos escribir este problema de forma más formal como:
Minimizar: AvgInventory
Paso 4: Añada como variables de respuesta el nivel de servicio y el inventario medio. Fije los límites para el
punto de pedido y el nivel máximo. Añada un valor mínimo exigido de 95 para el nivel de servicio. Elija
minimizar el nivel medio de inventario.
Paso 6: Ordene los escenarios de menor a mayor según la columna que incluye el inventario medio, de
forma que se puedan ver los escenarios con los mejores valores.
Pregunta 16: ¿Cuál parece ser el mejor valor para el punto de pedido y el inventario máximo si se
considera no sólo el nivel medio de inventario sino también el nivel de servicio?
Paso 7: Es instructivo examinar el gráfico de resultados (Figura 12.22) para ver cómo ha ido mejorando el
proceso de optimización.
Esta restricción sólo ha sido un ejemplo ilustrativo, y no se pretendía que tuviera sentido.
Este modelo sólo consideraba una posición de inventario en el fabricante. ¿Qué sucede si tiene
más de un centro de distribución, proveedor y/o tiendas? En un capítulo futuro, se creará un
objeto inventario que puede ser utilizado muchas veces.
El uso de la selección de subconjuntos permite encontrar varias soluciones.
Para un número grande de variables de control y de escenarios, el algoritmo KN de ranking y
selección facilita la elección estadística del mejor escenario.
OptQuest es un buen optimizador si se dispone de tiempo suficiente. OptQuest también estaba
incluido en Arena; sin embargo, los gráficos SMORE, la selección de subconjuntos, y el
algoritmo KN ofrecen una verdadera ventaja.
Una clínica veterinaria atiende a distintos tipos de animales. Como en el caso de la Clínica de Urgencias,
esta clínica intenta dar buen servicio utilizando los recursos de forma eficiente. Aunque la estructura de la
clínica veterinaria es similar a la de la clínica de urgencias, nos centraremos en las actividades que realizan
los veterinarios. Son veterinarios de nombre de pila Billy, Jim, Maisy, y Ellie. Esta clínica proporciona un
servicio más complicado que requiere de una forma de modelizar distinta a la incluida en el caso de la clínica
de urgencias.
Hay veces en las que se necesita disponer de distintos recursos, un veterinario y una máquina de rayos X,
antes de atender al paciente. También hay ciertas restricciones como que Jim es el único veterinario que
puede atender a las iguanas. El objeto SERVER no puede modelizar estos casos de forma fácil. Por ejemplo,
puede ser que sean necesarios tanto el veterinario como la enfermera para preparar un servicio, mientras que
la enfermera se basta por sí sola para acabar el servicio.
El objeto recurso, RESOURCE, es un objeto fijo con capacidad (como un TRANSFERNODE o un SOURCE, que no
se mueven por la red del modelo), y que puede ser apresado o liberado por otro. Es un objeto genérico que
puede ser usado para restringir el flujo. Los RESOURCES tienen también posibilidad de incluir información
sobre su fiabilidad así como la habilidad para ordenar estáticamente y dinámicamente las entidades que los
solicitan (por ejemplo, elegir a los pacientes críticos primero) y también son capaces de rehusar una petición
y mantenerse desocupado.
Paso 1: Cree un nuevo modelo fijo (pestaña “Project Home”) dentro del mismo proyecto de un capítulo
anterior o puede crear un nuevo modelo. Puede disponer de distintos modelos en el mimo proyecto, pero
sólo uno se podrá ejecutar a la vez, a no ser que se utilice uno dentro de otro.
Paso 2: Añada una fuente, SOURCE, de nombre SrcPatients, un servidor, SERVER, de nombre SrvVetClinic,
y un sumidero, SINK, de nombre SnkExit. Añada una entidad, MODELENTITY, de nombre Patients.
Conecte los objetos con caminos de longitud 30 metros71.
Los pacientes llegan según un modelo exponencial con un tiempo entre llegadas de 6.5 minutos.
Cada paciente tarda en ser atendido por un veterinario entre 10 y 30 minutos, con un valor más
habitual de 15 minutos.
Si selecciona el nodo de salida de la fuente SOURCE mientras que aprieta las teclas Shift y Ctrl, SIMIO le dejará dibujar uniones,
71
LINKS, sin que seleccione el objeto en la Standard Library. Una vez que los caminos, PATHS, han sido dibujados, seleccione
ambos y cambie la propiedad Drawn to Scale a “False” y la propiedad Logical Length a 30 metros.
Dado que los RESOURCES tiene la misma lógica de fiabilidad que los SERVERS, fije el mismo patrón
de llamadas de emergencias. Especifique el tiempo entre fallos, Uptime Between Failures, como una
distribución exponencial de media 6 horas y la expresión del tiempo de reparación, time to repair,
igual a Random.Pert(40,55,60) minutos, como se muestra en la Figura 13.1.
Figura 13.1: Lógica de Fiabilidad para Recibir Llamadas de Emergencia por un Veterinario
Como en casos anteriores, añada dos símbolos adicionales. Coloree el iris del símbolo número 1 en
verde, para mostrar cuándo está ocupado, y el número 2 en rojo, para mostrar cuándo está en fallo.
El símbolo 0 se mantendrá de color azul, lo que indicará que está ocioso.
En la sección “Animation”, dentro de la ventana de propiedades, cambie Current Symbol Index para
que refleje el estado del recurso, según la expresión:
Math.If(Billy.Failure.Active,2,(Billy.Capacity.Allocated > 0))
Paso 4: Copie el recurso Billy tres veces, con nombres Ellie, Jim, y Maisey respectivamente, para incluir al
resto de los veterinarios. Necesitará modificar Current Symbol Index para incluir el objeto RESOURCE
correcto, así como su estado, como se muestra en la Figura 13.2.
Paso 6: En este punto, podemos apresar un RESOURCE individual, pero nuestro modelo requerirá que se
seleccione entre los veterinarios disponibles. En la pestaña “Definitions”, cree una nueva lista, LIST of
OBJETOS, de nombre ListResources, y añada los cuatro recursos como se muestra en la Figura 13.3. Esta
lista se usará por los pacientes para seleccionar uno de los veterinarios.
72
El símbolo por defecto se asemeja a un ojo con un iris azul.
114 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 13.3: Creando una Lista de Recursos que Pueden ser Apresados
Paso 7: El modelo básico ha sido montado en base a recursos, RESOURCES; sin embargo, los pacientes,
necesitan apresar (pedir) un veterinario para que les atienda, y una vez hayan sido atendidos, deben
soltar al veterinario de forma que pueda atender a otro paciente. Los pacientes solicitarán un veterinario
cuando llegan a la clínica. Se han de utilizar entonces dos de los diez disparadores disponibles en el
servidor, SERVER.
Paso 8: El paciente necesita conseguir uno de los recursos disponibles antes de entrar en servicio (disparador
“Processing”). Para invocar este proceso “Processing”, seleccione en la ventana de propiedades “Add-
On Process Triggers” y haga doble clic en la etiqueta con la que se crea un proceso.
Paso 9: Dado que el paciente quiere apresar un recurso, incluya una etapa Seize: selecciónela de la lista de
posibles etapas y arrástrela entre los nodos Begin y End (Figura 13.4).
El editor Seize – Repeating Property Editor (véase Figura 13.5) aparecerá y permitirá que se
especifiquen tantos recursos como sean necesarios para empezar una operación. En este ejemplo,
especificaremos un tipo de recursos y fijaremos Object Type como “FromList”73, de forma que se
seleccione un recurso de cualquier lista. No queremos seleccionar un recurso que esté en fallo.
73
El Object Type en Seize puede ser “Specific”, “From List”, o “Parent Objeto”. La opción “Specific” le permite seleccionar un
recurso individual (por ejemplo, Jim) o un objeto que tiene capacidad (por ejemplo, Servers, Paths) o cualquier estación que esté
dentro de un objeto con capacidad. La opción “Parent Objeto” le permitirá conseguir capacidad de un objeto que está ejecutando un
proceso, por ejemplo, Processing STATION de una operación. En la opción “From List” se podrá especificar cualquier lista que
contenga un objeto que pueda ser solicitado.
Paso 10: Los pacientes pueden ahora conseguir un veterinario, pero una vez que un paciente acaba su
procesamiento, éste también debe ser capaz de liberar al veterinario. Hay dos disparadores posibles
(“Processed” o “Exited”). Incluya un nuevo proceso “Processed”, haciendo doble clic en la etiqueta con
la que se crea un proceso.
Incluya una etapa Release en el proceso entre los nodos Begin y End de forma que el paciente
pueda liberar al veterinario, como se muestra en la Figura 13.6.
El modelo anterior asumía que todos los pacientes pueden ser atendidos por todos los veterinarios. Sin
embargo, suponga que Billy y Masey tienen experiencia con pájaros mientras que Jim la tiene con iguanas,
pero si él está ocupado Ellie puede sustituirle. Los caballos y las vacas son grandes y necesitan ser atendidos
por dos veterinarios a la vez. Todos los demás animales (gatos y perros) pueden ser atendidos por cualquiera
de los veterinarios.
Paso 1: Cree una nueva tabla de datos, TableAnimals, que tenga una columna de tipo “String” para incluir
el nombre del animal, y otra de tipo “Real” que incluya el porcentaje de este tipo de animal en la clínica.
Los valores se muestran en la Tabla 13.1. Por ejemplo, el 25 por ciento son grandes.
Paso 2: Cree dos nuevas listas, ListBird y ListIguana, de forma similar a como se creó ListResources, para
indicar qué veterinarios pueden atender a los animales especiales (Figura 13.8 y Figura 13.9).
Figura 13.9: Símbolos Descargados de Google 3-D Warehouse: Dog, Cow, Bird y Iguana
Paso 4: El objetivo es asignar de forma aleatoria los tipos de animales y sus respectivos dibujos (colores)
según los porcentajes de la tabla. La asignación se debe realizar una vez que la entidad ha sido creada, o
Una de las ventajas de SIMIO es su habilidad para asociar una o más tablas, o filas de una tabla, con
una entidad. Una vez creado, hay que asignar a un paciente con una fila específica de la tabla
TableAnimals, y después con el símbolo correcto en función del valor de la columna “Animal
Type”. Incluya una etapa Set Table y otra Assign en el proceso según la Figura 13.10.
Figura 13.10: Determinando el Tipo de Paciente Asociando una Fila de una Tabla de Datos con una
Entidad
Especifique una fila de forma aleatoria utilizando el método RandomRow en función de los
porcentajes incluidos en la columna “PercentType” (Figura 13.11).75 También asegúrese que Object
Type en Advanced Options se especifica como “AssociatedObject”.76
Figura 13.12: Cambiando el Dibujo de una Entidad en Función de una Columna de una Tabla de
Datos
Paso 5: Guarde el modelo y ejecútelo para asegurarse de que se han creado los diferentes tipos de animales
según lo esperado. Pede que tenga que ajustar las filas de la animación en función de los tamaños de los
animales grandes.
Paso 6: Actualmente, todavía los pacientes, sin importar cuál es su tipo, apresarán un y sólo un veterinario.
Necesitamos añadir otro proceso para apresar y soltar recursos en función del resto de requisitos que se
han planteado (véase el flujograma incluido en la Figura 13.13):
74
Para invocar el proceso “Created”, abra “Add-On Process Triggers” en la ventana de propiedades de la fuente y haga doble-
click para crearlo.
75
Cualquier columna numérica puede ser utilizada para especificar una fila de una tabla aleatoriamente. Los números no tiene que
sumar 1 o 100. SIMIO sumará los valores de la columna y generará una fila en función de los porcentajes normalizados.
76
El objeto asociado, “Associated Object”, es el objeto representado por la ficha. En este caso, es la entidad o paciente. Las otras
opciones son “Token” para el que la ficha ejecuta el proceso y “ParentObjeto” que sería la fuente en la que se incluye el disparador.
77
Los tipos de animal se especificaron con valores entre 0 y 3 para coincidir con la numeración de los símbolos. La flecha verde
permite al usuario saber que se está referenciando una propiedad.
118 Modelización y Simulación: Libro de Prácticas con SIMIO
Si el pacientes es del tipo perro/gato o caballo/vaca, podemos elegir cualquier recurso, pero si
es un animal grande, hay que apresar dos recursos.
Si el paciente es un pájaro, es necesario elegir un veterinario de la lista ListBird.
Finalmente, si es una iguana, la elección se hace de la lista ListIguana.
False
True Consiguiendo
Si Paciente== Pájaro un recurso de
ListBird
False
Consiguiendo
un recurso de
ListIguana
Figura 13.16: Especificando una Expresión Basada en una Condición en una Etapa Decide
La segunda etapa Decide comprobará si el paciente es un pájaro. (Ayuda: copie el primer Decide
y péguelo en la rama False; cambie la expresión a (TableAnimals.Type==2)).
Copie la etapa Seize tanto en True como en False de la segunda etapa Decide. Tendrá que
cambiar la lista en la que se busca la información (ListBird y ListIguana respectivamente).
La primera etapa Seize ya puede apresar cualquier veterinario (ListResources). Sin embargo, por
defecto, sólo apresa uno. Se necesita apresar 2 cuando se está atendiendo animales grandes. Hay
varias formas de incluir esta lógica. Como el tipo de los animales gatos/perros es 0 y de
vacas/caballos es 1, se puede añador 1 al tipo para obtener un valor de 1 ó 2. En la propiedad
Number of Objects, incluya una expresión como la que se muestra en la Figura 13.17.
Número de
Recursos
Figura 13.17: Especificando una Expresión para Determinar el Número de Recursos a Conseguir
Paso 7: Guarde su modelo y ejecútelo. Puede que tenga que experimentar con los porcentajes para
asegurarse de que los animales están siendo atendidos por los veterinarios según lo esperado. La Figura
13.18 muestra una vaca siendo atendida tanto por Billy como por Jim.
78
La expresión (TablaAnimals.Type < 2) se podría haber especificado también como (TableAnimals.Type == 0 ||
TableAnimals.Type ==1) donde || es el operador lógico Or (O).
120 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 13.19: Soltando un Veterinario para que se Incluya en el Conjunto Adecuado
Paso 9: Guarde y ejecute su modelo para ver qué sucede (Figura 13.20).
Animales
siendo
Animales atendidos
en espera
En el capítulo anterior, exploramos el uso de recursos, RESOURCES, y mostramos cómo elegir diferentes
recursos de una lista en función del tipo de animal que tenía que ser atendido. Una de las características de
SIMIO es que se puede modelizar lógica muy complicada utilizando las etapas de proceso, ayudándolas con
la asociación de información incluidas en tablas de datos. En un capítulo anterior, el tiempo de proceso y la
información de rutas a seguir por diferentes tipos de piezas se asociaba a la propia pieza. Cuando las
entidades llegaban a la operación, SERVERS, se pregunta a la entidad cuánto tiempo era necesario para
procesarla. Muchos lenguajes de simulación, incluido SIMIO, tiene la posibilidad de especificar atributos
(variables de estado en SIMIO), a los que se puede asignar el tiempo de proceso cuando se crea la entidad.
Sin embargo, la información contenida en una tabla en SIMIO puede ser cambiada de forma dinámica para
que cualquier objeto la referencie.
Paso 2: Recuerde que sólo se ha utilizado con anterioridad la columna Type para tomar decisiones.
Modifique ahora la tabla de datos TableAnimals; incluya una columna “Integer” utilizando el
desplegable Standard Property, de nombre NumberStaff, para representar el número de veterinarios que
son necesarios para atender a un animal. Añada una columna OBJECT LIST a partir del desplegable
Object Reference, de nombre ListStaff, para representar la lista de los recursos que pueden ser
seleccionados. Especifique los valores como se muestra en la Figura 14.1. Ahora los pacientes saben qué
grupo de veterinarios les pueden atender así como el número necesario.
79
Al modelizar la lógica de esta forma hemos conseguido eliminar dos etapas lo que hará que la simulación se ejecute de forma más
rápida. También simplifica la lógica y la facilita en el caso que se necesite añadir más tipos de animal. Ahora, la información está en
una tabla, por lo que no es necesario añadir más lógica.
122 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 14.2: Mejorando los Procesos Lógicos para Apresar y Liberar Veterinarios
Paso 4: Modifique las propiedades tanto en la etapa Seize como en Release para utilizar la propiedades
correspondientes a la asociación de tablas. En Object List Name y Number of Objects, haga clic con el
botón derecho y fije la propiedad Referenced Property en la columna correcta de la tabla
correspondiente. Cuando un paciente llega e intenta conseguir veterinarios, lo hará de forma dinámica
del grupo correcto.
Algunas veces, se necesita utilizar una máquina de rayos-X para explorar a los pacientes. La máquina se
encuentra en una sala diferente. Por ejemplo, un 25% de gatos/perros suelen necesitar una radiografía,
mientras que sólo lo necesitan 15%, 0% y 2% de vacas/caballos, pájaros e iguanas. Los pacientes se han de
dirigir a la sala contigua junto como los veterinarios. Después, los veterinarios son liberados para ir a atender
a otros pacientes.
El tiempo de proceso para realizar y leer la radiografía es una distribución Pert con un valor mínimo,
una moda y un máximo de 20, 25, y 35 minutos respectivamente.
Paso 2: Dado que cada tipo de animal tiene una probabilidad distinta de necesitar una radiografía, añada una
columna “Real”, de nombre XrayLabPorcentaje en la tabla TableAnimals (Figura 14.4).
Paso 5: Los pacientes que necesitan radiografía han de ser dirigidos a la nueva operación. Por defecto, los
pacientes serán dirigidos aleatoriamente hacia la salida o hacia la sala de rayos en igual proporción.80
Existen varias funciones (f(x) en el editor de expresiones) asociadas a los distintos objetos. En la Tabla
14.1 se incluye una descripción de la familia de funciones correspondientes a los objetos conseguidos,
SeizedObject. La función básica de SeizedObjects ejecutará la función
SeizedObjects.Count.
80
Podríamos haber especificado los pesos hacia cada ruta como 1-TableAnimals.XrayLabPercentage hacia la salida y
TableAnimals.XrayLabPercentage hacia la sala de rayos. Sin embargo, esta lógica sólo funciona de forma correcta si los
pacientes no necesitaran que los veterinarios les acompañaran a la sala de rayos.
124 Modelización y Simulación: Libro de Prácticas con SIMIO
Tabla 14.1: Descripción de las Funciones SeizedObjects
Función Descripción
Esta función calcula el número de objetos (RESOURCES, SERVER
SeizedObjects.Count
y LINK, etc.) apresados por el objeto que usa la función.
Toda copia de un objeto en un modelo de SIMIO tiene un
identificador numérico único (ID) (NODES, SERVERS,
SeizedObjects.FirstID
RESOURCES, etc.). Esta función devuelve ID del primer objeto
en la lista de objetos que ha sido apresado por el objeto.
Esta función devuelve ID del último objeto en la lista de
SeizedObjects.LastID
objetos que ha sido apresado por el objeto.
Esta función le permitirá determinar el número de unidades de
SeizedObjects.UnidadesOw
capacidad según el identificador objectID que ha sido
ned(objectID)
apresado por el objeto.
Especifique el peso o probabilidad de tomar el camino que sale de SrvVetClinic y que llega a la
salida (SnkExit) como ModelEntity.SeizedObjects.Count == 0, lo que significa que el
paciente ha soltado al veterinario y puede dirigirse a la salida.
Especifique el peso o probabilidad de tomar el camino que sale de SrvVetClinic y que llega a la sala
de rayos (SrvXrayMachine) como ModelEntity.SeizedObjects.Count > 0, lo que
significa que el paciente todavía no ha liberado a los veterinarios puesto que los necesita para
realizar las radiografías.
Los pesos entonces serán evaluados a 0 ó 1, lo que fuerza a que tomen el camino correcto, esto es, el
que tenga el peso de 1.
En la descripción original, Jim era el veterinario que debía atender a las iguanas y Ellie podía atenderlas si
Jim está ocupado. La clínica esté evaluando la posibilidad de que cuando Jim acaba de atender a un animal,
comprueba si hay una iguana esperando, y en ese caso, darle prioridad. La selección actual era FIFO, “first-
in and first-out”.
Los recursos, RESOURCES, como los servidores, SERVERS, tiene una regla de elección estática, static ranking
rule 81, que ordenará las solicitudes para un objeto. Tanto SERVER como RESOURCE procesarán las entidades
según como han sido ordenadas las entidades.82
Paso 1: Cambie la regla de ordenación de Jim a “largest value first”. La expresión debe referirse a la
propiedad tipo de animal, puesto que son las iguanas las que serán atendidas primero. 83 La regla estática
funciona porque el tipo de animal no cambia mientras que el paciente espera (Figura 14.7).
81
Las reglas estáticas son First-in First-out (por defecto), Last-in Last-Out, Smallest Value, y Largest Value; hay que añadir una
expresión en los dos últimos casos para posibilitar la comparación.
82
También hay reglas dinámicas, que se explicarán en el próximo capítulo.
83
Si Jim está ocupado y una iguana está la primera en la lista, Ellie puede seguir atendiéndola, lo que es aceptable. El objetivo es
aumentar las posibilidades de que sea Jim el que las atienda, pero sin eliminar completamente la otra posibilidad. Si sólo Jim
pudiera atender a las iguanas entonces utilice ListIguana para que sólo fuera Jim el incluido como recurso factible.
Paso 3: Este método hará que Jim atienda primero a las iguanas, pero también dará prioridad a las vacas
antes que a los perros. Jim sí debe atender primero a las iguanas; pero al resto de animales según su
orden de llegada. Una forma de conseguir esto es mediante la modificación de la propiedad “Ranking
Expresión” como se muestra en la Figura 14.8. La expresión lógica hará que las iguanas tengan un valor
de 1, y se mantenga su orden de llegada como factor determinante.
Figura 14.8: Modificando la Regla de Ordenación para no Atender a las Vacas antes que a los Perros
Paso 4: Guarde el modelo y ejecútelo y vea lo que sucede ahora.
Una forma habitual de modelización, es añadir atributos adicionales a las entidades para que
incluyan valores o estados. Se podía haber utilizado una variable de estado discreta, Xray. En la
rama True del disparador “Processed” (Figura 14.9), se podía haber añadido una etapa Assign
para asignar el valor de 1 a Xray si fuera necesario hacer la radiografía.
Figura 14.9: Usando una Variable de Estado para representar la Necesidad de Hacer una
Radiográfica
Los pesos se podían especificar entonces como (1-ModelEntity.Xray) y
(ModelEntity.Xray) para los caminos hacia la salida y la sala de rayos, respectivamente.
Los pesos valdrían 1 ó 0 y nunca serían los mismos. Si el paciente necesita una radiografía, (1-
ModelEntity.Xray) sería evaluada como 0 y (ModelEntity.Xray) como 1.
En el capítulo anterior (Capítulo 14) se ilustraba la flexibilidad de los recursos, RESOURCES, y de la lista de
recursos, RESOURCE LISTS, para modelizar relaciones complicadas. Sin embargo, estos tipos de recursos
están fijos, en el sentido de que no se mueven dinámicamente a lo largo del modelo. Cuando los pacientes
necesitan hacerse un radiografía, no se liberaba a los veterinarios mientras los pacientes se dirigían hacia la
sala de rayos. La animación sin embargo no mostraba el movimiento de los recursos. SIMIO tiene la
posibilidad de disponer de múltiples tipos de objetos (entities, workers, y vehicles) que pueden actuar como
recursos (apresados y liberados) y moverse a lo largo del sistema, justo como las entidades.
Volvamos con nuestra clínica veterinaria. Sin embargo, haremos que la situación se asemeje todavía más a
una clínica. Los clientes han de llegar, registrarse y esperar en la sala de espera hasta que una esté libre. Los
pacientes entrarán entonces a una de las salas. El veterinario saldrá entonces de su despacho y recorrerá el
camino dinámicamente hacia las salas y atenderá a los pacientes según sea necesario. El veterinario va a ser
modelizado como un recursos móvil, que tiene que ser apresado y liberado.
Paso 1: Cree un nuevo modelo que tenga una fuente (SrcPatients), un sumidero (SnkExit), y cinco
operaciones (SrvVetWaiting, SrvRoom1, SrvRoom2, SrvRoom3, y SrvRoom4).
Paso 2: Incluya una nueva entidad, de nombre Patient. Los pacientes se moverán con un ritmo constante de
4.5 km por hora o 4500 metros por hora.
Paso 3: Incluya las salas con una disposición en planta correspondiente a dos pasillos con una sala de espera
común (Figura 15.1).84
El proceso de registro en SrvVetWaiting lleva entre 1 y 4 minutos (de forma uniforme) antes de que
el cliente se sitúe en la sala de espera.
Cada paciente tarda en ser atendido entre 10 y 30 minutos con una moda de 12.
Se ha observado que los pacientes llegan de forma exponencial, con un tiempo medio entre llegadas
de 6.5 minutos.
84
Para ser más eficiente, cree una sala con todas las propiedades y entonces cree tres salas nuevas, y llámelas con los nombres
propuestos.
Paso 5: Conecte la salida de SrvVetWaiting con cada una de las entradas de las cuatro salas utilizando
caminos, PATHS , de nombre PathRoom1, PathRoom2, PathRoom3, y PathRoom4 respectivamente.
La distancia entre la sala de espera y las salas 1 y 3 es de 15 metros y a las otras dos de 30.
Seleccione los cuatro caminos y especifique su capacidad como 1 y la velocidad como 4500 metros
por hora.
Paso 6: Incluya caminos con las mismas distancias para posibilitar la salida de los pacientes. Se pueden usar
nodos de transferencia, TRANSFERNODES, para ayudar en el direccionamiento hacia la salida (Figura
15.1).86
Paso 7: Conecte la fuente con un conector, CONNECTOR, a SrvVetWaiting y use otro conector desde el
TRANSFERNODE hasta la salida SnkExit.
Paso 8: Incluya una nueva fila de salida con forma de U para animar SrvVetWaiting (véase Capítulo 11).
Paso 9: Como antes, los pacientes deben seleccionar una sala que esté disponible. Cree una lista, de nombre
ListRooms, que permita a los pacientes elegir una. En la Figura 15.2 se muestra la lista; fíjese que el
orden de preferencia es 1, 3, 2 y 4 (las más cercanas primero).
85
Después de seleccionar una línea o rectángulo, el área de edición de la altura, Object Height, y de la anchura, Line Width, se
encuentra en la sección “Object” de la pestaña “Drawing”.
86
Los conectores se usan para conectar las salidas de las salas con los TRANSFERNODES mientras que los caminos se usan para
conectar con los nodos.
128 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 15.2: Creando un Lista de Salas
Paso 10: En el nodo de salida de la sala de espera (Output@SrvVetWaiting), especifique Entity
Destination Type para que seleccione de una lista, “From a list”, de nombre ListRooms. El objetivo es
dirigir a los pacientes a una sala disponible. Especifique Selection Goal como “Smallest Value”. En los
capítulos anteriores utilizamos una expresión para determinar el número total de entidades como la suma
de los que se están dirigiendo hacia los nodos de entrada de las salas, esperando en el nodo de entrada de
la sala así como los que están siendo atendidos.
Paso 11: Sin embargo, se pueden utilizar funciones InputLocation (Tabla 15.1) para seleccionar
de forma dinámica entre los nodos de entrada de otros objetos. Estos nodos están asociados con una
operación interna (por ejemplo, Input@SrvRoom1 puede asociarse con una estación de entrada).
Función Descripción
Esta función calcula la capacidad actual de una
InputLocation.Capacity localización dentro de un objeto (por ejemplo, la
capacidad de la fila de entrada de una operación). 87
Esta función calcula la capacidad ociosa de una fila
InputLocation.CapacityRemaining
de entrada de una operación.
Esta función calcula el número de entidades en la
InputLocation.NumberInProcess localización (por ejemplo, en la fila de entrada,
InputBuffer.Contents)88.
Esta función calcula el número de entidades que
InputLocation.NumberWaitingEntry están esperando para entrar en la localización
(InputBuffer.EntryQueue).
Esta función calcula la carga, “load”, que es la
suma de entidades que se dirigen hacia un nodo, las
InputLocation.Load
que esperan a entrar en el objeto, y las que están en
el objeto.
Esta función calcula la sobrecarga, que es igual a la
InputLocation.Overload
carga “Load” menos la capacidad “Capacity”.
Con la expresión siguiente se calcula el número de entidades que se dirigen hacia una sala, que están
esperando para entrar en la sala, que están esperando en la sala y las que están siendo atendidas en la
sala:
87
La capacidad de una operación, SERVER, (estación Processing) no se incluye. Una capacidad infinita se representa por el mayor
valor entero, 2147483647.
88
InputLocation.NumberInProcess no incluye las entidades que se están procesando ni las que están en la fila de salida.
Paso 13: Los pacientes esperarán en las salas de atención después de registrarse, en vez de en la sala
de espera, que es lo que se pretendía. Tenemos que forzar a que los pacientes esperen en la sala de espera
a que haya salas libres. En cada uno de los cuatro caminos hacia las salas, cree un disparador “Reached
End” para que se ejecute cuando las entidades llegan al final del camino. El proceso se utilizará para
cerrar el camino (cambiando las velocidades no evita que las entidades entren en él).
Incluya una etapa Assign para fijar la variable de estado DesiredDirection del camino en
Enum.TrafficDirection.None89 (por ejemplo, para el disparador PathRoom1_ReachedEnd la
variable de estado es PathRoom1.DesiredDirection). Cuando haya creado una etapa Assign, cópiela
y péguela en el resto de objetos, sin olvidarse de cambiar el nombre asociado (Figura 15.3).
Pregunta 2: Para las 40 horas, ¿cuál es el tiempo medio en el sistema y el tiempo medio de espera en la
sala de espera?
89
Las enumeraciones son constantes predefinidas por SIMIO. TrafficDirection es un grupo de constantes de enumeración que
especifican en qué dirección pueden moverse en las uniones. Estas constantes pueden ser None (ninguna), Either (bi-
direccional), Forward (hacia adelante), o Backward (hacia detrás).
90
Cuando se ha acabado de crear los disparadores Exited, copie y pegue las etapas Assign asociadas con las salas,
cambiando el valor de Enum.TrafficDirection.None a Enum.TrafficDirection.Forward.
130 Modelización y Simulación: Libro de Prácticas con SIMIO
Sección 15.2: Usando WORKER como un Recurso Móvil
Nos hemos fijado hasta ahora en las salas, pero no en los veterinarios. Se podría utilizar como en los
capítulos anteriores un recurso fijo, RESOURCE. Como el veterinario se mueve, un recurso móvil parece más
representativo del sistema. Operarios, WORKERS, (y vehículos, VEHICLES) pueden ser asemejados a los
recursos (pues pueden ser apresados y soltados como los recursos y tienen capacidad como las estaciones,
STATIONS) y además son móviles.
Paso 1: De la [Project Library], añada un operario, WORKER, de nombre Vet. Cambie el símbolo a uno
apropiado.
Paso 2: Cree la red que va a ser utilizada por los veterinarios para moverse. Añada 6 nodos de transferencia,
TRANSFERNODES, de nombre TRoom1, TRoom2, TRoom3, TRoom4, TOffice, y TWaitRoom. Los
nodos TRoom se deben posicionar cerca de las salas, y el despacho en la parte de atrás (Figura 15.5).
Conecte los nodos utilizando caminos, PATHS, bidireccionales, dado que los veterinarios se pueden
mover en ambas direcciones para ir a atender al siguiente paciente. Utilice distancias de 15 metros
para cada unión91. Los veterinarios utilizarán el circuito interior.
Circuito para
los
Veterinarios
Veterinarios
Paso 4: Dado que un operario, WORKER, funciona como un vehículo, VEHICLE, tenemos que añadir los
lugares de aparcamiento para los operarios cuando llegan a las salas o al despacho. 92 Haga clic en uno de
los nodos de transferencia asociados con el circuito de veterinarios (TRooms o TOffice). Seleccione la
fila ParkingStation.Contents en la sección “Draw Queue” de la banda “Attached Animation” y
dibuje una fila animada muy cerca del nodo seleccionado. Repita el proceso para el resto de nodos del
circuito.
91
Seleccione todos los caminos y especifique la dirección y la distancia a la vez. Una nota de atención sobre los caminos
bidireccionales: pueden bloquear el sistema y sólo deben utilizarse cuando se utilizan un número pequeño de entidades, operarios o
vehículos. En caso contrario, es preferible utilizar dos caminos, uno en cada dirección.
92
Es para la animación, ya que, en caso contrario, los veterinarios desaparecerían una vez que llegaran a su destino.
Paso 6: El veterinario Vet espera en su despacho y no buscan activamente atender a un paciente. Son los
pacientes los que necesitan llamar a un veterinario para que les atienda. Cuando un paciente va a ser
atendido, necesita apresar un Vet y luego soltarlo cuando haya acabado de atenderle.
Pregunta 4: Para las 40 horas, ¿cuál es el tiempo medio en el sistema y el tiempo medio de espera en la
sala de espera?
93
La forma más eficiente de conseguir nuestro objetivo es crear un nuevo disparador para cada una de las tres salas y copiar la etapa
Seize de la primera sala y después modificar la petición de visita en la propiedad Node Name para que incluya el nodo correcto.
132 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 8: Añada un segundo veterinario, cambiando la propiedad Initial Number in the System a “2”94.
Pregunta 5: Para las 40 horas, ¿cuál es el tiempo medio en el sistema y el tiempo medio de espera en la
sala de espera?
Un problema adicional de modelización es que los veterinarios necesitan volver a su despacho después de
cada visita a rellenar los informes del paciente que acaban de atender y leer el informe del siguiente paciente.
Las dos tareas han de ser realizadas antes de que vuelven a alguna sala para atender a un paciente. Tenemos
entonces que forzar a que vuelvan a su despacho y retenerlos durante un tiempo antes de que están hábiles
otra vez.
Dado que los operarios atienden a peticiones (dicho de otra forma, son los pacientes los que intentan
apresarlos), se puede modelizar esta situación como sigue: una entidad solicita a un veterinario para que vaya
a su despacho, de forma que el operario tenga que volver.
Paso 1: Guarde el modelo actual y fije el número de operarios otra vez en “1”.
Paso 2: Incluya un nuevo servidor, SERVER, de nombre SrvOffice cerca del nodo TOffice y conéctelo con
un sumidero, de nombre SnkOfficeWork (Figura 15.8). La realización de informes dura entre 4 y 14
minutos, siguiendo una distribución uniforme.
94
Otra opción es añadir un segundo operario, de nombre VetB. Entonces, una lista de recursos tendría que ser creada para permitir
que las entidades eligieran uno de los operarios. Este tipo de modelización puede ser necesaria si los dos veterinarios atienden a
distintos tipos de pacientes, tienen diferentes prioridades o patrones de trabajo, etc.
Pregunta 8: ¿Qué pasa si añadimos un segundo Vet?¿Cómo se asegura de que el informe lo realiza el
veterinario correcto?
Una simulación por eventos discretos utiliza un calendario de eventos que se ordena en función de los
eventos futuros. Eventos de Tiempo Cero son eventos que ocurren justo en el mismo momento. 95 La etapa
Seize de los informes sucede a la vez que la etapa Release de las salas. Si la liberación ocurre antes que
la petición, el veterinario puede elegir atender a un paciente que lo haya solicitado en otra sala. La
ordenación de los eventos de tiempo cero puede convertirse en crítica durante la ejecución del modelo y
usted no sabrá cuál se ha ejecutado antes sin hacer de detective.
Una herramienta que ayuda a comprender lo que está sucediendo es el rastreador, “trace”. El “model trace,”
que se activa a través de la pestaña “Run”, es la descripción más completa de lo que está sucediendo. Sin
embargo, en este caso necesita rastrear y entender el comportamiento de un proceso. Para hacer esto, se ha
de seleccionar “Step” en la pestaña “Processes” y hacer clic en el botón de parada, break point , que se
encuentra en la banda, lo que hará que se vuelva rojo. En la pestaña “Facility”, seleccione “Model Trace”, lo
que hace aparecer el rastreador en su propia ventana en la parte de abajo de la pantalla.
Paso 1: Haga clic en la etapa “Create” de SvrRoom1_Processed y seleccione el botón de parada. La etapa
“Create” debe aparecer en color rojo.
Paso 2: Haga clic en el botón “Model Trace” dentro de “Run”. Ejecute el modelo.
Paso 3: Cuando la simulación se para, haga clic una vez en el botón “Step” (puede reconocer por qué se ha
parado, puesto que la línea del rastreador correspondiente también se colorea de rojo). Cuando hace clic
en el botón “Step”, se muestran una serie de acciones, en Amarillo, que representan una etapa en la
simulación. Puede que necesite retroceder en la pantalla para llegar a la parada.
Paso 4: La Figura 15.1296 es una impresión de todos los eventos que han ocurrido durante la parada.
Figura 15.12: Impresión del Rastreador en la que se Muestra la Ordenación de Eventos de Tiempo
Cero
Paso 5: Debe ahora leer el contenido del rastreador: la entidad, el objeto, la etapa y la acción. Vemos que la
entidad informe ha sido creada y que se transfiere a “SvrOffice.InputBuffer” antes de realizar la petición
de veterinario y esperar a que haya uno libre. Entonces, se ejecuta la etapa en que se libera a un operario.
Todo esto ocurre con el reloj de la simulación parado.
95
Existen docenas de eventos que ocurren al mismo tiempo y que pueden acarrear problemas, sobre todo, cuando hablamos de
recursos, operarios y vehículos.
96
La información incluida en el rastreador se salva automáticamente en un fichero CSV mientras que se ejecuta el modelo. El fichero
puede ser importado desde Excel para un análisis más en detalle.
Paso 6: Supongamos que por el placer de discutir, queremos que los pasos se realizaran en orden inverso.
Los eventos concurrentes han de ser ordenados. Para conseguirlo, ha de insertar una etapa Delay antes
de la etapa Seize (Figura 15.13), para representar la realización del informe. La duración ha de ser muy
pequeña, Math.Epsilon.97
97
Math.Epsilon representa el menor valor real mayor que 0. Las etapas Delay interpretarán de hecho el número como 0, pero
fuerza a que el evneto se ponga al final del calendario de eventos. Si el tiempo se especificara como 0, SIMIO no cambiaría el orden.
136 Modelización y Simulación: Libro de Prácticas con SIMIO
Capítulo 16
Usando un Operario como un Recurso de Transporte: Un
Banco
Usando un vehículo cono un recurso móvil
Usando un vehículo para transportar entidades, que lo apresan.
En el Capítulo 15 utilizamos un operario como si fuera un recurso móvil. Los pacientes hacían que el recurso
visitara un nodo específico mediante la utilización de una etapa Seize, que obligaba al operario a situarse
en el nodo antes de que se iniciara la operación. Los vehículos, VEHICLES, también se pueden apresar y usar
como recursos de la misma manera. El objeto VEHICLE es un WORKER que puede transportar entidades. Los
conceptos que se utilizan en este capítulo son válidos tanto para vehículos como para operarios.
Una pequeña sucursal de un banco emplea a varios especialistas en créditos que ayudan a los clientes. Los
clientes llegan al banco y esperan a un especialista en la sala de espera. El banquero recoge al cliente y le
acompaña a su oficina. Cuando se acaba la consulta, algunos clientes quieren también utilizar su caja de
seguridad, lo que implica que el banquero también le acompañe hasta las cajas. El banquero va a ser
modelizado utilizando o bien un operario o bien un vehículo.
Una ventaja cuando se utiliza un operario como un recurso móvil es que también puede ser utilizado como
transportador. Por ejemplo, el veterinario o el banquero pueden ir a la sala de espera y acompañar al paciente
a la sala (el recurso ha de ser apresado por el paciente). En el banco se acompaña al cliente al despacho.
Paso 2: Incluya una fuente, de nombre SrcWaitingRoom, una operación, de nombre SrvRoom, y un
sumidero, de nombre SnkExit.
Los clientes llegan según una distribución exponencial con un tiempo entre llegadas de 6.5 minutos.
La capacidad de la operación es 1.
Cada cliente suele estar en la oficina con el banquero entre 10 y 20 minutos, con una moda de 18
minutos.
98
Seleccione los dos caminos y cambie la propiedad Drawn To Scale a False y la propiedad Logical Length a 15 metros
simultáneamente.
Cambie el símbolo del Banker a uno que sea más representativo (por ejemplo, una persona con
traje).
Para Customer, añada 4 símbolos adicionales y elija cada uno de los cinco símbolos de la Library,
en particular de People. Fije Animation→Random Symbol a “True”, de forma que elija cualquiera de
los 5 de forma aleatoria.
En el operario, mueva la fila de animación de forma que se sitúe al lado de Banker en lugar de
encima (Figura 16.1) y fije el nodo inicial, Initial Node (Home), como Output@SrcWaitingRoom.
Asegúrese de que la fuente genera clientes.
Figura 16.1: Versiones en 2 y 3 Dimensiones Tanto para el Banquero como para el Cliente
Paso 4: Guarde el modelo y ejecútelo, asegurándose que la entidades se mueven correctamente.
Paso 5: El banquero debe recoger a los clientes de la sala de espera y acompañarlos a su oficina. Cambie el
nodo de salida de SrcWaitingRoom (Output@SrcWaitingRoom) a un transportador, como se indica
en la Figura 16.2. Cambie la propiedad Ride On Transporter a “True” para permitir que pueda
transportar entidades y elija un tipo específico como tipo de transportador, Transporter Type, y
especifique Banker como el vehículo requerido.
Paso 7: Guarde el modelo y ejecútelo, asegurándose que el banquero acompaña a las entidades hacia el
despacho.
99
Se puede utilizar también un VEHICLE.
138 Modelización y Simulación: Libro de Prácticas con SIMIO
Pregunta 2: ¿Qué observa? ¿Aguanta el banquero con el cliente mientras está siendo atendido?
El banquero es ahora mismo sólo un transportador que lleva clientes desde la sala de espera hasta la oficina,
pero no se queda con el cliente sino que vuelve a la sala de espera a por otro cliente.
Paso 8: Incluya un nuevo nodo TRANSFERNODE, de nombre TRoom100, encima de SrvRoom y conéctelo con
un camino bidireccional a la entrada de SrvRoom (Figura 16.3)101.
Figura 16.3: Modelo que Usa Vehículos como Recursos o como Transportadores
Paso 9: En SrvRoom, incluya disparadores en “Processing” y “Processed”. En “Processing”, incluya una
etapa Seize que aprese al banquero y le solicite una visita al nodo TRoom (Figura 16.4). En
“Processed”, use una etapa Release que libere al banquero cuando haya terminado con un cliente102.
Pregunta 3: ¿Ha transportado el banquero al cliente hasta la oficina y después se ha colocado en posición
para atenderlo, antes de volver a por otro cliente?
100
Este nodo se utilizará como el nodo que necesita visitar en la etapa Seize. Por tanto, el nodo en el que el operario o el vehículo
dejan a los clientes no puede ser el mismo que deben visitar. Si se utiliza el mismo nodo, el modelo se bloqueará, pues el operario se
atasca en el modelo y la entidad en Inputbuffer, sin poder ser atendida.
101
Este camino bidireccional no consumirá tiempo porque su velocidad permitida es infinita.
102
La asignación como recurso es prioritaria sobre las solicitudes de movimiento. Si existe una entidad que solicita un transporte y
otra que solicita su servicio como recurso, el vehículo atenderá esta última primero.
En esta sucursal, el 45 por ciento de clientes quiere abrir su caja fuerte después haber hablado con el
banquero.103 Se usará un método similar al usado en el Capítulo 14 para dirigir los pacientes hacia la
máquina de rayos-X. El recurso Banker no será liberado si el cliente necesita visitar la caja de seguridad.
El tiempo que emplea un cliente en la zona de seguridad es una distribución Pert con un mínimo, una
moda y un máximo de 10, 15, y 25 minutos respectivamente.
Paso 3: Si hay que realizar una visita a la caja de seguridad (rama “true”), incluya una etapa Set Node que
fijará el nodo de destino de la entidad como el nodo de entrada a SrvSafetyDeposit.104 Si no tienen que
ir a la caja de seguridad (rama “False”), se libera el banquero y se fija el nodo de destino en la entrada de
SnkExit105 (véase la Figura 16.6 para los detalles de las dos etapas Set Node). Cuando la entidad entra
en el nodo de transferencia de SrvRoom, en el que el tipo, Destination Type, ha sido establecido como
“continue”, el nodo de destino será el utilizado para enviar a las unidades.
Figura 16.5: Usando Set Node para Mandar Clientes a la Salida o la Caja de Seguridad
Figura 16.6: Valores de las Propiedades para Enviar una Entidad a la Caja o a la Salida
Paso 4: Incluya un disparador en “Processing” de SrvSafetyDeposit para apresar un banquero cuando la
operación se ha acabado (Figura 16.7).
103
El porcentaje es deliberadamente alto para determinar si el modelo se comporta como debe.
104
La etapa Set Node hace lo mismo que fijar la propiedad Entity Destination en un nodo TRANSFERNODE (ya sea con la opción
“Continue”, “Specific”, “By Sequence”, o “Select from List”).
105
En un capítulo previo, las funciones SeizedObject han sido ya usadas en los pesos de las uniones para enviar entidades o bien
a la salida o a la sala de rayos.
140 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 16.7: Apresando el Banquero en la Zona de Cajas de Seguridad
Paso 5: Incluya un disparador en “Processed” de SrvSafetyDeposit para liberar un banquero cuando la
operación sea ha acabado.106
Pregunta 5: ¿Espera el banquero a que el cliente acabe su operación en la caja fuerte antes de ir a recoger
a otro cliente?
Pregunta 6: Si la pregunta anterior es cierta, ¿dónde espera el banquero mientras el cliente realiza su
operación en la caja?
Paso 7: El banquero no se mueve con el cliente desde la oficina hasta la caja de seguridad. Para facilitar este
movimiento del Banker hacia SrvSafetyDeposit, hay que incluir caminos que permitan al banquero
moverse (Figura 16.8).
Incluya un conector que una el nodo TRoom con la salida de SrvRoom, de forma que el banquero
pueda usar el mismo camino para acompañar al cliente a la caja de seguridad.
106
Basta con que copie la etapa Release de SrvRoom_Processing en SrvSafetyDeposit_Processed.
Si el cliente necesita ir a su caja de seguridad, el banquero tiene que moverse con él. El proceso lógico se
incluye en el disparador “Processed” (Figura 16.5) y permite moverse a las entidades o bien hacia las cajas
de seguridad o bien hacia la salida según una etapa Decide basada en probabilidades, y una etapa Set
Node en la rama conveniente. Cuando se ejecuta el disparador, la ficha, TOKEN, está asociada a la entidad.
Así, cualquier etapa del proceso se aplica sólo sobre la entidad107 asociada con la ficha.
Para maniobrar con el banquero, será necesario identificarlo, con lo que emplearemos una etapa Search. La
etapa Search permite buscar algo en una colección y devolver fichas asociadas a lo encontrado.
107
En algunas etapas, la acción se puede aplicar al objeto padre del objeto asociado que tiene la ficha.
108
MinimizeReturnValue y MaximizeReturnValue buscarán en la colección y devolverán el límite de unidades que minimiza o
maximiza la expresión Return Value.
142 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 8: Si el cliente necesita ser acompañado a la caja de seguridad, incluya una etapa Search después de
la etapa Set Node (Figura 16.9). La rama “Original” se asocia con la ficha, TOKEN, original (el cliente)
mientras que la rama “Found” será invocada por la ficha asociada con cada unidad encontrada.
Figura 16.11: Propiedades de Transfer para Dirigir al Banquero Hacia las Cajas
Paso 10: Guarde el modelo y ejecútelo.
109
La entidad también ha apresado una unidad de capacidad de la operación SERVER, y no queremos que nos devuelva un objeto
SERVER.
110
La etapa Transfer se puede usar para mover objetos dinámicos (AGENTS, ENTITIES, VEHICLES, etc.) desde un Current Node,
Current Station, Free Space, o Link hacia otro nodo, Station, Parents External Node, o link.
La dificultad del modelo anterior era que los clientes y el banquero se movían de forma independiente. Sería
mejor si el banquero pudiera recoger al cliente (funcionando como un vehículo) y transportarlo hasta las
cajas de seguridad, donde el cliente lo apresaría entonces otra vez de una forma similar a como se mueven
hacia la oficina del banquero.
Paso 2: En este problema, sólo ciertas entidades necesitan ser transportadas por un operario/vehículo (las
que se dirigen a las cajas), mientras que los otros se dirigen hacia la salida. Entonces, el nodo de salida
de SrvRoom no puede ser el que se especifique para “Ride on Transporter” porque se transportarían a
todos los clientes. Una etapa Ride puede ser usada para forzar a que una entidad viaje en un vehículo.
Sin embargo, la etapa Ride sólo se puede utilizar en un disparador que se encuentre en un nodo,
TransferNode (por ejemplo, Output@SrvRoom). Así, toda la lógica utilizada para determinar
dónde irá la entidad después de ser atendidas en la oficina tiene que ser eliminada.
Elimine el disparador “Processed” de SrvRoom al elegir “null” del desplegable111 (Figura 16.12)
dado que la lógica puede ser necesitada en otro disparador.
111
También puede eliminar el disparador si lo selecciona y utiliza la tecla “backspace”. “Null” sólo inutiliza el disparador y n o el
proceso.
112
SrvRoom_Processed es justo el nombre del proceso y puede ser cambiado. Se podría haber creado un nuevo disparador y
entonces haber copiado toda la lógica.
144 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 16.13: Especificando el Disparador Entered
Paso 3: Si el cliente necesita ir a las cajas, el cliente debe solicitar un viaje en el vehículo y entonces liberar
al banquero de forma que pueda atender a otras solicitudes.
Incluya una etapa Ride en la que el tipo Transporter Type ha de fijarse en “Specific” y el nombre
Transporter Name en Banker.
Si la entidad necesita ir a la caja de seguridad y el cliente solicita un viaje, el banquero necesita ser
liberado de forma que pueda transportar al cliente hasta la caja de seguridad. Para volver a usar la
misma etapa Release en la rama “False”, alargue el final de la rama ( ) asociada con la etapa
Ride y déjela sobre la etapa Release (Figura 16.14).113
Pregunta 9: ¿Qué observa cuando el cliente necesita ir a la caja de seguridad y el banquero va hacia el
nodo de salida de SrvRoom?
Paso 5: Cuando el banquero, que es el vehículo, llega al nodo de salida de SrvRoom a recoger a un cliente,
de hecho entra en el nodo con lo que se ejecuta la lógica incluida en la Figura 16.14: o bien sale del
modelo o es recogido por otro banquero. Se crea un bloqueo en el sistema. Sólo los clientes deben
ejecutar la lógica.
113
Podría también haber copiado y pegado otra etapa Release después de la etapa Ride
Pregunta 11: ¿Qué observa ahora cuando el cliente necesita ir a la caja de seguridad?
Paso 8: El problema es que el banquero responde a las peticiones según el orden de llegada. El cliente que va
a las cajas debería tener prioridad.
Añada una etapa Assign que cambia las prioridades de los clientes (ModelEntity.Priority)
y las fija en 2 (Figura 16.16).
Cambie la propiedad Task Selection Strategy de Banker a “Largest Priority” como se ve en la
Figura 16.17.114
Figura 16.16: Usando el Disparador Entered para Especificar un Viaje del Vehículo
114
Al cambiar la estrategia de selección, Task Selection Strategy, se reordena la fila de recogida del vehículo.
146 Modelización y Simulación: Libro de Prácticas con SIMIO
Pregunta 13: ¿Funciona el modelo correctamente ahora?
Usando el vehículo o el operario tanto para los transportes como las operaciones obliga a prestar
mucha atención a los detalles. Sin embargo, una vez entendidos, el modelo se comporta de
manera muy semejante al comportamiento real.
Un almacén tiene un zona de recogida a la que los clientes han de ir a por aquello que no esté en las
estanterías. La zona de recogida está atendida por un operario asociado que espera a que lleguen clientes.
Dado que no está ocupado todo el tiempo, el asociado también realiza tareas de apoyo en la colocación de
unidades en las estanterías. Obviamente, la dirección del almacén desea que dé prioridad a los clientes sobre
cualquier tarea de apoyo.
Paso 2: Incluya dos SOURCES, de nombre SrcCustomers y SrcItems y dos MODELENTITIES, de nombre
Customers y Items.
SrcCustomers debe crear Customers mientras que SrcItems debe crear Items.
Los clientes llegan cada 2 minutos y las unidades cada 4 minutos (ambas según un modelo
exponencial).
Coloree los Customers con color rojo.
Fije la prioridad inicial, Initial Priority, de los Items en “0”. Por defecto, todas las entidades tiene
una prioridad de 1.
Paso 3: Incluya 2 SERVERS, de nombre SrvCustomer y SrvStorage, y un SINK, de nombre SnkExit.
Cambie la propiedad Dynamic Selection Rule del mozo para que sea “Largest Value First”, mientras
que deje la propiedad Value Expression según su valor por defecto
(Candidate.Entity.Priority). Esto fuerza a que el asociado atienda primero a los clientes
si tiene que elegir.
Añada un símbolo adicional, coloreando el círculo del símbolo 0 de color verde y el símbolo 1 de
color rojo (Figura 17.2) para indicar a qué tipo de pieza está atendiendo.
Paso 6: Cambie la propiedad Current Symbol Index de Associate para que refleje la nueva variable (Figura
17.3).
Pregunta 1: Cuando el asociado acaba con un cliente, ¿atiende a un nuevo cliente si hay alguno
esperando?
Pregunta 2: ¿Por qué ocurre esto, si el criterio de selección, Dynamic Selection, del asociado se
especificó correctamente?
Por alguna razón, el cliente que está esperando en la fuente SrvCustomer no registra una petición de
servicio. En este momento, el problema puede que no sea del todo evidente. En contra de lo que sucede en
otros lenguajes de simulación, los objetos en SIMIO pueden ser examinados, apartándolos y posiblemente
modificando su comportamiento. Se examinan y modifican los objetos según un procedimiento para hacer
“subclases”.
Para entender por qué la fila no ha conseguido registrar las peticiones de servicio, se hará una subclase con el
servidor, SERVER, para entender su comportamiento interno. Hacer subclases, subclassing, posibilita ampliar
y modificar un objeto existente o un objeto padre.
Paso 1: Para hacer una subclase de cualquiera de los objetos estándar, haga clic con el botón derecho en el
objeto de la librería y elija la opción “subclass” en el menú (Figura 17.5).
El elemento STATION se usa para definir una localización con capacidad restringida en la que pueden
habitar 1 o más entidades. Cada STATION define una fila de entrada para las entidades en espera para
conseguir capacidad, EntryQueue, y otra fila para las entidades en proceso, InProcess.
El elemento FAILURE se usa para definir un tipo de fallo. Los fallos empiezan y acaban según las
etapas Fail y Repair.
Cuando las entidades llegan al nodo de entrada, se transfieren directamente a la fila de entrada,
“InputBuffer” si hay capacidad libre. Del “InputBuffer”, las entidades se transfieren a la
estación de procesamiento, “Processing”, y cuando están acabadas, se mandan a la estación
correspondiente a la fila de salida, “OutputBuffer”.
Paso 3: Seleccione la pestaña “Processes” para estudiar cómo se comporta el objeto. El objeto servidor está
definido por 11 procesos que dirigen cómo el objeto reacciona ante fallos, cambios en la capacidad,
llegada y salida de entidades, etc. Algunos de los procesos responden directamente a eventos (entidades
entrando en la estación de procesamiento, entrando en la fila de entrada, etc.).
Los dos procesos que nos interesan (Figura 17.6) son: OnEnteredInputBuffer, que se
ejecuta cuando las unidades entran en la fila de entrada, InputBuffer, desde el nodo de entrada
si la fila tiene suficiente capacidad, y OnEnteredProcessing, que se ejecuta cuando las
unidades entran en la estación de procesamiento, ya sea desde el nodo de entrada o desde la fila
de entrada.
Si la fila de entrada tiene una capacidad de 0, el proceso es el mismo que “OnEnteredInputBuffer”.
Finalización de la transferencia de la entidad hasta la estación Processing.
Demora de la entidad en función del tiempo de proceso especificado por el usuario.
Ejecución de disparador “Processed”, que en la zona de recogida corresponde con la liberación del
mozo.
La entidad o bien abandonará la operación o bien será transferida a la estación de salida,
OutputBuffer, si su capacidad es mayor que 1.
Paso 4: La primera clave para entender nuestro problema es que el disparador “Processing” no se ejecuta
hasta que la entidad es capaz de conseguir capacidad en SERVER. Examine ahora los procesos Entered y
Exited de la fila de salida, OutputBuffer (Figura 17.8).
Paso 5: Se puede observar que el disparador “Processed” con el que se libera al mozo se ejecuta antes de
que se libere capacidad en el servidor, SERVER. Por eso, el cliente que está esperando en la fila de entrada
no puede realizar una solicitud de mozo antes de que el recién liberado mozo evalúe las peticiones ya
realizadas. Para solventar el problema, fije la capacidad de las dos operaciones en “Infinity”, con lo que
se eliminan las restricciones. Así, cada entidad que acceda a una de las dos operaciones ejecutará
inmediatamente el disparador “Processing” y realizará la petición.
Pregunta 3: Después de observar lo que sucede durante un rato, ¿da servicio el mozo primero a los
clientes en todos los casos?
Paso 7: Haciendo infinita la capacidad resuelve el problema. Sin embargo, hay situaciones en las que la
capacidad no debería ser infinita puesto que el espacio real puede limitar el número de entidades que se
atienden. Por ejemplo, puede que haya más de 1 operario, pero no haya más espacio para atender a
clientes. En la Figura 17.7, el disparador “Exited” se ejecuta después de la etapa Release y puede ser
utilizado para liberar al operario.
Pregunta 4: Después de observar el modelo durante un rato, ¿atiende primero a los clientes en todos los
casos?
Paso 9: El problema vuelve a aparecer, pero en este caso se libera al mozo después de liberar capacidad en la
operación. Los dos eventos suceden a la vez, pero la ordenación hace que se libere capacidad de la
operación antes que al operario. Compruébelo utilizando el rastreador, “Model Trace.”
Paso 10: Para ordenar correctamente los eventos simultáneos, coloque una etapa Delay justo antes
de la etapa Release, con un tiempo infinitesimal, Math.Epsilon (Figura 17.8). Cuando SIMIO se
encuentra con un retardo de este tipo, coloca las etapas al final de la lista de eventos a ejecutar en el
mismo momento de tiempo.
Pregunta 5: Después de observar el modelo durante un rato, ¿atiende el operario a clientes antes en
cualquier situación?
La posibilidad de ampliar o modificar los objetos de SIMIO aparece debido a la naturaleza de los lenguajes
orientados a objetos, y de la especialización o “subclassing.” En la Figura 17.9 se muestra una parte de la
jerarquía de SIMIO en la que los objetos de los niveles inferiores se derivan de los objetos padre. Cuando
una clase se deriva de otra clase, hereda todas sus características (propiedades y variables de estado) así
como sus comportamientos (métodos, procesos y funciones), pero tiene la posibilidad de modificar todas sus
características heredadas así como de añadir alguna nueva.
Objeto
Inteligente
Agente Fijo
Máquina
Transportador Operario Conector Nodo Básico
de Coser
Los objetos fijos, FIXED, representan un sistema entero o pueden representar objetos inteligentes que son
fijos y no se mueven en el espacio. Los objetos LINK, NODE y SERVER tienen las mismas propiedades de la
clase Fixed, pero con más funcionalidad. LINK permite (propiedades y comportamientos) a las entidades para
que entren, salgan o se muevan. De la misma forma, los objetos PATH, CONNECTOR y CONVEYOR son versiones
especiales de la clase LINK. La clase SERVER corresponde con un objeto bastante general que se usa para
restringir y retardar a las entidades en el sistema mientras que la clase SEWINGMACHINE tiene ciertas
características que son únicas de las máquinas de coser (una operación especial). La clase puede hacer lo que
hace un objeto SERVER pero añade o modifica capacidades y comportamientos.
La posibilidad de ampliar y añadir objetos es una característica importante de SIMIO y una que necesita ser
estudiada en detalle. Si se necesita la máquina de coser sólo en una ocasión en un modelo, es posible que no
quiera tomarse el tiempo para crear una clase. Sin embargo, si va a utilizarla muchas veces, disponer de un
objeto que pueda se reutilizable es muy importante y la utilidad se demostrará en los siguientes capítulos.
En el capítulo anterior, hemos demostrado la posibilidad de especializar objetos existentes, lo que permite
añadir características y comportamientos adicionales o modificar los ya existentes. A menudo las entidades
necesitan ser retardadas un cierto tiempo antes de continuar hacia su siguiente destino. El objeto servidor,
SERVER, se puede utilizar para realizar esto, pero puede que su complejidad sea excesiva para realizar una
operación simple de retardo. El primer enfoque va a ser ampliar un objeto existente para añadir la posibilidad
de retardar a las entidades que pasan a través de ese objeto.
Sección 18.1: Haciendo una Subclase del Nodo de Transferencia para crear un Nodo de
Retardo
El nodo de transferencia, TRANSFERNODE, es un objeto que se utiliza para direccionar o transferir entidades
desde un objeto (SERVER, SOURCE, etc.) o como localizaciones para transferir entidades dentro de una red de
uniones o un circuito. Proporciona una excelente opción para detener durante un tiempo a una entidad, antes
de que continúe hacia su destino. La lógica para subirse a un transportador, para continuar una secuencia o
para elegir el camino más corto, ya está incluida en el objeto y estas propiedades y comportamientos no
tienen por qué ser reinventadas en un nuevo objeto. Así, un nodo de transferencia va a ser clonado en una
subclase. Este enfoque amplia y modifica un objeto existente o un objeto padre, que pasan a denominarse
objetos especializados o derivados, “derived”.
Paso 2: Para hacer una subclase a partir de uno de los objetos estándar115, haga clic con el botón derecho en
el objeto y elija “subclass” del menú (Figura 18.1).
Paso 3: Se crea una versión derivada de la clase correspondiente al nodo de transferencia en el panel
Navigation con el nombre MYTRANSFERNODE. Haga clic con el botón derecho en la nueva clase y
seleccione la opción Model Properties para que se muestren todas las propiedades.
115
Puede también hacerlo con un objeto creado por el usuario.
En la categoría “General”, cambie el color del nuevo nodo DELAYTRANSFERNODE a algo como
marrón117.
Seleccione el nuevo nodo en el panel [Navigation] y tómese un poco de tiempo para mirar qué
procesos y características se han heredado. En la pestaña “Processes” puede ver los procesos que se
incluyen en la Tabla 18.1 y que han sido heredados de la clase padre TRANSFERNODE.
116
Los iconos son típicamente de 32 píxeles de ancho por 32 de alto. Muchos programas de edición de imágenes pueden crear estos
iconos (Photoshop, Paint o el software libre GIMP (http://www.gimp.org)).
117
No puede cambiar la imagen porque los nodos son objetos especiales que no ocupan espacio en el sistema actual.
156 Modelización y Simulación: Libro de Prácticas con SIMIO
El elemento ROUTINGGROUP se utiliza con una etapa Route para direccionar una entidad hacia su
destino, seleccionándolo de una lista de nodos. El objeto TRANSFERNODE utiliza un elemento
RoutingGroup como lógica interna para determinar dónde irán las entidades que dejan el nodo.
La nueva subclase hereda también otras propiedades y estados, así como cuatro eventos (Tabla
18.2).118
En la sección anterior, se ha creado un nuevo nodo a partir de un nodo estándar. Sin embargo, el nodo se
comportará como el nodo original dado que ni se ha modificado ni se ha añadido nada nuevo. El nodo ha de
retardar durante un tiempo los objetos que llegan a él tanto individualmente como con un transportador.
Paso 1: En la pestaña “Definitions” en el nodo Delay, añada una propiedad Expression119, de nombre
DelayTime, que puede utilizarse para especificar el tiempo que se va a retardar una entidad. Especifique
la propiedad Default Value como “0”, Unit Type como “Time”, con Default Units en “minutos” (Figura
18.3). Sitúe la nueva propiedad debajo de la categoría “Process Logic”.
118
Para acceder a lo heredado, haga click en para hacerlo visible.
119
La propiedad Expression permite al usuario incluir cualquier tipo de expresión matemática similar al tiempo de proceso de una
operación, SERVER.
Cada vez que una entidad entra en este nodo de transferencia por su propia cuenta o a través de un
objeto asociado, debe ser retenida durante el tiempo especificado en la expresión incluida como
propiedad. De esta manera, los procesos OnEntered y OnEnteredFromAssociatedObject
tendrán que ser modificados para incluir esta consideración. En este momento, los procesos no son
editables, como se puede apreciar si se selecciona el proceso OnEntered y viendo que las etapas y
los procesos tiene color gris. Después de seleccionar el proceso120, haga clic en el botón Override
( ), como se muestra a continuación, lo que permitirá realizar los cambios. Cuando se ha
modificado el proceso, el símbolo Override se coloca al lado del nombre del proceso para indicar
que ha sido modificado. Se puede utilizar el botón Restore ( ) para restablecer el proceso a su
estado original.
Compruebe si debe auto-transferirse, “Auto Transfer to an External Node” (se dan más
explicaciones un poco más adelante)
120
A través de la pestaña “Processes” se accede a todos los procesos.
158 Modelización y Simulación: Libro de Prácticas con SIMIO
Si el nodo hace auto-transferencia, se transfiere la entidad hacia el nodo padre externo.
En caso contrario, se ejecuta el proceso “EnteredAddOnProcess”, que puede ser especificado por el
usuario.
Si la entidad está esperando a ser transportada, está aparcada o este nodo no es su nodo destino, sale
de este proceso
Los nodos pueden tener una capacidad que debe ser apresada (típicamente, la capacidad es infinita).
Si esta entidad es un transportador, entonces se transfiere a la conexión de salida, pues sigue una
lógica distinta.
Paso 2: En algunos casos, los usuarios pueden querer cambiar el tiempo de retardo en función de alguna
condición en el momento que entran en el nodo. Así, incluya una etapa Delay después de que se ejecute
el proceso “Entered” para permitir que el tiempo de retardo sea fijado en un proceso antes de que
verdaderamente ocurra el retardo. La propiedad Delay Time debería ser fijada en la referencia
DelayTime, cuyo valor podría ser calculado en la etapa anterior (Figura 18.5).121 En la sección
“General”, la propiedad Name puede ser especificada como “DelayTime” para tener una mejor
descripción.
Ahora que el nuevo nodo ha sido creado, puede ser utilizado en cualquier modelo en el que el nodo
TRANSFERNODE original se use, con el beneficio añadido de que se consigue retrasar al objeto durante un
tiempo cuando entra en el nodo.
121
Haga click con el botón derecho en la etiqueta de propiedades para especificar la propiedad como referenciada.
El modelo (Figura 18.7) creará una entidad y la duplicará, enviando la original al nuevo nodo
DELAYTRANSFERNODE y la duplicación a un nodo TRANSFERNODE estándar. La variable tiempo en el sistema
se utilizará para ilustrar el comportamiento.
Añada un SEPARATOR, de nombre SepCopy, que se puede utilizar o bien para crear copias de
entidades o bien para separar entidades que han sido agrupadas utilizando un Combiner.
Añada un nuevo DELAYTRANSFERNODE, de nombre TDelay, al que se puede acceder a través del
Project library.
Conecte la salida del objeto padre a TDelay y la salida del objeto miembro a TNormal utilizando
TIMEPATHS, cada uno con una duración de 5 minutos.
Conecte tanto TNormal como TDelay al sumidero con TIMEPATHS, cada uno con una duración de
10 minutos.
Paso 2: Configure todos los elementos fijos con los siguientes parámetros:
SOURCE: Las entidades deben llegar con un tiempo constante entre llegadas de 5 minutos.
160 Modelización y Simulación: Libro de Prácticas con SIMIO
SEPARATOR: La propiedad Separation Mode debe especificarse como “Make Copies” y la propiedad
Copy Quantity debe fijarse en “1” (Figura 18.8), de forma que se cree una copia de la entidad. Se
copiarán todas las propiedades de la entidad original. Sin embargo, el tiempo o momento de la
creación no tiene por qué coincidir con el de la original. La original sale del nodo ParentOutput
mientras que la copia sale del nodo MemberOutput.
Paso 4: Añada una etiqueta de estado a la entidad de forma que se visualice la variable TimeClock.
Seleccione el objeto Parts y elija Status Label en la sección Symbols→Attached Animation. Dibuje una
etiqueta de estado cerca de la entidad con una expresión igual a TimeClock (Figura 18.9).
Figura 18.9: Creando una Etiqueta de Estado para Controlar el Estado de una Pieza
Paso 5: Dado que la etiqueta de estado va adjuntada a cada entidad, la etiqueta viajará junto a ella. Por ello,
rote (Ctrl→Mouse), dimensione y mueva la etiqueta de forma que se posicione justo encima de la
entidad (Figura 18.10).
Pregunta 3: ¿Viaja la etiqueta de estado junto con la pieza? ¿Cuál es el valor de todas las etiquetas?
Figura 18.11: Creando un Proceso Genérico Para Fijar la Hora en la Que Ocurre un Evento
Paso 8: Cuando las piezas salen del separador a través del objeto padre o del miembro, se necesita fijar la
variable TimeClock con el tiempo actual. Seleccione el nodo ParentOutput@SepCopy y especifique el
proceso SetTimeClock para el disparador “Exited”, para que se asigne el tiempo actual de simulación a
TimeClock. Realice la misma operación para el disparador “Exited” del nodo
MemberOutput@SepCopy.
Paso 9: Repita el proceso para los disparadores de “Entered” y “Exited” de los nodos de transferencia
TNormal y TDelay.
Paso 10: Guarde el modelo y ejecútelo. Observe los valores de las etiquetas cuando las entidades
dejan el separador así como los valores de entrada y de salida a los nodos de transferencia. Hubiéramos
pensado que los tiempos serían iguales ya que el tiempo de retardo es “0” y los tiempos entre llegadas y
de recorrido por los caminos son números enteros. Puede que sea bueno introducir una parada,
breakpoint, en uno de los nodos, y luego ejecutar un paso para que la entidad abandone un nodo de
transferencia.
Pregunta 4: ¿Son los tiempos de entrada diferentes para las piezas? ¿Por qué?
Parece que hay un pequeño tiempo de retardo en uno de los nodos de transferencia en comparación con
el otro. Las entidades entran en los nodos a la vez (en el minuto 5 en el lado izquierdo de la Figura
18.12) pero parece que salen en momentos algo distintos, como se muestra en el lado derecho de la
Figura 18.12. Sin embargo, los nodos de transferencia no ocupan espacio, y por tanto no debería haber
discrepancias entre los dos nodos. El momento en que una unidad entra en el nodo debería ser el mismo
que en el que sale.
122
TimeNow es una función que devuelve el valor del tiempo en horas en que se encuentra la ejecución.
162 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 18.12: Mostrando las Discrepancias Entre los Tiempos de Entrada y de Salida
La discrepancia viene determinada por el momento en que se dispara el proceso “Exited”. Este
evento no se ejecuta hasta que el borde trasero de la entidad ha dejado el nodo, lo que depende de la
longitud de la entidad y en cómo de rápido se mueve hacia la conexión (función de la velocidad de la
entidad y la del camino). El proceso “Entered” se ejecuta cuando el borde delantero de la pieza
entra en el nodo. Por eso, cuando se calculan etiquetas de tiempo, los procesos se deben disparar en
función sólo del borde delantero.
Paso 11: Fije el proceso “Exited” de los nodos TDelay y TNormal, así como las salidas de SepCopy
en null para desactivar los disparadores. Incluya el proceso SetTimeClock en los disparadores
“Entered” de cada uno de los caminos que salen de los nodos así como en el separador.
Paso 12: Guarde el modelo y ejecútelo para demostrar que las entidades están sincronizadas.
Paso 13: Especifique un tiempo de retardo de 4 minutos para TDelay y vuelva a ejecutar la
simulación. Cada pieza sufre ahora un retardo de 4 minutos antes de seguir su camino.
Paso 14: Cambie el tiempo entre llegadas a 2 minutos y observe qué pasa.
Los objetos derivados se crean en SIMIO haciendo subclases. Los objetos derivados añaden o
cambian las características y los comportamientos de los objetos existentes. En este capítulo, se
han añadido características que ayudan a incluir retardos en los nodos de transferencia.
En el capítulo anterior, un nuevo objeto para retardar a las entidades fue creado, a partir de hacer una
subclase de un TRANSFERNODE estándar. Sin embargo, las entidades se apilaban en ese nodo unas encima de
otras. Tampoco había oportunidad de añadir un símbolo diferente para representar un lugar con retardo (un
horno, por ejemplo), dado que los nodos no ocupan espacio físico. En este capítulo, se creará un nuevo
objeto fijo que es similar a los objetos estándar y que pueden ser usados en otros modelos.
Paso 2: Incluya en el proyecto un modelo del tipo “New Fixed Class”, utilizando la pestaña “Project Home”,
de nombre DelayObject123. Se puede usar el mismo icono del capítulo anterior o crear uno nuevo. Tener
muchos modelos en el mismo proyecto favorece la creación de submodelos. Por ejemplo, igual
necesitamos 50 máquinas que están compuestas por dos operaciones conectadas en tándem por una cinta
transportadora. Se podría crear un submodelo que tuviera todas las propiedades (2 SERVERS conectados
por un CONVEYOR) y entonces incluir este submodelo 50 veces en el modelo principal.
Para hacer el nuevo objeto DELAYOBJECT, inserte un elemento estación STATION ( ), de nombre
StationDelay. Se puede añadir un elemento STATION en un modelo desde el panel “Elements” de la
pestaña “Definitions”.
Los objetos que contienen o restringen el comportamiento de las entidades (SOURCES, SERVERS, NODES,
SINKS, COMBINERS, SEPARATORS, WORKSTATIONS, etc.) usan elementos STATION para albergar a las
unidades. El elemento STATION se puede usar para definir un lugar de capacidad limitada dentro de un
objeto, donde uno o más entidades pueden coincidir. La etapa Transfer se usa para transferir
entidades hacia dentro y hacia fuera de las estaciones, de forma similar a los nodos.
Los elementos STATION están incluidos en casi todos los objetos de la librería estándar
(Server.InputBuffer, Server.Processing, Server.OutputBuffer, Combiner.ParentInputBuffer,
Separator.MemberOutputBuffer, Workstation.Processing, Vehicle.RideStation,
TransferNode.ParkingStation, etc.)
Un elemento STATION tiene dos filas asociadas: una es la de procesamiento, Inprocess y otra la de
entrada, EntryQueue. EntryQueue. La segunda es la fila donde las entidades esperan hasta que hay
capacidad suficiente para acceder a la fila Inprocess. Si especifica que una operación tiene un
capacidad de proceso de 10 y llega la 11ª entidad, ésta será colocada en la fila de entrada, EntryQueue
(se mantendrá en el nodo de entrada de la operación).
123
Haga clic con el botón derecho sobre el nuevo modelo en el panel Navigation para modificar sus propiedades.
164 Modelización y Simulación: Libro de Prácticas con SIMIO
que están esperando en la fila de entrada, así como la función que representa la ocupación de la fila de
procesamiento, Server.Processing.Contents. Las estaciones responden a tres eventos
distintos, como se muestra en la Tabla 19.1.
Paso 3: Especifique las propiedades de la estación según la Figura 19.1. Tiene que especificar también el
valor por defecto de la capacidad inicial en “Infinity”. Haga clic en la flecha descendente
correspondiente a las propiedades heredadas para cambiar el valor a infinito.
Paso 6: Se usa un diamante para representar la forma por defecto, aunque se puede especificar cualquier otro
símbolo. La forma debe centrarse en la cuadrícula. Haga clic en la herramienta para dibujar polígonos
(pestaña “Drawing”). Empiece en el punto (0,2) y arrastre hacia el punto (2,0). Cuando empiece a
arrastrar haga simplemente clic en los puntos (2,0), (0,-2), y (-2,0) (Figura 19.2). Cuando haga clic en la
última coordenada, haga clic con el botón derecho para completar el polígono. Fije la altura del objeto en
0.5 metros en la sección “Object” de la pestaña “Drawing”.
Paso 7: Añada un cuadrado amarillo al símbolo y una línea curva para dibujar la D. Dibuje varios puntos en
la línea curva, haciendo el último clic con el botón izquierdo en el mismo sitio donde empezó. Cambie a
3-D para colocar los dos objetos justo encima del techo del diamante (Figura 19.2124).
Paso 8: Añada los nodos ENTER y EXIT lo que proporciona el mecanismo para que los objetos llegan y
salgan del objeto delay. Haga clic en “External Node” de la sección “Transfers” de la pestaña
“Drawing” para añadir dos nodos externos en los extremos del diamante. Las especificaciones de los
nodos se muestran en la Tabla 19.3.
124
Puede crear también un modelo en 3-D model en Google Sketchup que sirva como símbolo por defecto.
166 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 9: Incluya un nodo de llegada, de nombre InputNode, que debe ser un nodo básico, BASIC NODE.
Cuando las entidades entran en este nodo, queremos que sean enviadas automáticamente a
StationDelay. SIMIO lo hace de forma automática.
Paso 10: Incluya un nodo de llegada, de nombre OutputNode (Figura 19.4), que debe ser un nodo de
transferencia, TRANSFER NODE, dado que las entidades tendrán que ser transportadas a su nuevo destino.
Cuando las entidades salen de este nodo, queremos que sean transferidas fuera del objeto.
Paso 11: A diferencia de DelayTransferNode, se ubican las unidades en la estación en una de sus
dos filas. Cuando las entidades entran en el objeto y son retardadas, la entidad puede ser visualizada en
una fila. Incluya una fila de animación encima del símbolo (elija Queue en la pestaña “Animation”). Se
debe asociar QueueState a la fila Contents de la estación StationDelay
(StationDelay.Contents).
Paso 12: Se han definido tanto las propiedades del objeto como su vista externa por defecto. Ahora,
es necesario especificar lo lógica que se va a usar para retardar a las entidades dentro del objeto. Cree un
nuevo proceso, de nombre OnEntered, y especifique el evento que lo dispara, que es
StationDelay.Entered, y que será ejecutado cada vez que una entidad entre en la estación,
STATION. La Figura 19.5 muestra las propiedades del nuevo proceso.
Paso 13: Recuerde que el nodo InputNode fue definido como para transferir automáticamente las
entidades a esta estación cuando llegan al nodo (por lo que se ejecutará el proceso OnEntered). La
Figura 19.6 muestra la lógica de este proceso.
Lo primero que tiene que suceder es que la entidad tiene que acabar la transferencia hacia dentro de
la estación, utilizando una etapa EndTransfer. Este paso también dispara el evento
Transferred.
Añada una etapa Delay de forma similar a lo realizado en el Capítulo 18, especificando
DelayTime como una propiedad referenciada.
Cuando la entidad ha sufrido el retardo, necesita ser transferida desde DELAYOBJECT utilizando una
etapa Transfer (Figura 19.7). La entidad en este caso se transfiere hasta el nodo de transferencia
OutputNode, que es un nodo padre externo. El nodo de transferencia incluye toda la lógica para
enviar a la entidad hacia su próximo destino.
DELAYOBJECT puede ser usado ahora como cualquier otro de los objetos estándar de SIMIO. El mismo
modelo será usado para comparar DELAYTRANSFERNODE con DELAYOBJECT.
Paso 1: Vuelva al modelo principal y borre el nodo TNormal. Incluya un nuevo DELAYOBJECT, de nombre
DelOperation (Figura 19.8).
Muchos de los objetos permiten al usuario facilitar el procesamiento mediante la utilización de disparadores
de procesos (durante la inicialización, “Initialized”, cuando entra una entidad, “Entered”, cuando sale,
“Exited”, cuando empieza el procesamiento, “Processing”, cuando acaba, “Processed”, etc.) así como de
asignaciones de valores a variables de estado. Para hacer que un nuevo modelo se comporte de forma similar
a como lo hacen los objetos estándar, es necesario especificar también disparadores y asignaciones.
Paso 1: Seleccione DelayObject del panel [Navigation] y vaya a la sección Definitions→ Properties. Hay
que definir las propiedades asociadas con los disparadores de forma que el usuario las puedan
especificar. Se van a añadir cuatro disparadores (“Initialized”, “Entered”, “Exited”, y “Delayed”)
utilizando una propiedad denominada “Process” que se encuentra en “Element Reference”.
Paso 2: Añada la referencia “Initialized” con las siguientes propiedades, que serán ejecutadas al comenzar
una simulación. Para crear nuevos nombres de categoría basta con escribirlos en los recuadros
correspondientes.
Propiedad Valor
Name InitializedAddOnProcess
Display Name Initialized
Description Se ejecuta al inicializar el objeto
Category Name Add-on Process Triggers
Required Value False
Default Value Empty String
Añada “Entered” con las siguientes propiedades, que serán ejecutadas en cuanto el objeto entra
en DELAYOBJECT.
Añada “Exited” con las siguientes propiedades, que se ejecutarán según el objeto salga de
DELAYOBJECT.
Propiedad Valor
Name ExitedAddOnProcess
Display Name Exited
Description Se ejecuta en el mismo momento en el que se sale del
objeto
Category Name Add-on Process Triggers
Required Value False
Default Value Empty String
Añada “Delayed” con las siguientes propiedades que se ejecutarán cuando se haya acabado el
retardo.
Propiedad Valor
Name DelayedAddOnProcess
Display Name Delayed
Description Se ejecuta en cuanto se acaba el retardo
Category Name Add-On Process Triggers
Required Value False
Default Value Empty String
Paso 3: Vuelva a la pestaña “Processes” e incluya una etapa Execute en el proceso OnEntered, lo que
permite que se ejecuten los procesos (Figura 19.9). Especifique que el proceso es una propiedad
referenciada EnteredAddOnProcess. La propiedad Action debe especificarse como
“WaitUntilCompleted”, lo que fuerza a que la ficha espere a que el proceso se complete antes de
continuar a la siguiente etapa.
Paso 5: Añada el proceso OnInitialized, que se define automáticamente para todos los objetos FIXED
CLASS cuando se selecciona la opción “Select Process”. Incluya una etapa Execute en el proceso
como antes pero especifique la propiedad InitializedAddOnProcess.
Paso 6: Cree un nuevo proceso, de nombre OnExited y especifique la propiedad TriggeringEvent como el
evento StationDelay.Exited. Incluya otra etapa Execute para que se ejecute el proceso según
la propiedad ExitedAddOnProcess definida por el usuario.
Los objetos estándar de SIMIO están dotados de la posibilidad de realizar asignaciones sin necesidad
de definir procesos. Estas asignaciones de valores a variables de estado se pueden añadir a nuestro
DELAYOBJECT.
Paso 1: Las asignaciones de variables de estados, state assignments, se especifican utilizando una propiedad
del tipo “repeating group” dado que el número de asignaciones puede variar. Añada una propiedad
Repeat Group, de nombre AssignmentsOnEntering, con propiedades según la Figura 19.11. Escriba
como nombre de categoría State Assignments, de forma que sea similar al nombre incluido en otros
objetos estándar.
Paso 2: Para crear las propiedades que pueden ser replicadas, seleccione primero la propiedad grupal
AssignmentsOnEntering, e incluya una nueva propiedad de estado State Standard Property, de nombre
AssignmentsOnEnteringStateVariableName, ya que la variable de estado se va a utilizar en las
asignaciones con las propiedades especificadas en la Figura 19.12.
Paso 3: Incluya la expresión que especificará el nuevo valor que será asignado a la variable de estado.
Seleccione la propiedad grupal AssignmentsOnEntering, e incluya una nueva propiedad Expression
Standard Property, de nombre AssignmentsOnEnteringNewValue, con las propiedades especificadas
en la Figura 19.13.
Paso 4: Repita el proceso para otra propiedad grupal, Repeat Group, de nombre
AssignmentsBeforeExiting, como se muestra en la Figura 19.14, lo que permite mostrar todas las
propiedades. Perciba cómo las propiedades grupales tienen su propia sección de propiedades.
Paso 5: Una vez que se han definido las propiedades de Repeating Group, se pueden usar en las etapas
Assign. Incluya dos etapas Assign (Figura 19.15), para poder incluir las asignaciones “OnEntering”
y “BeforeExiting”. Se debe incluir una etapa Assign antes de la ejecución del proceso correspondiente
a la entrada de una entidad, y la otra justo antes de que se transfiera hacia fuera del nodo. En la Figura
19.15 se muestra cómo las propiedades se usan para especificar la propiedad Assignments.
Crear sus propios objetos puede mejorar sus modelos, que es una de las grandes ventajas de
SIMIO.
Sin embargo, si sólo va a utilizar el objeto una única vez en un modelo, puede que no tenga
sentido perder el tiempo en crear el objeto de forma particularizada. La ventaja es que sí se
puede reutilizar el objeto en el mismo o en diferentes modelos.
En los capítulos previos, se ha explorado la posibilidad de ampliar SIMIO mediante la clonación de objetos
ya existentes (un TRANSFERNODE en el Capítulo 18) en otros objetos especializados (DELAYTRANSFERNODE)
así como la posibilidad de crear objetos totalmente nuevos (DELAYNODE en el Capítulo 19).
La posibilidad de ampliar o añadir nuevos objetos es una característica muy importante de SIMIO. Si
necesita una estación especializada para que se comporte como una máquina de coser, pero sólo necesita
una, es posible que no sea necesaria la creación de un objeto especial. Sin embargo, si va a utilizar las
máquinas de coser en muchos sitios del modelo, y puede que en modelos futuros, entonces, tener la
posibilidad de utilizar objetos reutilizables es muy importante. En este capítulo, exploraremos la posibilidad
de tener modelos dentro de otros modelos (submodelos).
Una operación de fabricación tiene 10 células de trabajo múltiples, en la que cada célula está compuesta por
2 máquinas que están conectadas por una cinta transportadora. Se necesita un operario para cargar las piezas
para que sean procesadas en la primera máquina y luego para descargarlas cuando haya acabado la operación
en la segunda máquina. El sistema de cintas transferirá automáticamente las piezas desde la primera máquina
a la segunda. Algunos de las máquinas pueden realizar operaciones en varias piezas en paralelo. Se da
prioridad a la descarga de piezas de la segunda máquina para garantizar que el tiempo total de proceso es
rápido.
Antes de hacer un modelo más grande, es mejor crear primero un modelo de una célula. Eventualmente, este
modelo simple se convertirá en un bloque o submodelo para crear el modelo de la planta entera.
Paso 1: Cree un nuevo proyecto en SIMIO. Cambie el nombre del modelo a WorkCell, cambiando Model
Name en Model Properties.
Paso 4: Se necesita un operario para cargar las piezas en la primera máquina, lo que habitualmente le lleva 1
minuto. También se necesita que el operario descargue las piezas de la segunda máquina, lo que le lleva
habitualmente 0.5 minutos. Incluya 1 RESOURCE, de nombre ResOperator. Añada un símbolo adicional
para indicar cuándo está trabajando, y coloree el iris del símbolo de color verde.
Paso 5: Añada el disparador “Processing” en la Máquina A para que aprese al operario, lo retarde durante
un tiempo, y después lo libere. Esta secuencia representa cómo se carga la Máquina A, lo que debe
realizarse antes de que se procese la pieza.
Paso 8: Abra la pestaña “Definitions”, cambie Category de las dos nuevas propiedades a “Process Logic” y
fije Default Unidades en “Minutes.” El valor por defecto debe ser fijado en 1 minuto para
LoadDelayTime y 0.5 minutos para UnloadDelayTime.
Dado que se ha creado un submodelo que funciona correctamente, es necesario también crear su vista
externa antes de que pueda ser utilizado en otros modelos.
Paso 1: Borre SOURCE, SINK y MODEL ENTITY de este modelo, dado que lo que necesitamos probar es la
lógica de conexión entre las dos máquinas utilizando la cinta transportadora.
Paso 2: Vaya a la pestaña “Definitions” dentro del panel External y añada dos nodos externos, de nombre
InputNode (BASICNODE) y OutputNode (TRANSFERNODE). Incluya un símbolo entre los nodos o cree
una caja roja de 0.5 metros de altura.
125
Dibuje las filas de derecha a izquierda porque el primer punto que se dibuja es la cabeza de la fila.
176 Modelización y Simulación: Libro de Prácticas con SIMIO
Las entidades que entran el nodo externo de salida de WORKCELL serán automáticamente transferidas a la
entrada de SrvMachineA. Cuando las entidades llegan al nodo de salida de SrvMachineB, se necesita
direccionarlas al nodo externo OutputNode que se ha definido en la vista externa. Vuelva a la pestaña
“Facility” y seleccione el nodo Output de SrvMachineB (Output@SrvMachineB). En la categoría
General, cambia la propiedad Auto Transfer on Entry a la opción “To Parent External Node” especificando
OutputNode como el nombre del nodo externo.
Las entidades serán transferidas directamente al nodo externo OutputNode, una vez que acaban en
SrvMachineB.
Se ha creado el submodelo WORKCELL y puede ahora ser guardado en una librería y utilizado en cualquier
otro modelo en SIMIO. Vamos ahora a crear nuestro sistema de fabricación utilizando el submodelo
WORKCELL.
Paso 1: En la pestaña Project Home, cree un nuevo modelo del tipo “Fixed Class”.
Paso 2: En el nuevo modelo, incluya 1 SOURCE, de nombre SrcParts, 1 SINK, de nombre SnkExist, y una
nueva célula, de nombre Cell1, a partir del panel Project Library. Conecte la fuente y el sumidero a la
célula con TIMEPATH de 10 minutos de duración (Figura 20.9).
Paso 3: Haga que la llegada de piezas corresponda con un modelo exponencial de media 5 minutos.
Paso 5: Guarde el modelo y ejecútelo durante un período de 24 horas y mire los resultados. Las estadísticas
de todas las piezas de la célula son visibles.
Pregunta 1: Desde el punto de vista de la animación, ¿qué observa cuando las piezas acaban en la
Máquina A y están siendo llevadas a la Máquina B?
Ahora mismo, la entidad está escondida no sólo cuando está en la cinta sino en cualquier otro momento que
no está animado. A pesar de que la animación interna del submodelo no se muestra, podemos enseñar algo
del comportamiento interno si colocamos etiquetas que muestren el número de entidades en varios sitios. Sin
embargo, también nos gustaría saber el número de piezas que se están procesando en la máquina A o B así
como en la cinta o en la fila de entrada de la Máquina B.
Paso 1: SIMIO da la posibilidad de definir almacenes (filas) por parte del usuario. Seleccione el modelo
WorkCell y vaya a la pestaña “Definitions”. En la sección “Elements”, incluya un nuevo almacén
“STORAGE”, de nombre WorkCellInProcess. Podemos dejar la regla de ordenación por defecto, que es
FIFO, “FirstInFirstOut”.
Paso 2: Hay dos etapas de proceso (Insert y Remove) que pueden ser utilizadas para manipular estos
almacenes definidos por el usuario.126 Una vez que la pieza empieza a ser procesada en SRVMACHINEA,
debe ser también incluida en el almacén WorkCellInProcess para indicar que está siendo procesada.
Añada una etapa Insert después de que el operario haya sido liberado, mediante la inclusión de
WorkCellInprocess.Queue en la propiedad Queue State Name. La propiedad Object Type debe
seguir siendo “AssociateObject” puesto que la ficha sigue asociado con la pieza.127
Figura 20.10: Usando una Etapa Include para Añadir Piezas a un Almacén Definido por el Usuario
Paso 3: Una vez que la pieza ha sido procesada y sale de la máquina, elimine la pieza del almacén utilizando
una etapa Remove (Figura 20.11).
Figura 20.11: Usando una Etapa Remove para Eliminar Piezas del Almacén Definido por el Usuario
126
Estas etapas no funcionan con filas definidas en SIMIO (lo que es una limitación importante).
127
La propiedad Rank Placement se puede utilizar para especificar el lugar en el que colocar a la entidad en el almacén, ignorando
entonces la regla general de ordenación.
178 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 4: Vaya a la sección “Definitions→External” del objeto WorkCell y añada otra fila animada por
encima del objeto que sirve para animar, WorkCellInProcess.Queue (igual quiere borrar las filas
Processing.Contents que fueron incluidas con anterioridad).
Paso 5: Vuelva al modelo principal e inserte de forma manual una fila animada para Cell1,
Cell1.WorkCellInProcess.Queue. No aparecerá ningún cambio en la vista externa para los
objetos antiguos.
Paso 6: Para ver que el modelo funciona correctamente, incluya 5 símbolos adicionales para las piezas,
coloreando cada una con uno color diferente. Fije la propiedad Animation→Random Symbol de las
piezas como “True.” Cambie el tiempo entre llegadas a 2, según un modelo exponencial.
Paso 7: Guarde el modelo y ejecútelo, observando que las piezas se mueven incluso cuando están en la cinta.
Actualmente el operario también está escondido dentro de WORKCELL y no puede recibir información sobre
turnos de trabajo. También está escondida la capacidad y el tiempo de proceso de las dos máquinas.
Paso 1: Vuelva al modelo WORKCELL y seleccione el recurso ResOperator. Todos los modelos tienen
propiedades de tipo de capacidad, capacidad, regla de ordenación así como de reglas dinámicas de
selección. A ResOperator hay que asociarle las propiedades a las correspondientes de WorkCell.
Seleccione ResOperator y asocie sus propiedades a las de WorkCell (Figura 20.12). Cuando el usuario
especifica las propiedades de WorkCell, las de ResOperator tomarán el mismo valor.
Paso 4: Vuelva al modelo principal, asegurándose de que fija el tiempo de procesos de las dos máquinas en 4
y 3 minutos respectivamente.
Paso 6: Si sólo fuera a incluir una célula, no parece apropiado emplear el tiempo en crear un submodelo. Sin
embargo, el beneficio de un modelo está en su reutilización continuada, sin tener que rehacer la lógica
del proceso o establecer las propiedades. Otro beneficio estriba en que si la lógica cambia o se necesitan
capacidades adicionales, sólo es necesario incluir los cambios en un único sitio.
Paso 8: Conecte la fuente y el sumidero con TIMEPATHS de 5 minutos a estas nuevas células y cambie el
ritmo de llegada a dos piezas por minuto.
Paso 10: Ahora cree un Data Schedule, de nombre SchedCell, que tiene un horario de un día en el
que se alternan períodos de 3 horas ociosas, “Off Shift”, y 3 horas ocupadas, “On Shift”. La capacidad
de un período “On Shift” debe ser de 4. Seleccione las tres células y especifique Capacity Type para que
cumpla el horario, WORKSCHEDULE, con la propiedad Work Schedule fijada en SchedCell.
La idea que hay detrás de los submodelos es que uno puede crear su propia clase de objetos.
Cuando se crea una clase, se puede utilizar los objetos nacidos de esa clase muchas veces en el
mismo proyecto o en muchos proyectos diferentes.
Existen muchos ejemplos en fabricación en que las piezas dan vueltas en un sistema circular esperando a que
haya un sitio libre para ser procesadas. Como ejemplo ilustrativo, un fabricante produce camisas de manga
larga que necesitan pasar por más de 30 estaciones de cosido antes de que se obtenga una unidad. La camisa
pasa entonces por una plancha automática y después se coloca en un sistema de cintas transportadoras donde
esperan dando vueltas a ser dobladas manualmente de una en una por una persona. Las camisas giran sobre
28 bandejas que están espaciadas de forma uniforme. Este sistema asegura que no se arruguen las camisas
recién planchadas, aunque vayan más de una en la misma bandeja. En este capítulo se exploran las
posibilidades de usar un vehículo, que es uno de los objetos más complicados debido a sus múltiples
opciones pensadas para cubrir situaciones muy diversas.128 Crear el circuito cerrado de bandejas va a
plantear desafíos importantes.
Paso 1: Cree el modelo que contiene el sistema de bandejas, de forma que contenga 4 estaciones de doblado
(Figura 21.1). Incluya 1 SOURCE (SrcPress), 1 SINK (SnkExit), 1 TRANSFERNODE (TStart), 4 SERVER
(SrvFold1, SrvFold2, SrvFold3, y SrvFold4) y 1 MODEL ENTITY (Shirts).
128
Por ejemplo, se pueden modelizar autobuses que siguen una ruta, taxis que dan vueltas o esperan a ser llamados, u otros como
transpaletas.
Seleccione las cuatro operaciones y fije las unidades del tiempo de proceso en horas y utilice la
distribución por defecto del tiempo de proceso.
Cree un circuito interior con CONVEYORS que tengan una velocidad deseada de 10 metros por minuto.
Cada segmento debería tener una distancia de 10 metros.
Use PATHS para conectar las salidas de cada SERVER con el SINK.
Pregunta 1: ¿Qué sucede cuando las entidades llegan a la primera máquina de doblado?
Paso 3: Las camisas se procesan siempre en la primera máquina. Deberían continuar hasta que llegan a una
máquina disponible. No es posible determinar qué máquina doblará una camisa después de la operación
de planchado, esto es, cuando la entidad entra en el circuito de cintas. Cuando una entidad entra en el
nodo de entrada de una máquina, SERVER, si la máquina está disponible ha de ser procesada, pero si la
máquina está ocupada, debe dirigirse a la siguiente.
Cree un disparador para el proceso “Entered” de Input node de SrvFold1 (Figura 21.2).
Incluya una etapa Decide para comprobar si se está procesando alguna camisa
(SrvFold1.Processing.Contents==0).
En caso contrario, la máquina de doblado está ocupada y la entidad debe seguir por el circuito.
Incluya una etapa TRANSFER que fuerce a la entidad a ser movida desde su nodo hacia la conexión de
salida (continuar hacia el siguiente SERVER).
Paso 6: Para verificar el proceso, podemos añadir 5 o 6 símbolos adicionales con colores diferentes.
Incremente la variable de estado correspondiente a la imagen en 1 cada vez que la entidad entra (proceso
“On Entering”) en la cinta situada después de la operación SvrFold4.
Sección 21.2: Usando un Vehículo para Mover las Camisas a los Puestos de Doblado
En el sistema real, las camisas van en una bandeja sobre la cinta transportadora. Dan vueltas hasta que algún
operario coge una camisa de la bandeja. Las bandejas van a ser modelizadas como un vehículo129.
Paso 1: El objeto VEHICLE tiene ciertas limitaciones para este problema en particular y necesita ser
modificado. Haga una subclase 130 del objeto VEHICLE para facilitar la creación de un vehículo
especializado según nuestra situación.
Para FormVeh, fije su capacidad en 1 y el número inicial en el sistema (en la sección “Dynamic
Objetos”) en 0 para permitir una distancia constante entre las bandejas en el sistema de cintas.
Se debe fijar la propiedad Routing Type en “On Demand” con Idle Action igual a “Roam”, lo que
hace que los vehículos se muevan continuamente.
Paso 4: Incluya una nueva SOURCE, de nombre SrcFrm, fijando Entity Type en FormVeh.
129
Un objeto WORKER se podía haber utilizado también. De hecho WORKER es una super clase de VEHICLE.
130
Haga clic con el botón derecho en la clase del objeto y luego en “Subclass”.
131
Recuerde que al apretar la tecla Shift, se permite cambiar la altura del símbolo.
Paso 5: Para el nodo de transferencia TStart, especifique que las camisas necesitan un transportador para ir
a un puesto de doblado, incluyendo las siguientes propiedades.
Figura 21.4: Fijando el Nodo para Forzar a que las Camisas se Muevan en Vehículos
Paso 6: Elimine cualquier asignación referente a múltiples dibujos que haya en la cinta que sigue a
SvrFold4.
Paso 7: Guarde el modelo y ejecútelo para observar qué sucede. Dado que los vehículos son un tipo de
entidad, el proceso Entered creado con anterioridad para redirigir a las camisas si la estación estaba
ocupada, también funciona para los vehículos.
El problema estriba en que el sistema se bloquea y no puede resolverse con la lógica actual. El
problema surge cuando un vehículo con una camisa llega al nodo TStart. Dado que la pieza tiene como
Destination Type el comando “Continue” y no existe lógica para que no continúe, la entidad es
descargada por el vehículo pero la entidad se atasca en el nodo de transferencia. La entidad no puede ir
a ningún sitio porque se supone que debe ir en un vehículo y el proceso del vehículo no puede acabarse.
Se produce un bloqueo irreversible.
Para resolver el problema, el vehículo no debería descargar las entidades en el nodo TStart. Tampoco
un vehículo puede saltarse el nodo porque tiene que cargar las camisas planchadas que hay que llevar a
los puestos de doblado.
Paso 8: Incluya un disparador Entered en TStart para hacer que el vehículo se salte el nodo en el caso en
que el vehículo ya lleve una camisa. Añada 2 etapas Decide y copie la etapa Transfer de uno de los
otros procesos Entered, como se muestra en la Figura 21.5. La primera etapa Decide utiliza el
operador Is para comprobar si es un vehículo el que entra en el nodo. Si es MYVEHICLE, entonces se
comprueba si va cargado con una camisa, RideStation.Contents. En caso afirmativo, se manda
al vehículo a la salida directamente.
El modelo actual funciona correctamente y los vehículos dan vueltas cargando camisas planchadas y
dejándolas en los puestos de doblado que están libres. Sin embargo, se podría llevar más de una camisa por
vehículo, mientras que ahora sólo una puede ser cargada, sólo una transportada y sólo una descargada.
Pregunta 5: ¿Funciona el sistema como se pretendía? ¿Llevan los vehículos más de 1 camisa?
Pregunta 6: ¿Carga el vehículo las camisas en TStart si lleva alguna, pero menos de 4?
Paso 3: La lógica de procesos hace que el vehículo no entre en el nodo TStart si lleva camisas, por lo que no
parará si lleva alguna. Además, una bandeja vacía cargará y dejará más de una camisa, que no es lo que
queremos. Seleccione MyVehicle en el panel Navigation para modificar el comportamiento por defecto
de los vehículos.
Paso 4: Primero, evitemos que el vehículo deje todas las camisas en un puesto. Dado que un objeto no sabe
nada sobre el modelo que lo está usando, añada una nueva variable de estado discreta, de nombre
DontDropoffNodeID, que ayude a impedir que se descarguen todas las unidades. Advierta que ésta no
es una referencia a un nodo sino un ID numérico asociado a un nodo. Cada objeto en SIMIO tiene un ID
y SIMIO proporciona una función ID para acceder a él (por ejemplo, SrvFold1.ID).
Paso 5: Vaya a la pestaña Processes y vea los numerosos procesos utilizados para modelizar el
comportamiento complejo de los vehículos. El proceso OnVisitingNode se ejecuta cada vez que un
vehículo entra en un nodo y es el proceso más complicado de cualquier objeto de SIMIO. Desactive el
proceso de forma que pueda ser modificado. Se desactiva un proceso haciendo clic en el proceso y luego
en el botón en la banda. Los pasos básicos para modificar este proceso se describen a
continuación:
Se entra en el rutina para descargar entidades; si falla o no hay más entidades, se sigue con la carga
(la descarga se realiza antes que la carga en los nodos).
Se entra en la rutina para cargar entidades que hayan solicitado los servicios del vehículo.
Se decide si es un vehículo con una ruta fijada (por ejemplo, un autobús); si es así, se dirige hacia el
próximo destino y sale del nodo.
Si su ruta no está fijada, se selecciona el siguiente punto de descarga si está transportando entidades
en función de las reglas de ordenación y sale del nodo.
Si no hay entidades que descargar, se libera al vehículo para que pueda planificar su siguiente visita.
Si el vehículo está siempre en movimiento, o bien sale del nodo o bien espera hasta la siguiente
petición.
Paso 6: Si el nodo que se está visitando es el nodo en el que no se puede descargar, DontDropoffNodeID,
entonces no se puede permitir que haya descargas, pero sí que se pueda cargar entidades. El objetivo es
incluir una etapa Decide antes de la etapa Dropoff. Sin embargo, esto complica la lógica. La forma
más fácil es colocar una nueva etapa Decide entre Dropoff y Wait. Seleccione la etapa Decide
que se encuentra a la parte asociada con la comprobación de si hay entidades que deben ser descargadas.
Mueva la rama True para que corresponda con la nueva etapa Decide. La etapa Dropoff puede
moverse ahora a la derecha de la nueva etapa Decide (Figura 21.7). Especifique que en la etapa
Decide se va a comprobar si CurrentNodeId no es igual que DontDropoffNodeID.
132
Como se ha mencionado en un capítulo anterior, y mencionado en el nodo OnVisit, los vehículos responden a las etapas
Seize antes de atender a las llamadas para cargar o descargar.
186 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 21.7: Modificando el Proceso OnVisitingNode
Paso 8: Vuelva al modelo principal y borre el disparador “Entered” del nodo TStart, fijando en “null” su
valor.
Paso 9: Si se ejecuta el modelo, la situación de bloqueo volverá a aparecer porque el vehículo no ha sido
informado sobre la imposibilidad de descarga en el nodo correspondiente. En la fuente SrcFrm, utilice
las asignaciones Before Exiting para asignar el valor ID de TStart al vehículo que acaba de ser creado.
Pregunta 7: ¿Recoge el vehículo ahora camisas incluso si ya lleva alguna (puede que necesite alargar la
fila del vehículo para ver más de dos camisas)?
Pregunta 8: ¿Carga en algún momento más de una camisa a la vez? ¿Descarga todas a la vez en el primer
puesto disponible?
Se carga más de una camisa y también se descarga más de una en cada puesto disponible. El vehículo por
defecto está diseñado para descargar y cargar varias entidades en función de su capacidad según la rutina del
proceso OnVisited.
Paso 1: Tanto la secuencia de carga como la de descarga tienen una etapa Decide que permite al vehículo
seguir descargando o cargando hasta que una etapa falla (no se puede descargar o cargar).
Existen tres posibilidades para forzar a que sólo se pueda descargar una entidad cada vez.
Paso 3: Guarde el modelo y ejecútelo, observando que sólo se carga o descarga una entidad cada vez.
Paso 1: En la fuente SrcForm, incremente el número de bandejas en el sistema a 20 con un tiempo entre
llegadas de 0.25 minutos. Dado que las cintas se mueven a una velocidad constante de 10 metros por
minutos y tienen una longitud de 10 metros, el ritmo de llegadas debería espaciar convenientemente las
bandejas a lo largo del sistema. Puede querer reducir también el tamaño de los vehículos.
Paso 2: Desde el punto de vista estadístico, el sistema se comporta de forma correcta, pero desde el punto de
vista visual, parece que los vehículos en alguno de los segmentos del circuito se mueven a velocidades
distintas. El problema estriba en que el circuito cerrado ha sido modelizado con 5 segmentos. Incluso si
el alineamiento de las celdas estuviera fijado en un número de celdas, esto sólo cubre un único
segmento. Los segmentos individuales implican anomalías adicionales según las bandejas cambian de un
segmento a otro, dado que habrá veces que las bandejas tengan que esperar en un nodo a una celda de
animación. Esta acción puede causar acumulaciones. El problema en la animación aparece porque se
están utilizando longitudes lógicas en lugar de las distancias verdaderas.
Los servidores, SERVERS, se deben colocar cuidadosamente de forma que la entrada de SrvFold1 se
encuentre cerca del punto (0, 0) mientras que las entradas de SrvFold2, SrvFold3, y SrvFold4
deben colocarse cerca de los puntos (0, -10), (-10, -10) y (-10, 0).
Para el nodo TStart, especifique la dimensión X como -5, la dimensión Z como 8.66025 y la
dimensión Y como 10, lo que hará que TStart se sitúe a 10 metros de SrvFold1 y SrvFodl4.
Paso 3: Guarde el modelo y ejecútelo, observando que la animación se comporta correctamente con una
separación constante entre bandejas.
Modificar los objetos vehículo y trabajador ha sido un ejercicio apasionante porque fueron
diseñados para incluir comportamientos muy complejos. Sin embargo, si se pueden comprender
en toda su extensión, se va a encontrar muy a gusto cuando modifique los objetos estándar.
Para que la animación se asemeje a la realidad, encontrará que es necesario incluir distancias. La
animación de SIMIO está diseñada para ser precisa desde el punto de vista dimensional.
En el Capítulo 12 se demostró cómo realizar la modelización de una cadena de suministro de tres etapas
muy simples. Sin embargo, sólo el centro de distribución DC (Distribution Center) utilizaba un modelo de
gestión de stocks para tomar decisiones. La Figura 22.1 muestra una cadena de suministros más complicada
en la que dos tiendas piden a nuestro centro de distribución DC. Las dos tiendas siguen un modelo de
gestión similar al utilizado por el fabricante, al que lanzan pedidos de reposición. El fabricante puede
utilizar dos proveedores diferentes del mismo producto. Los proveedores utilizan también un modelo de
gestión para satisfacer la demanda del fabricante.
Suministro
Perfecto
Clientes
de Materia
Prima
Pedido
Pedido
Proveedor A WalMart
Fabricante
Flujo de Flujo de
Producto Centro de Producto
Distribución
Proveedor B Target
En el Capítulo 12, se desarrolló un modelo de gestión de stocks para un único producto y una única etapa de
la cadena de suministros. Se puede utilizar un enfoque similar para cada una de los segmentos de la cadena
de suministros mostrada en la Figura 22.1, si se añade más variables de estado y algo de lógica adicional. A
medida que el sistema se hace más complicado o se requiere que se introduzcan cambios en el modelo o se
diseñen nuevas políticas de gestión, este enfoque no es el más eficiente. Sin embargo, la posibilidad de crear
objetos especializados va a facilitar la modelización de estos sistemas, incluso no añadiendo mucha lógica
adicional.
Paso 1: Abra el modelo del Capítulo 12. Cree un nuevo proyecto, abriendo otro SIMIO. Va a ser
conveniente copiar elementos del modelo anterior mientras se construye el nuevo.
Paso 2: Se utilizan entidades para modelizar tanto el flujo de pedidos como de productos. Incluya las
siguientes tres variables de estado discretas.
Paso 4: Necesitamos incluir en nuestro nuevo modelo los mismos elementos, ELEMENTS, que incluimos en el
modelo simple (Figura 22.3).
133
Veáse el Capítulo 18 para más información sobre cómo hacer subclases de objetos en SIMIO.
134
La primera vez tiene que teclear el nombre de la categoría, “Inventory”, y ya las siguientes veces se puede seleccionar del
desplegable.
135
Recuerde que la posición de inventario es el stock disponible más lo que está pedido y que no se ha recibido.
En la sección previa, se han incluido en nuestro nuevo modelo las mismas variables, propiedades y
elementos que contenía el modelo sencillo del Capítulo 12. Recuerde que el modelo incluía 2 sistemas
separados (un sistema de lanzamiento y procesamiento de pedidos y otro para crear piezas para reponer los
stocks).
Paso 1: Nuestro nuevo objeto necesita también recibir pedidos y procesarlos. Se necesita un lugar, estación
(STATION), para albergar las entidades que representan a los pedidos mientras están siendo procesados.
En la sección Definitions→Elements→General, incluya una nueva STATION, de nombre
OrderProcessing.136
Paso 2: Para establecer las capacidades del proceso de pedidos así como para ordenar los pedidos que están
en espera, cree una nueva propiedad referenciada haciendo clic con el botón derecho en las propiedades.
Use los nombres que se muestran en la Figura 22.4.
Figura 22.4: Creando Propiedades Para Permitir que el Usuario Cambie la Ordenación de los Pedidos
Paso 3: Cambie a Definitions→Properties y modifique las nuevas propiedades al incluirlas en la categoría
“Ordering Information”.
136
Véase el Capítulo 19 para más información sobre STATIONS.
192 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 5: Asociaremos ahora la capacidad de los nuevos recursos y la ordenación con la estación de pedidos.
Para las propiedades Capacity Type y Work Schedule, cree nuevas propiedades, mientras que para el
resto utilice las ya creadas.
Entrada de
Reaprovisio- Pedidos
namiento
Salida
Entrada
Normal
Normal
Processing.Contents
InputBuffer.Contents OrderProcessing.Contents
OutputBuffer.Contents
137
Véase Capítulo 19 y Capítulo 20 para más información sobre cómo incluir nodos externos en la vista externa de un objeto.
138
Para cada fila, fije Alignment en “None” dentro de la pestaña Appearance.
194 Modelización y Simulación: Libro de Prácticas con SIMIO
La propiedad OrderEntityType se va a utilizar de forma similar a EntityType del objeto SOURCE. Va a crear
pedidos de reposición en función de un tipo definido por el usuario (permite cambiar los pedidos sin
necesidad de modificar el objeto SUPPLYINVSERVER).
Acabamos de definir todas las características del nuevo objeto y ahora tenemos que añadir el sistema de
pedidos. Los pedidos que llegan al nodo OrderInput se mandan directamente a la estación
OrderProcessing. En este punto, es necesario añadir la lógica necesaria para atender los pedidos. Recuerde
que en el Capítulo 19 en el objeto DELAY, las estaciones incluían la entrada y salida de piezas.
Paso 1: Incluya un nuevo proceso, de nombre OnEnteredOrdering, que se ejecute con el disparador
OrderProcessing.Entered (Figura 22.11), y que sirva para procesar los pedidos. El proceso se
explica en los pasos siguientes.
Incluya una etapa Seize para apresar una unidad de ResOrder (Figura 22.13).
Etapas Copiadas de
OnEnteredProcessing
Figura 22.17: Etapas Usadas Para Cubrir el Pedido y Enviarlo hacia el Cliente
Paso 4: Las primeras tres etapas actualizarán la posición de inventario en la cantidad que está siendo enviada
al cliente. Si la posición no puede cubrir la cantidad solicitada (etapa Decide) entonces cambie el valor
de la cantidad del pedido al nivel actual de inventario. Si hay suficiente inventario (“False”), disminuya
el valor de la posición de inventario en la cantidad correspondiente al pedido. Incluya la etapa Decide
y las dos etapas Assign con las propiedades incluidas en la Figura 22.18.
Paso 7: Incluya un nuevo proceso, de nombre “OnExitedOrderingProcess”, que se ejecute con el disparador
OrderProcessing.Exited (Figura 22.20). Copie las tres etapas del proceso
“OnExitedProcessing”. Este proceso ejecutará todas las etapas cuando la capacidad de la fila de salida es
0 y los pedidos se envían directamente al nodo externo. Modifique la etapa Release para liberar el
Hemos definido hasta ahora la lógica relativa al sistema de pedido. Ahora, es necesario implementar el
sistema de reposición de inventario en el nuevo objeto.
Paso 1: Prepare el sistema de revisión periódica mediante la creación de un proceso que responda a las
llamadas del temporizador TimerReview. Desde la pestaña “Processes” de SUPPLYINVSERVER, cree un
nuevo proceso, de nombre InventoryReview. Fije la propiedad Triggering Event para que responda a
un evento TimerReview.Event que hace que se ejecute el proceso cada vez que el temporizador
genera una llamada (Figura 22.22). Este proceso es casi idéntico al creado en el Capítulo 12 (Figura
12.9) por lo que todas las etapas se pueden copiar y pegar; es necesario sin embargo modificar algo las
etapas Create, Assign y Transfer.
139
El usuario ha de indicar cuándo los pedidos se transportan desde ReOrderOutput a través de una unión.
Executes Processed
Add-On Trigger
Nuevas Etapas
140
Véase el Capítulo 18 y el Capítulo 21 para más información sobre cómo desactivar y restaurar procesos.
200 Modelización y Simulación: Libro de Prácticas con SIMIO
Incluya una etapa Destroy para que elimine la entidad que acaba de llegar puesto que no va a
seguir moviéndose.
Paso 4: La propiedad InitialInventory se utilizaba para establecer la posición inicial del Inventory dentro del
proceso OnInitialized. Desactive el proceso OnInitialized de nuestro nuevo objeto e incluya la misma
etapa Assign que antes (Figura 22.28).
Sección 22.5: Usando los Nuevos Objetos para Modelizar la Cadena de Suministros
El nuevo objeto SUPPLYINVSERVER ha sido definido y puede utilizarse para crear un modelo (Figura 22.29)
de la cadena de suministros compleja (Figura 22.1). 141
141
Debe separar los objetos hasta que la dirección de los caminos muestre la flecha. Tener los caminos y los conectores en el sentido
incorrecto puede generar errores que son difíciles de encontrar. Cuando esté seguro de que las uniones muestran la dirección
correcta, sitúe los objetos otra vez en sus lugares originales.
En la categoría Inventory, fije las propiedades Review Period en 5 días, Initial Inventory en 1300,
Reorder Point en 900, y Order Up to Qty en 1100 (Figura 22.30).
Para cumplimentar la categoría Order Information, es necesario saber que se tarda 0.25 días en
procesar un pedido. Fije Deliver Node ID en Input@SupInvWalmart.ID142 lo que permitirá
que los pedidos que sean enviados al proveedor vuelvan al cliente adecuado.
142
Recuerde que cada objeto en SIMIO tiene un número de identificación único al que se puede acceder utilizando la función ID.
202 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 6: Necesitas crear el centro de distribución que va a dar servicio a los dos clientes. Copie
SupInvWalmart y llámelo SupInvDC.
Para que los productos fluyan hacia las tiendas, conecte el nodo Output de SupInvDC con
los nodos Input de SupInvWalmart y SupInvTarget utilizando TIMEPATHS (Figura
22.29). Se tarda generalmente 4 días en transportar el producto desde el centro de
distribución a cada tienda. Sin embargo, puede tardar un mínimo de 3 y un máximo de 7
días. Fije la propiedad Travel Time en Random.Pert(3,4,7).
Para que los pedidos fluyan desde las tiendas al centro de distribución, conecte el nodo
ReorderOutput de cada tienda con el nodo OrderInput de SupInvDC con conectores que
representan transmisiones de datos tipo EDI (Electronic Data Information).
Pregunta 1: Con nuestro nuevo objeto, ¿cómo podemos modelizar que se atiendan antes los pedidos de
Walmart que los de Target, si llegan a la vez?
Paso 8: Hemos utilizado un proveedor para aprovisionar el centro de distribución. Copie SupInvDC y
péguelo en un nuevo objeto SUPPLYINVSERVER, de nombre SupInvA (Figura 22.32). Hay que realizar
pocos cambios adicionales.
Paso 10: Los productos tardan lo mismo en esta etapa de la cadena que en la que conecta con los clientes.
Conecte el nodo Output de SupInvA con el nodo Input de SupInvDC con TIMEPATH que tiene una
propiedad Travel Time que ha de fijarse en Random.Pert(3,4,7)(días).
Paso 12: Guarde el modelo y ejecútelo durante un período de 52 semanas y vea los resultados.
Pregunta 1: ¿Cuál es el nivel de servicio medio en cada uno de los segmentos de la cadena logística?
Pregunta 2: ¿Cuál es el nivel actual y medio de inventario en cada uno de los niveles de la cadena?
Pregunta 3: ¿Cree que el sistema actual es el adecuado, y cuál parece ser el problema?
Al revisar los resultados, la mayoría de las posiciones de inventario son 0, lo que derivó en niveles de
servicio muy bajos. El punto central es el tiempo total empleado en llevar el producto desde los proveedores
hasta los clientes, así como la variabilidad. Esta situación se puede mejorar mediante la optimización de los
puntos de pedido y de las cantidades máximas en inventario. También se pueden plantear estudios de mejora
para reducir los tiempos de proceso o de transporte. Añadamos un segundo proveedor (Supplier B) que
trabaja contra pedido (make-to-order) y no para almacenar (make-to-stock).
Paso 1: Incluya 1 SERVER, de nombre SrvSupB. Modifique el modelo según la Figura 22.33.
Para que fluyan los productos, conecte el nodo Output de SrvSupB con el nodo Input de
SupInvDC con un TIMEPATH. Se tarda Random.Pert(1,2,3) (en días) en entregar producto
desde este proveedor.
Pregunta 4: ¿Cuál es el nivel de servicio medio en cada uno de los segmentos de la cadena logística?
Pregunta 5: ¿Cuál es el nivel actual y medio de inventario en cada uno de los niveles de la cadena?
Este modelo proporciona una base para poder incluir múltiples mejoras.
La información sobre fallos en los pedidos se puede incluir en el recurso ResOrder. Se debe
añadir la posibilidad de parar los flujos de pedidos.
Se puede incluir fácilmente información sobre costes en los pedidos y en los objetos sobre
modos de transporte (aire, tren, …).
La fiabilidad de los aprovisionamientos se puede añadir en SUPPLYINVSERVER de forma que se
modelicen errores en los envíos en el selección de productos.
Un objeto puede ser modificado para trabajar con muchos productos en vez de con uno único.
Se pueden incluir distintas políticas de gestión de stocks, incluso aplicarlas de forma distinta a
distintos segmentos de la cadena.
Se podría añadir un evento controlador, MONITOR, para crear un sistema de revisión continuo en
vez del sistema periódico. Incluso los usuarios podrían elegir entre ambos.
Un nuevo Producto 3 se está introduciendo en el mercado. Para producir 1 unidad de Producto 3 hay que
ensamblar 1 unidad de Producto 1 y 1 unidad de Producto 2. Antes de que se empiece a producir una unidad
de cualquiera de los productos, hay que comprar materia prima y hay que formar a los operarios. También
hay que hacer una inspección en el Producto 2 antes de que sea ensamblado con el Producto 1 para formar el
Producto 3. La tabla que sigue proporciona la lista de actividades o tareas, así como sus relaciones de
precedencia y la duración media de cada actividad.
C = producir Producto 1 A, B 8
D = producir Producto 2 A, B 7
E = test Producto 2 D 10
A continuación se muestra el diagrama del proyecto, con el nombre de las tareas y su duración en días:
Las actividades pueden también compartir recursos necesarios para realizar una actividad. Por eso, el
objetivo será determinar el camino crítico así como la probabilidad de que una actividad se encuentre en el
camino crítico.
Finalización Más El momento del tiempo en que acaba una actividad (una entidad deja el
Temprana/Earliest camino).
Finish
Finalización más El momento del tiempo en que puede acabar una actividad sin provocar
Tardía/Latest un cambio en el camino crítico o un retraso en las tareas subsiguientes.
Finish
Holgura/Slack La diferencia en tiempo entre la finalización más temprana y la más
tardía.
Criticidad/Percent Probabilidad de que un camino está en el camino crítico.
CP
En capítulos anteriores hemos demostrado la posibilidad de crear subclases a partir de objetos existentes, lo
que permite añadir características y comportamientos o modificar los actuales. Pero no se han hecho
subclases todavía de los objetos que conectan otros objetos entre sí (caminos, PATHS o TIMEPATHS).
Modelizaremos el problema de gestión de proyectos utilizando caminos en los que se consume tiempo.
Utilizaremos una repetición del modelo para representar un proyecto, por lo que múltiples réplicas serán
utilizadas para caracterizar estadísticamente el proyecto.
La posibilidad de crear nuevos objetos es una de las ventajas de SIMIO, y los caminos TIMEPATH son un
objeto atractivo como para utilizarlo para representar las tiempos de las actividades, dado que las entidades
se pueden mover por ellos. Los caminos son los objetos importantes en la determinación de un camino
crítico. Se necesita calcular la influencia de cada camino (finalización más temprana, holgura, criticidad...).
El camino necesita conocer cuando una entidad llega al final y además controlar que sólo una entidad se
mueva por él. Su encapsulación permite que el objeto tenga inteligencia para calcular automáticamente sus
variables de comportamiento, así como que nos permite utilizarlo en distintos modelos de gestión de
proyectos.
Paso 1: Haga una subclase del objeto camino, TIMEPATH y cambie la propiedad Model Name a
PRJTIMEPATH143.
Paso 2: Incluya dos variables DISCRETE STATE, de nombre EarliestFinish y CalculateSlack. La primera se
utilizará para registrar el momento en que la actividad ha acabado, mientras que la segunda se utilizará
para controlar cuándo se puede calcular la holgura.
Paso 3: Para realizar los cálculos del camino crítico, añada 3 estadísticas TALLY, de nombre
TallyEarliestFinish, TallySlack, y TallyPercentCP, utilizando la sección Definitions→Elements.
Cambie la propiedad Category a “Critical Path” para las tres estadísticas de observación, TALLY.
Cambie la propiedad Data Item a “Earliest Finish”, “Slack”, y “Percent CP” para cada una de las
estadísticas.
143
Haga clic con el botón derecho en el objeto en el panel [Navigation] y seleccione sus propiedades.
208 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 4: Recuerde que sólo un proyecto será realizado en una repetición. Para modelizar un nodo del que
comienzan muchas actividades, los caminos no deben permitir que circule más de una entidad
simultáneamente y la dirección de movimiento es única. En Definitions→Properties, haga clic en la
flecha para que aparezcan las propiedades heredadas.
Nuevas Etapas
En la sección anterior, hemos modelizado las actividades del proyecto como caminos, TIMEPATHS, y hemos
calculado ciertas estadísticas. Sin embargo, los caminos no pueden hacer que se cumplan las relaciones de
precedencia o empezar nuevas actividades ni determinar cuándo ocurre la última finalización de las tareas
que convergen en un nodo. Las restricciones correspondientes a las relaciones de precedencia tienen que ser
impuestas en nodos, que también permitirán que se inicie el siguiente conjunto de actividades a partir de ese
nodo. Así, el nodo tiene que esperar hasta que acaben todas las actividades precedentes antes de empezar con
todas las siguientes a la vez. Los nodos determinan también cuál ha sido la finalización más tardía,
correspondiente a la última de las actividades precedentes que ha terminado.
Paso 1: Los objetos estándar ni pueden modelizar estas circunstancias fácilmente ni son sencillos como para
modificarlos para que nos sirvan en nuestro propósito. Por eso, vamos a crear un objeto similar al objeto
DELAY del Capítulo 19. A partir de la pestaña “Project Home”, incluya un nuevo modelo, “Fixed Class
Model”, de nombre JUNCTION, que servirá para modelizar los nodos o cruces.
Paso 2: Necesitamos que nuestro cruce actúe tanto como un nodo de finalización como de un nodo de inicio,
así como un nodo intermedio en nuestra red del proyecto. Los nodos de inicio empezarán actividades
mientras que los nodos de finalización acabarán las actividades.
144
Puede cambiar la presentación del objeto lista, puesto que se ha añadido un espacio entre las opciones “StartNode” y “EndNode”.
Paso 6: Como se hizo en el Capítulo 19 para el objeto DELAY, las entidades entrantes necesitan un lugar en el
que se puedan ejecutar acciones. A partir de Definitions→Elements, incluya una estación, STATION, de
nombre Project, y con todos los valores por defecto.
Figura 23.10: Vista Externa del Objeto Junction Objeto, con Nodos de Entrada y de Salida
Paso 8: Ahora que hemos definido la vista externa y que las actividades pueden entrar y salir de nuestro
objeto, tenemos que añadir la lógica sobre las actividades predecesoras y sucesoras. Cree un nuevo
proceso, de nombre “OnEnteringProject”, que se ejecutará cada vez que una actividad entra en la
estación Project; especifique que el evento disparador es “Project.Entered” (Figura 23.11).
145
Actualmente en la Versión 3 no hay posibilidad de conocer el número de caminos o uniones que llegan o salen de los nodos.
212 Modelización y Simulación: Libro de Prácticas con SIMIO
Figura 23.11: Proceso que se Ejecuta cuando las Actividades Entran en un Cruce
Como siempre, la primera tarea que se necesita hacer es finalizar la transferencia de la entidad con
una etapa End Transfer.
Incremente después el número de actividades que se han acabado en 1.
146
Si la expresión da el resultado de 1, la entidad fluirá directamente por la rama principal o verdadera. Si da el resultado de 2, la
entidad irá por la rama secundaria o falsa. El resto de resultados hará que se realice la etapa.
Sección 23.4: Creando una Pequeña Red para Probar el Nuevo Objeto
Parece que nuestro cruce está preparado para satisfacer relaciones de precedencia y empezar nuevas
actividades. Vuelva al modelo original y cree una red muy sencilla para probarlo. No hagamos hincapié en el
nombre de los objetos.
Paso 1: Incluya una entidad, de nombre Activities, y 4 cruces con sus nombres por defecto. Colóquelos
como se muestra en la Figura 23.18.
Paso 3: Haga que Junction1 sea el nodo de comienzo, “Start Node”, con dos sucesores, Successors,
mientras que Junction2 tiene 2 predecesores, Predecessors, y 2 sucesores, Successors (Figura 23.19).
Pregunta 7: ¿Esperó Junction2 a que las dos actividades predecesoras se acabaran antes de empezar el
nuevo grupo de actividades?
Paso 5: Parece que sólo una fue creada cuando en realidad las dos fueron mandadas por el mismo camino.
Haga clic en el nodo Output de Junction2 y cambie Outbound Link Preference de “Any” a “Available”,
para que la regla de salida sólo elija un camino que esté disponible.
Paso 7: El usuario ha de cambiar ahora la propiedad por defecto de “Any” a “Available” cada vez que se
encuentren con el mismo problema. Para que no se olvide, vamos a cambiar automáticamente la
propiedad haciendo una subclase del objeto TRANSFERNODE. Haga una subclase de TRANSFERNODE, de
nombre PrjTransferNode.
Paso 8: En Definitions→Properties, haga clic en la flecha “Properties (Inherited)” para mostrar las
propiedades heredadas. Seleccione la propiedad OutboundLinkPreference y cambia el valor por defecto,
Default Value a “Available”, y fije la propiedad Visible en “False”, de forma que el usuario no pueda
cambiarlo de forma accidental.
Creemos ahora el modelo correspondiente a nuestra red incluida en la sección inicial del capítulo.
Paso 1: Borre todos los cruces del modelo dado que no incluyen el nodo PRJTRANSFERNODE. Incluya 5
nuevos cruces, JUNCTIONS, con sus nombres por defecto (Figura 23.21).
Paso 3: Use los valores incluidos en la Figura 23.22 para especificar las propiedades Project Management de
cada uno de los cinco cruces, incluyendo las restricciones de precedencia así como el número de
actividades siguientes que han de empezar.
Paso 5: Recuerde que decidimos hacer sólo un proyecto por repetición. Incluya por tanto un experimento
que servirá para realizar 1000 veces el proyecto.
Paso 7: Filtre la columna “Category” haciendo clic en el icono embudo que se encuentra en la esquina
derecha (Figura 23.23), y seleccione las estadísticas correspondientes al camino crítico, “Critical Path”.
Figura 23.23: Filtrando la Categoría para Mostrar las Estadísticas del Camino Crítico
Figura 23.24: Estadísticas sobre Terminaciones Más Tempranas Utilizando 1000 Repeticiones
En este punto se puede determinar la fecha de terminación más temprana, Earliest Finish (EF), de todas las
actividades y el tiempo total de finalización del proyecto, pero es difícil de determinar qué actividades
conforman el camino crítico dado que los tiempos son aleatorios. Sin embargo, los valores de la holgura y
del porcentaje de tiempo que una actividad es crítica puede ayudar al gestor del proyecto. Como hemos visto,
la fecha más temprana se puede calcular sin obtener información de otros objetos. Sin embargo, para el
cálculo del valor de la fecha de terminación más tardía, Latest Finish (LF), se requiere la holgura así como el
número de veces que una actividad ha estado en el camino crítico.
El tiempo más tardío sólo se puede saber en los cruces, y se determina cuando acaba la última actividad. Se
necesita que haya comunicación entre dos objetos; y hay dos maneras de enfocar esta comunicación. En el
primer enfoque (Figura 23.25), los cruces, JUNCTIONS, tienen que conocer los caminos, PRJTIMEPATHS, que
llegan a ellos. Las actividades, PRJTIMEPATHS, utilizarán una variable de estado interna al objeto, que
tomará el valor de 1 al llegar al cruce y cuando la última actividad termina. En el segundo enfoque, los
caminos han de conocer los cruces a los que están conectados y controlar una variable de estado interna al
cruce. Vamos a ilustrar ahora este enfoque.
147
Sus números pueden ser un poco diferentes dado que la muestra automática de los números aleatorios en su ordenador puede ser
diferente. Sin embargo, los resultados deben ser estatísticamente similares.
218 Modelización y Simulación: Libro de Prácticas con SIMIO
PrjTimePath PrjTimePath
Junction
Monitorizar
Monitorizar
Señal
Señal
Calcular Holgura Junction Calcular Holgura
Incluya una etapa Tally que calcule la holgura (LF-EF), siendo el valor del tiempo más tardío, LF,
el correspondiente al momento actual.
Una segunda etapa Tally añadirá o un 0 o un 1 a la variable TallyPercentCP para indicar si está
en el camino crítico o no.
Paso 5: Los objetos en SIMIO no saben nada sobre el modelo. Así, tiene que avisar al modelizar a los cruces
de qué caminos están conectados a él. Un cruce puede tener uno o más caminos predecesores. Así, y
para representar más de una actividad, es necesario disponer de listas. Incluya una lista, LIST, de
ListLinkPreference con dos valores (Individual o List).
Figura 23.31: Fijando la Variable CalculateSlack de los Caminos Cuando Todas las Actividades se
Hayan Acabado
Paso 9: Una etapa Search se usará para buscar una lista de caminos mientras que la otra se va a utilizar
para buscar un camino en particular dependiendo del valor de PrecedentLinkType. Advierta que no se
ha utilizado una etapa Decide para determinar cuál buscar, puesto que ya se sabía desde el comienzo
de la simulación (al utilizar la propiedad Exclusion Expression).
En la Figura 23.32 se muestra la etapa Search que buscará en una lista, “ObjectList”, en la que la
propiedad Object List Name se referencia a la propiedad ListPredecessorsLink y la propiedad Limit
se fija en “Infinity” para que se devuelvan todos los caminos que se han encontrado. La expresión
Exclusion Expression ( PrecedentLinkType ==
List.ListLinkPreference.Individual || JunctionType ==
List.ListJunctionType.StartNode) especifica que no se ejecute esta etapa Search si el
tipo es “Individual” o si el cruce es de comienzo, “StartNode”.
Paso 12: Dado que los cruces Junction2 y Junction4 tienen dos actividades precedentes cada uno, se
tendrá que especificar que se necesita una lista. Incluya dos nuevos OBJECTLISTS, de nombre ListJun2
148
Algunas veces, cuando se añaden propiedades a objetos que ya están en el modelo se producen errores que indican que hay algo
sin especificar. Guarde el modelo y vuélvalo a abrir para eliminarlos.
222 Modelización y Simulación: Libro de Prácticas con SIMIO
y ListJun4. Para ListJun2, especifique las actividades “A” y “B” y ListJun4 las actividades “C” y “E”
(Figura 23.35).
Pregunta 12: ¿Cuánto podemos retrasar la actividad A sin que afecte al camino crítico?
Pregunta 13: ¿Cuánto podemos retrasar el comienzo de la actividad C sin que afecte al camino crítico?
Paso 15: Según los resultados obtenidos, es claro que el camino crítico es B D E F dado que estas
actividades tiene los porcentajes más altos de criticidad (Figura 23.37).
En la sección anterior, se han utilizado los cruces para enviar una señal a los caminos, en los que se realizan
los cálculos sobre holguras y criticidad en función de la terminación más tardía. En esta sección,
utilizaremos un enfoque alternativo y haremos que los caminos monitoricen al cruce al que preceden. En esta
sección se demuestra cómo un objeto puede monitorizar variables de estado de otros objetos, lo que puede
ser muy útil.
Paso 2: Seleccione el objeto cruce JUNCTION y elimine las tres propiedades que se han añadido
PrecedentLinkType, PredecessorsLink, y ListPredecessorsLink.
Paso 3: Elimine las dos etapas Search del proceso “OnEnteringProject” e incluya una etapa Assign en la
que se asigna el momento actual (TimeNow) a la variable de estado LatestFinish.
Por ejemplo (Figura 23.41), la propiedad Junction LF State Variable de los caminos A y B debe ser
Junction2.LatestFinish.
Algunas veces, las actividades utilizan recursos compartidos. Los recursos pueden limitar el
número de actividades que se ejecutan en paralelo, lo que puede incidir en la duración total del
proyecto. El uso de recursos compartidos puede incluirse directamente en los caminos,
PRJTIMEPATHS. Sin embargo, decidir qué actividades tienen prioridad puede ser un problema.
Otro problema a analizar en la gestión de proyectos es cuánto tiempo se puede retrasar el
comienzo de una actividad. Haciendo que una de ellas se retrase puede permitir una mayor
disponibilidad de los recursos críticos, haciendo que la duración total se reduzca.
Una planta de confección que produce camisas de manga larga está compuesta por varias operaciones
secuenciales en serie. Algunas de las operaciones son cuellos de botella. Provocan que se acumule grandes
cantidades de trabajo en curso, sin garantizar que se aumente la capacidad. La compañía está cambiando su
filosofía de producción desde un sistema basado en la previsión (“push system”) a otro basado en la
demanda real (“lean”, tipo de “kanban” que busca el equilibrio de las distintas operaciones). Los puestos
sólo pueden producir si hay hueco para inventario en el siguiente puesto. Este sistema de producción se basa
en un principio de eliminación de desperdicios que dice que no se debe producir en exceso si no hay
hueco.149 La Figura 24.1 muestra el segmento de la línea de producción que vamos a modelizar. Las partes
de la camisa se manda a la primera operación y luego fluyen a través de tres estaciones. El objetivo es limitar
la cantidad de trabajo en curso entre los procesos. El operario que se ocupa de la primera operación ha sido
formado como para que pueda atender la segunda operación. Las operaciones están muy cerca una de la otra.
Inventario Inventario
Manga Estrecha
Estrecha Coser Manga
Manga Manga BH
Paso 2: Haga una subclase del objeto servidor, SERVER, de nombre BLOCKINGSERVER.
Paso 3: En la sección Definitions→Properties, incluya tres nuevas propiedades que van a ser utilizadas
para identificar los procesos siguientes así como el número máximo de camisas permitidas en la zona de
espera.
149
En un sistema Kanban, las posiciones de inventario están siempre llenas. En este escenario, sólo se produce si hay espacio
disponible, pero el sistema puede vaciarse y el trabajo se acaba. Esta combinación de push y pull se conoce como Syncro MRP. Sólo
se produce si hay espacio y se tiene un pedido.
226 Modelización y Simulación: Libro de Prácticas con SIMIO
“Down Stream Buffer.” Esta variable va a permitir que se especifique el nombre del
almacén de la estación siguiente. Fije la propiedad Required Value en “False”.
Añada una propiedad Expression Standard Property, de nombre MaxBufferSize, y
colóquela en la categoría “Kanban” para especificar el máximo número de unidades que
puede haber en el almacén de la estación siguiente. Cuando se alcance este valor, la
operación dejará de trabajar.
Añada una propiedad Expression Standard Property, de nombre MinBufferSize y colóquela
en la categoría “Kanban” para especificar el mínimo número de unidades que puede haber
en el almacén de la estación siguiente para desbloquear la operación.
Paso 4: Incluya un MONITOR a partir de la sección Definitions→Elements, de nombre
MonitorDownstreamBuffer, que va a controlar a ver si existe espacio disponible en la operación
siguiente, utilizando una propiedad referenciada.
Paso 6: Necesitamos crear un proceso que atienda los eventos que genera MONITOR cuando está
controlando la estación siguiente. A partir de la sección Processes→Process, cree un nuevo proceso, de
nombre OnDownStreamBufferChange. Fije la propiedad Trigger Event en
MonitorDownStreamBuffer.Event.
Paso 8: Si cualquiera de las condiciones es verdadera, necesitamos que la operación deje de trabajar, y lo
hacemos al cambiar la capacidad a 0. Los objetos que tiene capacidad (recursos fijos, FIXED, como
SERVER, COMBINER, RESOURCES, WORKERS, y SEPARATORS así como STATION) tienen una variable de
estado discreta, de nombre CurrentCapacity, con el valor actual de capacidad. Como hacíamos con los
turnos de trabajo, podemos modificar esta variable para cambiar su capacidad disponible. En la Tabla
24.1 se muestran las funciones que se pueden utilizar con estos objetos. Tome nota de que sólo los
recursos fijos pueden devolver el número de unidades que están siendo utilizadas.152
150
Estamos ingnorando aquellas camisas que están moviéndose a la estación siguiente puesto que las operaciones están muy cerca
una de la otra.
151
El operador || es la forma con la que se especifica “O” y el operador && es “Y”.
152
También hay otras funciones asociadas como el mínimo, el máximo, el total, y el número medio de unidades asociadas con un
nivel de capacidad.
228 Modelización y Simulación: Libro de Prácticas con SIMIO
Incluya una etapa Assign que realice 3 asignaciones (Figura 24.2). Si en la operación se están
procesando entidades, no queremos que el puesto deje de funcionar hasta que haya acabado la
entidad sobre la que está trabajando.153 Si fija la capacidad en 0, se parará el procesamiento en el
puesto.
Paso 9: Si el almacén siguiente tiene espacio suficiente (rama “False” de la etapa Decide), tenemos que
desbloquear el puesto haciendo que la capacidad, CurrentCapacity, vuelva a su valor inicial,
Capacity.Initial, o a su capacidad actual, y que las variables Blocked y ShutdownCapacity
sean 0 (Figura 24.5). Cuando el sistema no está bloqueado, este proceso todavía puede ser invocado
cuando haya un cambio.
153
Vea la sección Comentario para una discussion de cómo cambiar esta limitación.
Paso 13: Incluya una estadística STATE STATISTIC, de nombre StateStatBlocking, que se usará para
determinar el porcentaje de tiempo en el que la operación BLOCKEDSERVER ha estado bloqueada.
154
Una ventaja de SIMIO es la posibilidad de desarrollar asignaciones complejas.
Si la operación está bloqueada, las entidades no deberían ser capaces de conseguir capacidad, sobre
todo si la operación está procesando una última entidad. Primero, desactive el proceso
“OnEvaluatingAllocation”. Si la condición es “False” entonces la operación rechazará la petición.
Añada la condición “!Blocked &&” en la expresión (Figura 24.12) para asegurarse que la
operación no está bloqueada.156
Figura 24.12: Asegurando que se Rechazan las Peticiones si la Operación está Bloqueada
Paso 15: Guarde el modelo actual.
155
Los procesos de decision sólo pueden contener las etapas Decide, Search, y Assign, y la asignación Token.ReturnValue=0
rechaza las peticiones.
156
!Blocked es “1” si la operación no está bloqueada (Blocked == 0).
232 Modelización y Simulación: Libro de Prácticas con SIMIO
Sección 24.2: Modelizando el Sistema
Se necesita probar el sistema completo. Vamos a comparar este nuevo sistema con almacenes con el sistema
push (Figura 24.13). Específicamente, necesitamos ver cómo los sistemas reaccionan ante reducciones en los
tiempos de proceso (lead time) cuando se incluyen nuevos trabajos o cuando cambia la demanda. Para
simplificar la descripción denominaremos las tres operaciones de procesamiento como Proc1, Proc2, y Proc3
en vez de los nombres verdaderos, que pueden no ser del todo familiares.
Paso 2: Modelicemos primero el sistema Push, incluyendo 3 SERVER, de nombre SrvProc1, SrvProc2, y
SrvProc3. Conéctelos con CONNECTORS.
Paso 4: Fije el tiempo de proceso para el primer procesamiento en Random.Pert(10, 11, 15)
minutos, para el segundo en Random.Pert(60, 65, 74) minutos, y para el tercero en
Random.Pert(38, 42, 48) minutos para ambos sistemas.
Paso 5: Para BSrvProc1, fije la propiedad Max Buffer Size en “8” y Min Buffer Size en “2”. Fije la
propiedad Down Stream Buffer en BSrvProc2.InputBuffer.Contents, para controlar el
almacén del siguiente proceso. Tendrá que incluir este información dado que todas las variables de
estado no tienen por qué estar incluidas en los desplegables.
Paso 7: Dado que el resto del sistema de fabricación está fuera de los límites del modelo, nos aseguraremos
que hay suficiente trabajo (cinco piezas) en la primera operación de cada sistema. Incluya una fuente
SOURCE, de nombre SrcParts, que han de responder a un evento para crear llegadas. Cada vez que una
pieza sale de la primera operación, otra llegará, como se muestra en la Figura 24.15. Fije la propiedad
Initial Number of Entities en “5” para inicializar el sistema. Después de estas primeras llegadas, la
propiedad Arrival Mode fijada en “On Event” hará que se cree una nueva llegada cada vez que ocurre el
evento Output@SrvProc1.Exited.
Paso 9: Conecte las dos Fuentes con sus respectivas primeras operaciones utilizando CONNECTORS.
Paso 10: Ahora que tenemos piezas, necesitamos crear también la pieza que nos va a servir para
comparar. Esta pieza nos va a servir para indicar un cambio en el tipo de pieza, lo que será un buen
indicador del tiempo que se tarda en vaciar el sistema antes de empezar con el nuevo tipo.
Incluya una fuente, SOURCE, de nombre SrcPartMark, y establezca que tiene que liberar
una entidad cuando se lleven 12 horas de simulación.
Paso 11: Cuando las piezas han acabado la última operación, van a ser enviadas a uno de los cuatro
sumideros, dependiendo del sistema del que proceden y de si es o no la entidad de control. Se utilizan
cuatro sumideros para facilitar la obtención de estadísticas. Incluya 4 SINK, de nombre
SnkNormalMark, SnkNormal, SnkNewSystem, y SnkNewSysMark (Figura 24.13).157
157
En lugar de utilizar dos sumideros para cada sistema, podríamos haber utilizado un sumidero y una estadística TALLY para grabar
el momento en que la entidad de control llega al sumidero.
Paso 13: Incluya una etiqueta de estado para mostrar lo que contiene el almacén de la segunda
operación, SrvProc2.Inputbuffer.Contents, dado que las filas animadas no se pueden alargar
lo suficiente (como mucho 8 entidades).
Paso 14: Guarde el modelo y ejecútelo durante un período de 4 días. Eventualmente, deberíamos
montar un experimento puesto que sólo tenemos una observación correspondiente con la entidad de
control.
Pregunta 16: ¿Se bloquean las operaciones cuando los almacenes siguientes llegan al máximo permitido?
Pregunta 18: ¿Cuánto tardan en ser procesadas las piezas en cada sistema?
Pregunta 19: ¿Cuál es el tiempo de procesamiento en cada sistema, determinado por el tiempo en el
sistema de la entidad de control?
Pregunta 21: ¿Qué porcentaje de tiempo han estado bloqueadas las operaciones?
Paso 15: Cambie la capacidad del segundo proceso a 2 en cada sistema. Guarde y ejecute el modelo.
Pregunta 22: Compare las respuestas a las mismas preguntas con los nuevos valores, en especial en
cuanto a los porcentajes de bloqueo?
Los resultados muestran que la primera operación está bloqueada mucho tiempo, lo que significa que el
operario tiene tiempo para realizar otras tareas. En este momento, ya no nos interesa la comparación entre los
dos sistemas. La parte correspondiente al sistema Push puede ser borrado. Recuerde que el operario de la
primera operación ha sido formado también para atender en la segunda operación, que resulta que es el
cuello de botella.
Paso 1: Guarde el modelo con un nombre distinto y asegúrese que la capacidad de la segunda operación
BSrvProc2 es “2”.
Paso 2: Incluya dos TRANSFERNODES, de nombre TProc1 y TProc2 y posiciónelos debajo de las operaciones
correspondientes (Figura 24.19). Conecte los dos nodos de transferencia entre sí con un TIMEPATH
bidireccional de 10 minutos de duración.
Paso 4: Incluya una nueva LIST de objetos, de nombre ListProc2, que contenga el nombre de los dos
operarios (Figura 24.20). La lista será utilizada para seleccionar uno de los operarios cuando la primera
operación está bloqueada.
Para el proceso “BSrvProc2_Processing”, incluya una etapa Seize para apresar un operario de la
lista ListProc2 (Figura 24.21). El valor por defecto “PreferredOrder” de la propiedad Selection
Goal es el correcto dado que WrkrNotCrossTrained debe ser seleccionado antes si los dos están
disponibles. Asegúrese de que la propiedad Request Visit tiene el valor “To Node” y la propiedad
Node Name el valor “TProc2” para forzar a que los operarios lleguen a la segunda operación antes
de que se empiecen a procesar.
Pregunta 23: ¿Qué observa en relación con el operario multidisciplinar? ¿Se comporta como esperaba?
Paso 8: El problema es que el operario está atendiendo las peticiones según su orden de llegada, lo que
significa que el operario se va a mover alternativamente entre las dos operaciones. Sin embargo,
queremos que el operario esté siempre en la primera operación hasta que la operación se bloquea.
Incluya una etapa Decide que se basa en una condición con la que se decide aceptar o rechazar la
petición.
(ModelEntity.Priority==2&&(Bsrvproc1.Capacity>0||Bsrvproc2.Capacity<2))
|| (ModelEntity.Priority==1 && Bsrvproc1.Blocked)
Pregunta 24: ¿Ha estado el operario multidisciplinar trabajando en la primera operación hasta que la
operación se bloquea y se dirige entonces hacia la segunda operación?
Pregunta 25: ¿Cuánto tarda en procesarse las piezas? ¿En comparación con el modelo anterior?
Pregunta 26: ¿Cuál es el tiempo total o lead time, determinado por el tiempo en el sistema de la entidad de
control?
Pregunta 27: ¿Qué porcentaje del tiempo han estado bloqueadas las operaciones? ¿Y en comparación con
el modelo anterior?
En lugar de esperar a que la operación acabe el proceso, se podría haber utilizado una etapa
Interrupt para parar la operación. De hecho se podía haber añadido una opción para
interrumpir o no, así como decidir qué hacer con la entidad que ha sufrido la interrupción. Para
nuestro escenario, se acabará de procesar la entidad sin realizar la interrupción.
Tampoco se estudia el número de entidades que se mueven hacia el almacén siguiente. Sin
embargo, una propiedad similar a la empleada podría ser usada. En el objeto correspondiente a la
cadena de suministros del Capítulo 22, el nodo Input del proceso usaba una etapa Decide que
incluía el número que llegaba a dicho nodo de entrada.
Finalmente, igual desea crear un verdadero sistema Pull. El objeto SUPPLYINVSERVER del
Capítulo 22 puede ser fácilmente modificado. En lugar de tener un período de reposición, un
controlador debe hacer que la revisión sea continua con el nivel de inventario fijado en el
número de Kanbans. También podría incluirse pedidos no atendidos. En este caso, podría llenar
los Kanbans, incluso si no tiene suficiente inventario. Las órdenes de reposición serían las
señales Kanban.
Se debe añadir una etapa Assign en el proceso “OnInitialized” de BLOCKINGSERVER lo que
habilitará o deshabilitará el controlador si el almacén siguiente, DownstreamBuffer, ha sido
especificado o no (MonitorDownstreamBuffer.Enabled =
DownStreamBuffer.isdefined).
Advierta que actualmente el estado de bloqueo se comprueba solamente cuando hay un cambio
en el almacén siguiente. Podríamos hacer la comprobación antes de empezar una unidad. Incluya
una etapa Execute antes de la etapa Seize en los procesos “OnEnteredProcessing” y
“OnEnteredInputBuffer” para que se ejecute el proceso “OnDownStreamBufferInput”.
En el Capítulo 12 se empezó a utilizar una cadena de suministros muy sencilla con un centro de distribución
que realizaba tareas de reposición de un único producto y para una tienda. En el Capítulo 22 encapsulamos el
sistema para poder modelizar muchos segmentos diferentes de una cadena de suministros. En ambos casos se
asumía que existía un único producto o stock keeping unit (SKU). En este capítulo se va a ampliar el modelo
del Capítulo 12 para incluir múltiples tipos de producto. La mayoría de las empresas tienen muchos SKUs
que se almacenan en un centro de distribución. El patrón de SKU cambia con el tiempo (el número de tipos
diferentes de SKU como las cantidades de pedido así como las cantidades máximas en inventario). Por eso,
la habilidad para cambiar rápidamente la información es importante, y se facilita con el uso de las hojas de
cálculo.
Paso 1: Dado que el sistema es exactamente igual excepto por la existencia de muchos SKU, abra el modelo
del Capítulo 12 y guárdelo con otro nombre.
Paso 2: Recuerde que la entidad se utilizaba para representar tanto los pedidos que recibía el centro de
distribución así como los pedidos que se mandaban a los proveedores. Se añadió una variables de estado
discreta, OrderAmt, para especificar la cantidad del pedido. Seleccione la entidad en el panel
[Navigation]. En Definitions →States, incluya una variable DISCRETE STATE, de nombre SKUID, para
indicar el tipo de SKU que se está pidiendo.
Paso 3: Vaya a la sección Definitions →States del modelo principal. La variable DISCRETE STATE puede
tener diferentes dimensiones (Tabla 25.1), aunque por defecto es un único valor, “Scalar.”
Cambie la propiedad Dimension de las variables Inventory y WIP a “Vector” con 100 filas para
indicar el máximo número posible de diferentes SKU que el modelo puede manejar.158 (Esto produce
una serie de errores que se resuelven a continuación.)
158
El valor “Table” podría haber sido utilizado, y la tabla haber sido una hoja de cálculo, pero en este caso se requería mantener
varias hojas.
242 Modelización y Simulación: Libro de Prácticas con SIMIO
Paso 4: Incluya dos variables DISCRETE STATE con una dimensión “Scalar”, de nombre NumSKUs, para
indicar el número de SKUs en el sistema, y TotalInventory, que es la suma de todos los niveles
individuales de inventario.
Paso 6: Añada etiquetas de estado para guardar los valores de TotalInventory y de NumSKUs (Figura
25.1). La antigua etiqueta de estado que estaba relacionada con el inventario (la etiqueta a la derecha de
la etiqueta “Current Inv”) dice ahora “Inventory”. Cambie Expression a Inventory[1] para indicar
que se muestra el valor correspondiente a la primera fila.159 Puede añadir 5 etiquetas más a la derecha
para mostrar los valores de las filas segunda a sexta.
Recuerde que en el modelo original se especificaba el inventario inicial, el punto de pedido y la cantidad
máxima en inventario. Con el potencial de disponer de 100 tipos diferentes de SKUs, especificar esta
información a través de propiedades individuales es dificultoso. Se va a especificar la información en una
TABLE.
Paso 1: En la sección Data→Tables, incluya una DATA TABLE, de nombre TableSKU. Incluya 4
propiedades Integer Standard Properties, de nombre ID, InitialInventory, ReOrderPt y
OrderUptoQty y 1 propiedad Real, de nombre Mixture, que va a representar el mix de producto o el
porcentaje de demanda de cada SKU (Figura 25.2). La columna ID se va a usar para referenciar el
número de fila en los vectores de variables Inventory y WIP.
Figura 25.2: Montando una Data Table para Caracterizar cada SKU
Paso 2: En este punto, ya se podría incluir toda la información necesaria. Sin embargo, los datos cambian a
menudo y la información puede encontrarse en nuestro ERP. La posibilidad de relacionar la tabla de
SIMIO con una hoja Excel es muy conveniente. La Figura 25.3 muestra las opciones para interactuar con
una hoja de cálculo. Se pueden importar los datos, “Import From”, tanto de un fichero (CSV, Comma
Separated) como de una hoja Excel. El proceso es manual y tiene que ser realizado cada vez que la hoja
cambia. Con la opción “Bind To”, se asocial la tabla a la hoja Excel o al fichero CSV y la tabla de
SIMIO se actualiza automáticamente al comienzo de la simulación.
159
El uso de [] para indicar el número de fila es muy común en otros lenguajes de programación.
:
Figura 25.5: Ventana de Diálogo para Importar o Asociar
160
El sistema sólo exporta a ficheros CSV, ficheros que se pueden abrir en Excel.
161
Para hacer cualquier cambio en la tabla, tiene que quitar la asociación “Remove Binding”.
244 Modelización y Simulación: Libro de Prácticas con SIMIO
Sección 25.3: Cambiando los Procesos para Manejar Múltiples SKUs
Hemos modificado las propiedades para manejar múltiples SKUs y hemos creado una tabla para caracterizar
toda la información sobre los SKUs. Necesitamos también modificar los procesos para utilizar correctamente
los cambios sobre el mix de productos. Esencialmente, tenemos que cambiar las variables escalares por
vectores en los sitios en los que antes usábamos las variables Inventory y WIP.
Paso 1: El proceso “OnInitialized” se utilizaba para fijar el valor inicial de inventario pero ahora necesita
modificarse para inicializar los inventarios de cada SKU así como la variable que refleja el inventario
total. La etapa Search se usaba para buscar en las filas de entidades en el Capítulo 9 y en colecciones
de objetos (recursos) en el Capítulo 16, pero también se puede utilizar para buscar dentro de una tabla.
Para cada fila que se encuentre, se asignará al TOKEN el número de fila, de manera similar a la forma en
que la etapa Set Table se usaba para asignar un fila en particular a una entidad (Capítulo 7).
Incluya una etapa Search y mueva la etapa Assign a la rama “Found”. La etapa Search buscará
en cada fila y nos permitirá asignar el valor inicial de inventario (Figura 25.6).
Figura 25.6: Modificando el Proceso OnInitialized para Inicializar el Inventario de cada SKU
Haga que la búsqueda se realice en todas y cada una de las filas de la tabla (Tabla 25.2). La
propiedad Return Value es una expresión que se evalúa para cada fila de la tabla. La etapa Search
devuelve entonces la suma de todos los valores.
Modifique la etapa Assign para asignar el número correcto de la fila así como TotalInventory. El
TOKEN asociado con la rama “Found” se asigna al número de fila encontrado en la tabla. Fije la
propiedad Row como TableSKU.ID y New Value como TableSKU.InitialInventory. En
la propiedad Assignments (More), fije TotalInventory como TotalInventory +
TableSKU.InitialInventory para calcular el inventario como suma de todos los valores
individuales.
La estadística de observación, TALLY, que se utiliza para guardar el nivel de servicio corresponderá
con el nivel de servicio general para todas las SKU. Modifique la etapa Tally para particularizarla
para cada SKU (Inventory[ModelEntity.SkuID])
Modifique el sistema actual: incremente las capacidades de las operaciones así como especifique la creación
de pedidos en las tiendas.
Paso 1: Cambie la propiedad Initial Capacity de las tres operaciones, SERVERS, a “5”.
Paso 2: Seleccione la fuente SrcOrders y borre las asignaciones originales sobre la cantidad de los pedidos.
Incluya un disparador “Created” que va a generar los pedidos para cada SKUs (Figura 25.14: Creando
Pedidos desde las Tiendas para cada SKU).
Figura 25.14: Creando Pedidos desde las Tiendas para cada SKU
Copie la etapa Search del proceso “InventoryReview” y modifique la propiedad StartingIndex para
que tome un valor de “2”, dado que ya tenemos una entidad.
En la rama “Created”, incluya una etapa Assign que determina el tipo de SKU Type
(TableSKU.ID) y la cantidad en función de la mezcla o mix de producto
(Random.Poisson(TableSKU.Mixture)).
Paso 4: Abra el fichero Excel otra vez, y añada cinco filas más (Figura 25.17: Añadiendo Cuatro Nuevas
SKU en la Hoja de Cálculo).
Los pedidos OrderAmt podrían haber sido también un vector en vez de un escalar.
Los mismos conceptos de este capítulo se pueden incorporar en el objeto SUPPLYINVSERVER del
Capítulo 22, referenciando la tabla desde una propiedad.
El proceso “OnInitialized” se puede utilizar para fijar la variable CurrentCapacity de las
tres operaciones para incluir el número de productos, NumSKUs.
Índice 251
M Bidirectional, 32
Selection Weight Property, 19
Material (Material), 66 Travel Time, 38
Math (Matemática), 91 Pivot Grid, 15, 221
Epsilon, 140 Priority
If, 91 InitialPriority Property, 22
Is, 147 Priority State Variable, 22
Max, 105 Process
Min, 105 Create Process, 46
Model (Modelo), 2 OnInitialized, 77
ModelEntity Override (Desactivar), 162
Initial Desired Speed, 27 Processed, 63
Initial Sequence, 31 Processing, 49
ModelEntity (Entidad), 2 Restore (Restablecer), 162
Modelo Process Steps (Etapas de Proceso)
Model Properties, 2 Assign (Asignar), 45
Modelos Create (Crear), 107
Aeropuerto, 12 Decide (Decidir), 47
Aeropuerto Bis, 18 Delay (Retrasar), 49
Almacén, 152 Destroy (Destruir), 205
Cadena de Suministro con Múltiples Productos, 246 EndTransfer (Acabar Transferencia), 172
Cadena de Suministros Simple, 102 Execute (Ejecutar), 155
Cadenas de Suministros Avanzada, 194 Fire (Disparar), 82
Carril de Transferencia, 56 Insert (Insertar), 182
Célula de Fabricación, 27 Interrupt (Interrumpir), 84
Célula de Fabricación bis, 51 Release (Liberar, Soltar), 50
Clínica de Cuidados Intensivos, 88 Remove (Retirar), 84
Clínica de Cuidados Intensivos bis, 94 Remove (Sacar), 182
Clínica Veterinaria, 117 Ride (Transportar), 148
Clínica Veterinaria bis, 126 Route (Dirigir, Enviar), 161
Clínica Veterinaria Tres, 131 Search (Buscar), 83, 146
Ensamblaje de Tarjetas de Memoria, 35 Seize (Apresar, Agarrar), 49
Ensamblaje de Tarjetas de Memoria bis, 44 Set Node (Fijar Nodo), 84
Ensamblaje de una Maqueta, 62 Set Table (Fijar Tabla), 55
Gasolinera, 78 Tally (Contar), 46
La Tienda de Helado, 3 Transfer (Transferir), 84
Línea de Camisas, 185 UnBatch (Desagrupar), 48
Objeto Delay (Retardo), 159 Wait (Esperar), 81
Objeto Delay bis, 168 Project Management (Gestión de Proyectos)
Planificación de Procesos/Gestión de Proyectos, 211 Critical Path (Camino Crítico), 211
Sistemas Kanban con Operarios Multidisciplinares, Earliest Finish (Finalización Más Temprana), 212
230 Latest Finish (Finalización Más Tardía), 212
Sucursal de un Banco, 141 Percent CP(Critical Path) (Criticidad), 212
Tanque Simple, 74 Slack (Holgura), 212
Una Célula de Fabricación, 178 Properties (Propiedades)
Monitor (Controlador, Monitorizador), 70 Element Reference, 173
Multiple SKUs, 246 Object Reference, 126
Repeat Group, 176
O Standard Property, 22
Property, 23
OptQuest, 112
Constraints, 114
R
P Ranking y selección, 111
Rate Table, 20
Paneles Reference Property, 38
[Project Library], 7 Referenced Property, 127
[Standard Library], 3 Reneging (Abandonar una Fila), 83
Navigation Panel, 2 Repeating Property Editor, 36
Paths (Caminos), 19 Bill of Materials, 66
Índice 253