Simio
- Bienvenida
- Standard Library
- Expresiones
- Processes
- Ejemplos
- Escogiendo la cola más corta
- Simbit: Reposición de inventarios
- Simbit: Servidor con consumo de materiales
- Simbit: Inventarios y materiales
- Preguntas/Problemas Frecuentes
Bienvenida
¡Hola!
Esta sección busca recopilar información sobre Simio, el software de simulación. Fue creada para apoyar a los cursos de Simulación de la Escuela de Ingeniería Industrial de la Pontificia Universidad Católica de Valparaíso, y para contribuir a generar más material en español. Esperamos que te sirva y, ¡éxito en el estudio!
Para comenzar puedes ingresar aquí
Otras fuentes de información
La Wiki se encuentra en una etapa temprana, por lo que es muy probable que no encuentres todo lo que necesites. A continuación te dejamos otros sitios que puedes visitar para obtener más información sobre Simio. Lamentablemente algunas de estas fuentes están disponibles solo en inglés.
- Learning Simio Lab Series, por Jeff Smith (en inglés): Esta es una serie de videotutoriales que enseña varias características esenciales de Simio, además de algunas más avanzadas. Los ejemplos trabajados se encuentran disponibles para descargar.
- Tutorial de Simio, por Álvaro García (en español): Videotutoriales sobre lo esencial de Simio.
- Simio Reference Guide (en inglés): Guía de referencia de Simio. Contiene la documentación detallada de todos los componentes del software.
¿Tienes dudas, recomendaciones o te gustaría aportar a la Wiki?
Puedes escribirnos a simula.eii@gmail.com.
Standard Library
La Standard Library, o librería estándar, es un conjunto de objetos predefinidos que representan elementos comúnmente utilizados en el desarrollo de modelos de simulación: servidores, calles, vehículos, trabajadores, entre otros.
A pesar de que estos objetos son parte de Simio, su funcionamiento no es "mágico", ya que son creados dentro de la aplicación siguiendo las mismas técnicas que aprenderás tú.
Simio sigue un paradigma de orientación a objetos, lo que habilita a un usuario avanzado a modificar el funcionamiento de los objetos de la librería o combinar varios de ellos creando así un "superobjeto”.
A continuación puedes ver cada uno de los elementos de la Standard Library.
Source
Objeto | Source |
Función | Creación de entidades |
Clase | Fixed |
Process Triggers | Run Initialized, Run Ending, Creating Entities, Created Entity, Exited |
Asignación de estados | Before Exiting, On Balking, On Reneging |
Este objeto permite la creación de entidades de un cierto tipo. Esto puede ocurrir según una tasa específica, un patrón de llegada o como respuesta a un Evento.
Cuenta con un buffer de salida (Output Buffer) en el cual las entidades pueden esperar para salir del objeto por medio de su nodo de salida (Output).
Modos de llegada (Arrival Modes)
Simio soporta los siguientes modos de llegada:
- Tiempo entre llegadas (Interarrival Time): Las entidades se generan según la tasa indicada por la propiedad Interarrival Time, que representa el intervalo de tiempo entre dos llegadas consecutivas.
- Tasa dinámica (Time Varying Arrival Rate): En este caso la tasa de llegadas no es fija y se obtiene de la propiedad Rate Table, que entrega diferentes tasas según la hora de la simulación. Por ejemplo, se desea modelar una tasa elevada en las primeras horas del día, una disminución gradual hasta la hora de almuerzo y después un aumento hasta el peak, antes de la hora de cierre.
- Por evento (On Event): Se generará una llegada solamente cuando se dispare el evento definido en la propiedad Event Name. Se puede utilizar cuando las llegadas dependen de alguna acción dentro de la simulación. Ejemplo: se genera una órden de trabajo a un operador logístico cuando el proceso de producción ha terminado.
- Tabla de llegadas (Arrival Table): Las llegadas están definidas en una tabla que contiene la hora en la que esta deberá ser generada. La columna que tiene la fecha y hora se indica en la propiedad Arrival Time Property. Para más información se recomienda ver el SimBit: Appointment Arrivals.
Detener la creación de entidades
Revisar las propiedades: Maximum Arrivals, Maximum Time y Stopping Event.
Objeto Source visto en vista Facility (2D)
Algunas propiedades
Propiedad | Tipo | Descripción |
Entity Type (Tipo de entidad) | Nombre de instancia de entidad | El tipo de entidad a generar. |
Arrival Mode (Modo de llegada) |
Interarrival Time, Time Varying ArrivalRate, On Event, Arrival Table |
El modo utilizado para generar el flujo de llegadas. |
Time Offset | Expression | Representa un tiempo a esperar antes de generar la primera llegada. |
Interarrival Time (Tiempo entre llegadas) | Expression | Intervalo de tiempo entre dos llegadas sucesivas. Esta propiedad suele ser especificada utilizando distribuciones de probabilidad. Ver Distribuciones de probabilidad. |
Entities Per Arrival (Entidades por llegada) | Expression (truncada a entero) | Número de entidades que serán creadas en cada llegada. |
Initial Number Entities | Expression | Número inicial de entidades a crear al comienzo de la simulación, adicionalmente a los creados en el modo On Event. No son incluidos en los Maximum Arrivals. |
Maximum Arrivals | Expression (truncada a entero) | Cantidad máxima de llegadas que generará este objeto. |
Maximum Time | Expression | Tiempo contado desde el inicio de la simulación hasta el cual el objeto dejará de generar llegadas. |
Stop Event Name | Event | Evento que al ser disparado hará que el Source deje de generar llegadas. |
Add-On Process Triggers
Trigger | Descripción |
Run Initialized | Ocurre cuando la simulación es iniciada. |
Run Ending | Ocurre cuando la simulación está terminando. |
Creating Entities | Ocurre cuando el objeto está por crear una llegada. |
Created Entity | Ocurre cuando una entidad ha sido creada por el objeto. |
Exited | Ocurre cuando una entidad ha salido del objeto. |
Sink
Objeto | Sink |
Función | Destrucción de entidades |
Clase | Fixed |
Process Triggers | Run Initialized, Run Ending, Entered, Destroying Entity |
Asignación de estados | On Entering |
Este objeto destruye las entidades que ingresan a él, además, puede guardar estadísticas como el tiempo en sistema (Time In System).
Cuenta con un buffer de entrada (Input Buffer).
Objeto Sink visto en vista Facility (2D)
Algunas propiedades
Propiedad | Tipo | Descripción |
Transfer-In Time | Expression | Tiempo requerido para transferir una entidad a este objeto. |
On Entering | Assignments | Estados a asignar cuando una entidad entra en el objeto. (Opcional) |
Add-On Process Triggers
Trigger | Descripción |
Run Initialized | Ocurre cuando la simulación es iniciada. |
Run Ending | Ocurre cuando la simulación está terminando. |
Entered | Ocurre cuando una entidad ha entrado al objeto y está por empezar el Transfer-In Time. |
Destroying Entity | Ocurre cuando una entidad está a punto de ser destruida por el objeto. |
Server
Objeto | Server |
Función | Procesamiento de entidades |
Clase | Fixed |
Process Triggers | Run Initialized, Run Ending, Entered, Before Processing, Processing, After Processing, Exited, Failed, Repaired, Evaluating Seize Request, On Shift, Off Shift |
Asignación de estados | On Entering, Before Processing, After Processing, Before Exiting, On Balking, On Reneging |
Este objeto representa un proceso capacitado, por ejemplo: una máquina o un cajero de supermercado.
Cuenta con un nodo de entrada y un buffer de entrada (Input Buffer); un nodo de salida y un buffer de salida (Output Buffer); y una cola que representa a las entidades actualmente siendo procesadas (Processing).
Por defecto, las entidades ingresan al Input Buffer y esperan hasta que exista capacidad disponible para procesar a la siguiente entidad, luego es transferida a la cola de Processing hasta que finalice su procesamiento. Finalmente la entidad entra al Output Buffer y espera hasta que pueda salir del objeto.
El tiempo de proceso está dado por la propiedad Processing Time.
Tipos de capacidad (Capacity types)
La capacidad representa la cantidad de entidades que el objeto puede procesar de manera simultánea.
- Fija (Fixed): La capacidad estará dada por la propiedad Initial Capacity. Esta puede ser una expresión, pero solo es evaluada al comienzo de la simulación. La capacidad puede ser modificada durante la simulación asignándole un nuevo valor al estado CurrentCapacity del objeto (Ej: MiObjeto.CurrentCapacity)
- Horario de trabajo (Work Schedule): Para utilizar este tipo, se debe definir un Work Schedule en la pestaña Data. Este modo permite asignar un horario de trabajo al objeto, de manera que automáticamente comienza a procesar entidades cuando comienza su turno (On Shift) y deja de procesarlas cuando el turno termina (Off Shift).
Prioridades
Simio permite utilizar políticas para decidir cuál entidad será la siguiente en ser procesada. Existen dos tipos de Rankings.
- Reglas estáticas (Static Ranking Rules): Estas reglas determinan la ubicación de la entidad en la cola, cuando esta ingresa a la cola.
- Reglas dinámicas (Dynamic Selection Rules): Estas reglas permiten que el objeto determine de manera dinámica la próxima entidad a ser procesada, es decir, el lugar no es definido cuando la entidad ingresa, sino cuando el Server está listo para procesar a la siguiente entidad.
Reglas estáticas
- First In First Out (FIFO): La primera entidad que ingresó es la primera en ser procesada.
- Last In First Out (LIFO): La última entidad en ingresar será la primera en ser procesada.
- Smallest Value First: Ordenará las entidades según la expresión definida en la propiedad Ranking Expression de menor a mayor.
- Largest Value First: Ordenará las entidades según la expresión definida en la propiedad Ranking Expression de mayor a menor.
Reglas dinámicas
- Smallest Value First: Misma lógica de la versión estática. Ordena según la propiedad Value Expression.
- Largest Value First: Misma lógica de la versión estática. Ordena según la propiedad Value Expression.
- Standard Dispatching Rule: Esta opción permite utilizar una de varias políticas de planificación implementadas por Simio tales como: SPT, LPT, EDD, LST, entre otros.
Estados
El estado de este objeto se puede verificar en el State de tipo entero ResourceState. Ej.: MiObjeto.ResourceState
Valor | Estado |
0 | Disponible |
1 | Procesando |
2 | Bloqueado |
3 | Falla |
4 | Fuera de turno |
5 | Falla de procesamiento |
6 | Procesando fuera de turno |
7 | Setup |
8 | Setup de turno |
Objeto Server visto en vista Facility (2D)
Algunas propiedades
Propiedad | Tipo | Descripción |
Capacity Type | Fixed, Work Schedule | Indica el tipo de capacidad del Server. |
Initial Capacity | Expression | Capacidad inicial del Server. Se evalúa al comenzar la simulación. |
Ranking Rule | List |
Regla estática a utilizar para ordenar las entidades en espera. |
Ranking Expression | Expression |
Valor utilizado por las reglas Smallest/Largest Value First para ordenar las entidades. |
Dynamic Selection Rule | List |
Indica si este objeto seleccionará de manera dinámica la próxima entidad a ser procesada utilizando una regla dinámica de selección. |
Transfer-In Time | Expression |
El tiempo requerido para transferir una entidad a este objeto. |
Processing Time | Expression |
Tiempo requerido para procesar una entidad. Normalmente asignado con distribuciones de probabilidad. |
Off Shift Rule | List |
Indica la política que utilizará el objeto para determinar qué hacer cuando se acabe el turno y exista una entidad en proceso.
Suspend Processing: se suspende el procesamiento y continua en el siguiente turno. Finish Work Already Started: no procesará nuevas entidades pero terminará las que se encuentran actualmente en proceso.
|
Add-On Process Triggers
Trigger | Descripción |
Run Initialized | Ocurre cuando la simulación es iniciada. |
Run Ending | Ocurre cuando la simulación está terminando. |
Entered | Ocurre cuando una entidad ha entrado al objeto y está por empezar el Transfer-In Time. |
Before Processing | Ocurre cuando le ha sido asignada capacidad del Server a la entidad, pero aún no ingresa a la estación de proceso. |
Processing | Ocurre cuando la entidad ha sido transferida a la estación de proceso y está a punto de comenzar su procesamiento. |
After Processing | Ocurre cuando la entidad ha completado su procesamiento y está por salir de la estación de proceso. |
Exited | Ocurre cuando una entidad ha salido del objeto. |
Failed | Ocurre cuando este objeto ha fallado. |
Repaired | Ocurre cuando este objeto ha sido reparado. |
Evaluating Seize Request | Ocurre cuando el objeto está determinando si aceptará o no la solicitud de capacidad por parte de la entidad. Para rechazar se debe asignar un valor negativo al ReturnValue del Token. |
On Shift | Ocurre cuando el objeto está al inicio de un turno definido en su Work Schedule. |
Off Shift | Ocurre cuando el objeto está al término de un turno definido en su Work Schedule. |
Combiner
Objeto | Combiner |
Función | Agrupación de entidades |
Clase | Fixed |
Process Triggers | Run Initialized, Run Ending, Parent Entered, Member Entered, Before Processing, Processing, After Processing, Exited, Failed, Repaired, Evaluating Seize Request, On Shift, Off Shift |
Asignación de estados | On Parent Entering, On Member Entering, Before Processing, After Processing, Before Exiting, On Balking, On Reneging |
Este objeto permite crear grupos de entidades y asociarlos a una entidad representativa. Las entidades a agrupar se denominan miembros (Member Entity) y la entidad representativa se conoce como entidad padre (Parent Entity). Al grupo de entidades miembro se le llama Batch.
El objeto cuenta con dos nodos de entrada y uno de salida (Output). El primer nodo de entrada (ParentInput) recibe a las entidades padre y el segundo (MemberInput) a las entidades miembro. Cada grupo está compuesto únicamente de una entidad padre y el número de entidades miembro está definido en la propiedad Batch Quantity.
Las entidades, luego de ingresar, esperan en sus respectivos buffers de entrada hasta que se cumpla que existe al menos una entidad en la cola de entidades padre y un número de entidades miembro igual a lo definido en la propiedad Batch Quantity. Cumplido este requisito, las entidades pasan a la cola de procesamiento, el batch es creado y es asignado a la entidad padre. Finalmente la entidad padre abandona el objeto a través de su nodo de salida.
Este objeto permite asignar un tiempo de proceso a la etapa de agrupación, este se define en la propiedad Processing Time.
Tipos de capacidad (Capacity types)
La capacidad representa la cantidad de entidades que el objeto puede procesar de manera simultánea.
- Fija (Fixed): La capacidad estará dada por la propiedad Initial Capacity. Esta puede ser una expresión, pero solo es evaluada al comienzo de la simulación. La capacidad puede ser modificada durante la simulación asignándole un nuevo valor al estado CurrentCapacity del objeto (Ej: MiObjeto.CurrentCapacity)
- Horario de trabajo (Work Schedule): Para utilizar este tipo, se debe definir un Work Schedule en la pestaña Data. Este modo permite asignar un horario de trabajo al objeto, de manera que automáticamente comienza a procesar entidades cuando comienza su turno (On Shift) y deja de procesarlas cuando el turno termina (Off Shift).
Objeto Combiner visto en vista Facility (2D)
Algunas propiedades
Propiedad | Tipo | Descripción |
Batch Quantity | Expression truncada a entero. | Tamaño del batch. Corresponde al número de entidades miembro que se deben esperar antes de agruparlas y asociarlas a la entidad padre. |
Initial Capacity | Expression |
Capacidad inicial del Combiner. Corresponde a la cantidad de batchs que se pueden procesar de forma simultánea. Se evalúa al comenzar la simulación. |
Parent Transfer-In Time y Member Transfer-In Time | Expression |
Corresponde al tiempo que toma transferir una entidad al Combiner.
Estos tiempos corren de forma simultánea. Por ejemplo, si los tiempos de transferencia de la entidad padre y las entidades miembro son 1 y 2 minutos respectivamente, y, suponiendo que ambas llegan al mismo tiempo, entonces en el minuto 2 ambas estarán listas para ser procesadas. |
Off Shift Rule | List |
Indica la política que utilizará el objeto para determinar qué hacer cuando se acabe el turno y exista una entidad en proceso.
Suspend Processing: se suspende el procesamiento y continua en el siguiente turno. Finish Work Already Started: no procesará nuevas entidades pero terminará las que se encuentran actualmente en proceso. |
Add-On Process Triggers
Trigger | Descripción |
Run Initialized | Ocurre cuando la simulación es iniciada. |
Run Ending | Ocurre cuando la simulación está terminando. |
Parent Entered | Ocurre cuando una entidad padre ha entrado al objeto y está por empezar el Parent Transfer-In Time. |
Member Entered | Ocurre cuando una entidad miembro ha entrado al objeto y está por empezar el Member Transfer-In Time. |
Before Processing | Ocurre cuando le ha sido asignada capacidad del Combiner a la entidad padre pero esta aún no ingresa a la estación de proceso. |
Processing | Ocurre cuando la entidad padre ha sido transferida a la estación de proceso y está a punto de comenzar su procesamiento. |
After Processing | Ocurre cuando la entidad padre ha completado su procesamiento y está por salir de la estación de proceso. |
Exited | Ocurre cuando una entidad padre y su batch han salido del objeto. |
Failed | Ocurre cuando este objeto ha fallado. |
Repaired | Ocurre cuando este objeto ha sido reparado. |
Evaluating Seize Request | Ocurre cuando el objeto está determinando si aceptará o no la solicitud de capacidad por parte de la entidad. Para rechazar se debe asignar un valor negativo al ReturnValue del Token. |
On Shift | Ocurre cuando el objeto está al inicio de un turno definido en su Work Schedule. |
Off Shift | Ocurre cuando el objeto está al término de un turno definido en su Work Schedule. |
Separator
Objeto | Separator |
Función | Desagrupación, copia y creación de entidades |
Clase | Fixed |
Process Triggers | Run Initialized, Run Ending, Entered, Before Processing, Processing, After Processing, Parent Exited, Member Exited, Failed, Repaired, Evaluating Seize Request, On Shift, Off Shift |
Asignación de estados | On Entering, Before Processing, After Processing, Before Parent Exiting, Before Member Exiting, On Balking, On Reneging |
Este objeto tiene como función principal la de separar un batch de su entidad padre (ver Combiner). Cuenta con un nodo de entrada (Input) y dos nodos de salida: el primero para la entidad padre (ParentOutput) y el segundo para las entidades miembro (MemberOutput). Cada nodo de salida cuenta con su respectiva cola o buffer de salida.
Modos de operación (Separation Mode)
A pesar de que por defecto este objeto opera como el inverso al Combiner, en realidad tiene 3 modos de operación o de separación. Además, este objeto permite asignarle un tiempo de proceso, este se especifica en la propiedad Processing Time.
-
Separar (Split Batch): Modo por defecto. Funciona de forma inversa al Combiner: recibe en su nodo de entrada a una entidad padre con su batch, lo procesa y los separa, saliendo la entidad padre por el nodo de salida ParentOutput y las entidades miembro por el nodo MemberOuput. Este modo permite especificar por medio de la propiedad, Desired Split Quantity, cuántos miembros serán removidos del batch. Si el batch es más grande que la cantidad definida, la entidad padre saldrá del objeto con las entidades que no fueron removidas (sigue teniendo un batch, pero con menos entidades).
-
Copiar (Make Copies): Este modo hará que el Separator cree copias de la entidad entrante. La cantidad de copias a crear se define en la propiedad Copy Quantity y el tipo de entidad se define en la propiedad Copy Entity Type (por defecto creará una copia del mismo tipo). La entidad original sale por el nodo ParentOutput, las copias por el nodo MemberOutput. Simio se encargará de copiar los valores de los atributos desde el original a las copias.
- Crear (Create New): Similar al modo de copia, pero sin copiar los atributos. La cantidad a crear se define en la propiedad New Entity Quantity y el tipo en la propiedad New Entity Type. La entidad original sale del objeto usando el nodo ParentOutput y las nuevas entidades usando el nodo MemberOutput.
Tipos de capacidad (Capacity types)
La capacidad representa la cantidad de entidades que el objeto puede procesar de manera simultánea.
- Fija (Fixed): La capacidad estará dada por la propiedad Initial Capacity. Esta puede ser una expresión, pero solo es evaluada al comienzo de la simulación. La capacidad puede ser modificada durante la simulación asignándole un nuevo valor al estado CurrentCapacity del objeto (Ej: MiObjeto.CurrentCapacity)
- Horario de trabajo (Work Schedule): Para utilizar este tipo, se debe definir un Work Schedule en la pestaña Data. Este modo permite asignar un horario de trabajo al objeto, de manera que automáticamente comienza a procesar entidades cuando comienza su turno (On Shift) y deja de procesarlas cuando el turno termina (Off Shift).
Objeto Separator visto en vista Facility (2D)
Algunas propiedades
Propiedad | Tipo | Descripción |
Separation Mode | List | Modo de operación. Ver arriba para más detalles. |
Desired Split Quantity | Expression | Número de entidades a extraer del batch. |
Removal Order | List |
Orden en que se remueven las entidades del batch. LastBatchedFirst: LIFO |
Copy Quantity | Expression | Número de copias a crear. |
Copy Entity Type | Nombre de entidad | Tipo de entidad a crear. |
New Entity Quantity | Expression | Número de entidades a crear. |
New Entity Type | Nombre de entidad | Tipo de entidad a crear. |
Initial Capacity | Expression |
Capacidad inicial del Separator. Corresponde a la cantidad de entidades que se pueden procesar de forma simultánea. Se evalúa al comenzar la simulación. |
Transfer-In Time | Expression |
Corresponde al tiempo que toma transferir una entidad al Separator. |
Off Shift Rule | List |
Indica la política que utilizará el objeto para determinar qué hacer cuando se acabe el turno y exista una entidad en proceso.
Suspend Processing: se suspende el procesamiento y continua en el siguiente turno. Finish Work Already Started: no procesará nuevas entidades pero terminará las que se encuentran actualmente en proceso. |
Add-On Process Triggers
Trigger | Descripción |
Run Initialized | Ocurre cuando la simulación es iniciada. |
Run Ending | Ocurre cuando la simulación está terminando. |
Entered | Ocurre cuando una entidad ha entrado al objeto y está por empezar el Transfer-In Time. |
Before Processing | Ocurre cuando le ha sido asignada capacidad del Separator a la entidad pero esta aún no ingresa a la estación de proceso. |
Processing | Ocurre cuando la entidad padre ha sido transferida a la estación de proceso y está a punto de comenzar su procesamiento. |
After Processing | Ocurre cuando la entidad padre ha completado su procesamiento y está por salir de la estación de proceso. |
Parent Exited | Ocurre cuando una entidad padre ha salido del objeto. |
Member Exited | Ocurre cuando una entidad miembro ha salido del objeto. |
Failed | Ocurre cuando este objeto ha fallado. |
Repaired | Ocurre cuando este objeto ha sido reparado. |
Evaluating Seize Request | Ocurre cuando el objeto está determinando si aceptará o no la solicitud de capacidad por parte de la entidad. Para rechazar se debe asignar un valor negativo al ReturnValue del Token. |
On Shift | Ocurre cuando el objeto está al inicio de un turno definido en su Work Schedule. |
Off Shift | Ocurre cuando el objeto está al término de un turno definido en su Work Schedule. |
Connector
Objeto | Connector |
Función | Enlazar nodos |
Clase | Link |
Process Triggers | - |
Asignación de estados | - |
Este objeto es el más simple de los de clase Link o de enlace. Representa una conexión instantánea entre dos nodos (distancia 0). A diferencia de los otros objetos de esta clase, las entidades nunca entran en un Connector sino que se realiza una transferencia directa desde el nodo de origen o inicio al nodo de término o destino. Además, las entidades utilizan este objeto de una en una, las entidades que desean utilizar el Connector entran a una cola, de la que son removidas en la medida que este se encuentre disponible.
Debido a que este es el enlace más sencillo, solo tiene la propiedad Selection Weight que puede ser utilizada por las entidades para escoger qué enlace utilizar al salir de un nodo.
Cómo utilizarlos
Este objeto se utiliza igual que los otros de la clase Link, debes seleccionarlos en la librería, hacer click en el nodo de origen y luego en el nodo de destino.
Objeto Connector uniendo dos nodos en vista Facility (2D)
Propiedades
Propiedad | Tipo | Descripción |
Selection Weight | Expression |
Expresión utilizada para definir la ponderación o peso que tiene este objeto a la hora de escoger un enlace al salir de un nodo. Ejemplo: Un enlace con el doble de peso que otro, tiene el doble de probabilidades de ser escogido.
Puede ser una expresión lógica: Verdadero = 1, Falso = 0. |
Path
Objeto | Path |
Función | Enlazar nodos |
Clase | Link |
Process Triggers | Run Initialized, Run Ending, Entered, Trailing Edge Entered, Reached End, Exited |
Asignación de estados | On Entering, Before Entering |
El objeto Path permite definir una vía entre dos nodos en la cual el tiempo de viaje está determinado por la longitud del Path y la velocidad de la entidad que viaja a través de él. Este objeto permite representar elementos como caminos, carreteras, o simplemente facilitar la conexión de los distintos elementos del modelo.
La vista Facility de Simio permite crear los modelos a escala. Debido a esto, el objeto Path por defecto detecta la longitud en base a la distancia que cubre en la vista Facility. Si se desea especificar la longitud de forma manual se deben utilizar las propiedades Drawn To Scale y Logical Length.
Si se desea limitar la cantidad de entidades que pueden utilizar el Path en un determinado instante, se puede utilizar la propiedad Initial Traveler Capacity.
Al igual que los otros objetos de la clase Link, este objeto tiene la propiedad Selection Weight. Esta propiedad puede ser utilizada por las entidades para escoger qué enlace utilizar al salir de un nodo.
Tipos
- Unidireccional (Unidirectional): Las entidades pueden moverse solamente en una dirección.
- Bidireccional (Bidirectional): Las entidades pueden moverse en ambas direcciones. Sin embargo, solo puede haber flujo en una dirección a la vez, debido a esto existen posibilidades de que las entidades se bloqueen mutuamente. Si se desea tener flujos simultáneos en direcciones opuestas, se deberá usar dos objetos Path de tipo unidireccional, uno para cada sentido.
Cómo utilizarlos
Este objeto se utiliza igual que los otros de la clase Link, debes seleccionarlos en la librería, hacer click en el nodo de origen y luego en el nodo de destino.
Dos objetos Path en vista Facility (2D)
Algunas propiedades
Propiedad | Tipo | Descripción |
Type | List | El sentido del tráfico por este objeto. Puede ser unidireccional o bidireccional. |
Initial Traveler Capacity | Expression | La cantidad inicial de entidades que pueden ocupar simultáneamente este objeto. |
Drawn To Scale | Boolean | Especifica si se debe usar la longitud del objeto en la vista Facility para la lógica de la simulación. Si este valor es False, se debe especificar también la propiedad Logical Length. |
Logical Length | Double | Longitud del enlace cuando no se utiliza la escala de la vista Facility. |
Allow Passing | Boolean | Indica si las entidades pueden adelantarse entre ellas cuando sus velocidades difieren. |
Speed Limit | Double | Velocidad máxima a la que pueden viajar las entidades al utilizar este objeto. |
Selection Weight | Expression |
Expresión utilizada para definir la ponderación o peso que tiene este objeto a la hora de escoger un enlace al salir de un nodo. Ejemplo: Un enlace con el doble de peso que otro, tiene el doble de probabilidades de ser escogido.
Puede ser una expresión lógica: Verdadero = 1, Falso = 0. |
Add-On Process Triggers
Trigger | Descripción |
Run Initialized | Ocurre cuando la simulación es iniciada. |
Run Ending | Ocurre cuando la simulación está terminando. |
Entered | Ocurre cuando una entidad (su parte frontal) entra en este objeto. |
Trailing Edge Entered | Ocurre cuando la parte trasera de una entidad entra a este objeto. |
Reached End | Ocurre cuando una entidad (su parte frontal) ha alcanzado el final de este objeto. |
Exited | Ocurre cuando una entidad ha dejado el objeto. |
Expresiones
Expressions y el Expression Editor
Expresiones en Simio
Al igual que en los lenguajes de programación, una Expression (expresión) en Simio es una combinación de una o más constantes, variables, operadores y funciones que son interpretadas (evaluadas) para generar un valor de retorno. (Fuente: Wikipedia)
En Simio, la creación de expresiones se realiza por medio del Expression Editor o editor de expresiones. Este se encuentra en la ventana de propiedades para distintas propiedades que acepten este tipo de valor. Para abrirlo basta con seleccionar la propiedad que se desea editar y luego hacer click en el botón ubicado en el extremo derecho en forma de flecha hacia abajo ().
Utilizando el Expression Editor o editor de expresiones para definir una distribución de probabilidad.
Por medio de las expresiones y con la ayuda del editor de expresiones, se pueden definir distribuciones de probabilidad, realizar operaciones matemáticas, acceder a propiedades y estados de objetos, llamar a las funciones incluidas de Simio, acceder a la hora en el reloj de la simulación, entre muchas otras. La sintaxis utilizada le será familiar a aquellos que hayan programado en lenguajes de programación tradicionales como Java.
Algunas constantes o palabras reservadas
Nombre | Descripción |
True | Valor boolean que representa el valor de verdad verdadero. Tiene un valor numérico equivalente a 1. |
False | Valor boolean que representa el valor de verdad falso. Tiene un valor numérico equivalente a 0. |
Infinity | Representa un valor numérico de infinito. |
Nothing | Similar a el null de algunos lenguajes de programación. Representa una referencia nula. |
ParentObject | Representa una referencia al objeto padre que contiene a la expresión. |
Is | Is seguido del nombre de la definición de un objeto retorna True si el objeto sobre el cual se invoca este método es una instancia de dicha definición. Ej: MiServidor.Is.Server == True |
TimeNow | Retorna el reloj de la simulación, en horas. |
Operadores matemáticos y lógicos
Operador | Descripción |
== | Igual a |
> | Mayor que |
< | Menor que |
>= | Mayor o igual que |
<= | Menor o igual que |
&& | Y (and) |
|| | O (or) |
! | No (not). Invierte el resultado de una expresión lógica. |
!= | Distinto a |
+ | Adición |
- | Sustracción |
* | Multiplicación |
/ | División |
^ | Potencia (elevado a) (2^3 == 8) |
Distribuciones de probabilidad
Random.Distribución
Simio soporta varias distribuciones de probabilidad para la generación de números aleatorios. Estas se utilizan de la forma Random.Distribución(Parámetros)
Editor de expresiones mostrando la lista de distribuciones implementadas en Simio.
Distribuciones y sus parámetros
A continuación se definen las distribuciones implementadas en Simio con sus parámetros.
Distribución | Función y parámetros | Descripción |
Bernoulli | Random.Bernoulli(probabilidadDeÉxito) | Esta distribución retorna un valor 0 o 1. El parámetro es la probabilidad de obtener 1. |
Beta | Random.Beta(alpha1, alpha2) | Distribución con rango 0 a 1 cuya forma depende de sus parámetros de forma alpha1 y alpha2. |
Binomial | Random.Binomial(probabilidadDeÉxito, númeroDePruebas) | Distribución que representa el número de éxitos en una cantidad especificada de pruebas. |
Continua | Random.Continuous(v1, c1, v2, c2, ..., vn, cn) |
Distribución empírica definida por un conjunto de pares de la forma (vi, ci) correspondiente a un valor y su probabilidad acumulada. Devuelve un número real ubicado entre 0 y vn.
Esta distribución tiene implícito un v0 igual a 0, si se desea que los valores partan en v1 se debe especificar c1 como 0. |
Discreta | Random.Discrete(v1, c1, v2, c2, ..., vn, cn) |
Distribución empírica definida por un conjunto de pares de la forma (vi, ci) correspondiente a un valor y su probabilidad acumulada. Devuelve solamente uno de los n valores definidos.
Ejemplo: Random.Discrete(1, 0.2, 2, 0.5, 3, 1) devuelve solo los valores 1, 2 o 3, con un 20%, 30% y 50% de probabilidad, respectivamente. |
Erlang | Random.Erlang(media, k) | Distribución que modela un proceso de n-fases en el que el tiempo para cada fase está distribuido de forma exponencial. Los parámetros corresponden a la media y el número de fases (k). |
Exponencial | Random.Exponential(media) | Distribución utilizada normalmente para modelar el tiempo entre llegadas. Recibe como parámetro la media de la distribución. |
Gamma | Random.Gamma(alpha, beta) | Distribución que recibe un parámetro de forma (alpha) y otro de escala (beta). La media es el producto de estos parámetros. |
Geométrica | Random.Geometric(probabilidadDeÉxito) | Distribución discreta que representa el número de fallas antes del primer éxito. El parámetro representa la probabilidad de éxito para cada prueba independiente. |
JohnsonSB | Random.JohnsonSB(alpha1, alpha2, mínimo, máximo) | Distribución acotada cuya forma depende de sus dos parámetros de forma (alpha1, alpha2), el mínimo y el máximo. |
JohnsonSU | Random.JohnsonSU(alpha1, alpha2, ubicación, escala) | Distribución no acotada cuya forma depende de sus dos parámetros de forma (alpha1, alpha2), el parámetro de ubicación y el parámetro de escala. |
LogLogistic | Random.LogLogistic(forma, escala) | Distribución con un parámetro de forma y uno de escala, ambos deben ser no negativos. Tiene un rango de 0 a infinito. |
Lognormal | Random.Lognormal(media, desviaciónEstándar) | Distribución continua en la que el logaritmo de una variable tiene una distribución normal. Sus parámetros son la media y la desviación estándar. |
Binomial Negativa | Random.NegativeBinomial( probabilidadDeÉxito, númeroDeÉxitos) |
Distribución discreta que representa el número de fallas antes de alcanzar el número especificado de éxitos. Los parámetros son la probabilidad de éxito para cada prueba y el número requerido de éxitos. |
Normal | Random.Normal(media, desviaciónEstándar) | Sus parámetros son la media y la desviación estándar. |
Pearson tipo VI | Random.PearsonVI(formaA, formaB, escala) | Distribución con dos parámetros de forma (formaA, formaB) y uno de escala (escala). Todos los parámetros deben ser no negativos. El rango es de 0 a infinito. |
Pert | Random.Pert(mínimo, moda, máximo) | Caso especial de la distribución Beta en la que los parámetros de forma son calculados a partir del mínimo, la moda y el máximo. |
Poisson | Random.Poisson(media) | Distribución discreta que modela el número de eventos en un intervalo de tiempo en el cual estos están ocurriendo a una tasa constante según un proceso Poisson. El tiempo entre eventos está distribuido de forma exponencial y el número de eventos en un tiempo determinado esta Poisson-distribuido. El parámetro es la tasa de eventos por unidad de tiempo, debe ser no negativa. |
Triangular | Random.Triangular(mínimo, moda, máximo) | Distribución que tiene parámetros para definir el mínimo, la moda o valor más probable y el máximo. |
Uniforme | Random.Uniform(mínimo, máximo) | Distribución cuyos parámetros definen el valor mínimo y máximo. Todos los valores dentro del rango son equiprobables. |
Weibull | Random.Weibull(forma, escala) | Distribución con parámetros de forma y escala cuyo rango va de 0 a infinito. |
Funciones matemáticas
Math.Función
Simio incorpora una serie de funciones matemáticas. Estas se utilizan de la forma Math.Función(Parámetros)
Editor de expresiones mostrando las funciones matemáticas incluidas en Simio.
Funciones y sus parámetros
Constantes y parámetros destacados en negrita.
Nombre | Función y parámetros | Descripción |
Valor absoluto | Math.Abs(valor) | Retorna el valor absoluto del valor especificado. El valor absoluto de un número es su magnitud sin signo. |
Arcocoseno | Math.Acos(valor) | Retorna el arcocoseno del valor especificado (en radianes). |
Arcoseno | Math.Asin(valor) | Retorna el arcoseno del valor especificado (en radianes). |
Arcotangente | Math.Atan(valor) | Retorna el arcotangente del valor especificado (en radianes). |
Techo | Math.Ceiling(valor) | Retorna el entero más pequeño pero no menor que el valor especificado. |
Coseno | Math.Cos(valor) | Retorna el coseno del valor especificado (en radianes). |
e | Math.E | Retorna la base del logaritmo natural. Constante matemática e. |
Epsilon | Math.Epsilon | Representa el número real más pequeño (representable) mayor que cero. |
Exponencial | Math.Exp(valor) | Retorna el resultado de elevar la constante e al valor especificado. |
Piso | Math.Floor(valor) | Retorna el entero más grande pero no mayor al valor especificado. |
Si | Math.If(condición1, valor1, condición2, valor2, ..., condiciónN, valorN, valorSino) | Retorna el n-avo valor asociado a la primera condición especificada que sea evaluada a True, si ninguna condición se cumple, retorna el valorSino. Ejemplo: Math.If(1==2, 1, 2==2, 3, 4) retorna 3. |
¿Es NaN? | Math.IsNaN(valor) | Retorna True si el valor es NaN, False si no lo es. |
Logaritmo Natural | Math.Log(valor) | Retorna el logaritmo natural del valor especificado. |
Logaritmo (en base 10) | Math.Log10(valor) | Retorna el logaritmo en base 10 del valor especificado. |
Máximo | Math.Max(valor1, valor2, ..., valorN) | Retorna el valor máximo entre los especificados. |
Mínimo | Math.Min(valor1, valor2, ..., valorN) | Retorna el valor mínimo entre los especificados. |
NaN | Math.NaN | Un valor indefinido o irrepresentable. |
π (pi) | Math.PI | Retorna la relación entre la circunferencia de un círculo y su diámetro. Constante matemática π. |
Potencia | Math.Pow(base, exponente) | Retorna el resultado de la base elevada al exponente. |
Resto o residuo | Math.Remainder(dividendo, divisor) | Retorna el resto o residuo de la división entre el dividendo y el divisor. |
Redondear | Math.Round(valor, [, dígitos]) |
Parámetro opcional: dígitos decimales. Retorna el valor redondeado (por defecto al entero más cercano). |
Seno | Math.Sin(valor) | Retorna el seno del valor especificado (en radianes). |
Raíz Cuadrada | Math.Sqrt(valor) | Retorna la raíz cuadrada del valor especificado. |
Suma de muestra aleatoria | Math.SumOfSamples(expresión, n) | Muestrea n veces, de forma independiente, la expresión aleatoria especificada y retorna la suma de los valores obtenidos. |
Tangente | Math.Tan(valor) | Retorna la tangente del valor especificado (en radianes). |
Processes
Process
Definición
Un Process (proceso), en Simio, es una secuencia de acciones que pueden o no tomar tiempo y modificar el estado del modelo. Un Process está compuesto por Steps y Tokens. Los procesos se pueden utilizar para personalizar el comportamiento de los objetos de la Standard Library.
Un proceso puede ser activado o desactivado asignando un 1 o un 0 al State MiProceso.Enabled. Si un Process se encuentra desactivado, cualquier intento de ejecutarlo será ignorado. Si la desactivación se realiza mientras existan instancias del Process en ejecución, estas terminarán normalmente.
Ejemplo de un Process en Simio.
Clasificación
Standard Processes
Estos procesos son ejecutados por Simio en puntos específicos de la corrida del modelo, muchas veces como respuesta a eventos internos del software.
Algunos procesos estándar son:
- OnRunInitialized: Este Process es ejecutado cuando el objeto o modelo es inicializado.
- OnCapacityChanged: Este Process es ejecutado cuando la capacidad del recurso ha cambiado.
- OnRunEnding: Este Process es ejecutado cuando el modelo está terminando de correr ya sea por presionar Reset o Stop (en modo interactivo) o porque se alcanzó la condición de término (modo interactivo o de experimentos.
Las opciones disponibles dependerán del objeto en el que se esté trabajando. Para definir un Process de este tipo se puede usar el botón Select Process.
Decision Processes
Estos procesos son un tipo especial de Standard Process. Son utilizados por algunos objetos para obtener un valor utilizado en la toma de una decisión. No pueden tomar tiempo (contener Delays).
- OnEvaluatingSeizeRequest: Utilizado para determinar si el recurso será o no entregado al objeto que lo está solicitando.
Add-on Processes
Los objetos de la Standard Library vienen con una serie de propiedades que permiten asignarle un Process creado por el usuario, para que este sea ejecutado en puntos determinados de la lógica del objeto. Por ejemplo: un objeto Server puede ejecutar un Process cuando va a comenzar el procesamiento de una entidad.
Step
Definición
Los Steps (pasos) son las acciones que se realizan en un Process y permiten definir lógica más compleja que la incluida en los objetos por defecto.
Ejemplo de un Process en Simio. En la imagen se pueden ver los Steps: Decide, Delay y SetNode
Puntos de Salida
Existen Steps que tienen más de un punto de salida (exit point). Algunos de estos son: Create, Find y Decide.
Los Steps pueden usar todos sus puntos de salidas, o estos pueden ser excluyentes. Por ejemplo: el Step Find solo utilizará uno de sus puntos de salida dependiendo de si pudo o no encontrar el elemento que se estaba buscando. El Step Create puede utilizar ambos de forma simultánea, esto se ejemplifica a continuación.
En el ejemplo se representa un modelo simplificado del procesamiento del pedido de un cliente. En este se crea una orden de trabajo, se le asignan valores, y se transfiere al área de producción, finalmente, el Token original sale del Create y va al Tally que registra las cotizaciones que son aceptadas.
Ejemplos
Escogiendo la cola más corta
El modelo está compuesto por:
- 1 Source (Llegada)
- 2 Servers (Norte, Sur)
- 1 Sink (Salida)
- Connectors y Paths
Objetivo: Hacer que las entidades, al llegar, tomen el camino hacia el servidor con la cola más corta en ese instante.
Supuestos: Las entidades no se pueden cambiar de cola. En caso de empate la elección es al azar.
Modelo de ejemplo
La solución está en los enlaces entre el Source y los Servers. Para entenderla debes leer las propiedades Selection Weight de los objetos Connector o Path, y la página sobre cuántos objetos hay en una cola.
Nótese que cuando las colas sean iguales, los pesos serán iguales a 0, en este caso Simio escogerá uno al azar.
Simbit: Reposición de inventarios
Politicas de reposicion de inventario.pdf Politicas de reposicion de inventario.spfx
En el presente SimBit se incluyen tres modelos que demuestran el uso de políticas de reposición de inventario para periodos de revisión tanto 'continuos' como 'periódicos'.
Cada modelo está compuesto por:
- 2 Source (BurgerSource, HotdogSource)
- 2 Servers (BurgerServer, HotdogServer)
- 2 Sink (BurgerSink, HotdogSink)
- Paths
Modelo 1: PuntoDeReordenCantidadDeReorden.
Objetivo: Muestra cómo crear una política de reposición de inventario incorporando un punto de reorden y una cantidad de reorden. Cuando el inventario cae al punto de reorden o por debajo, entonces se repone el inventario con la cantidad especificada.
Supuestos: Para un Período de Revisión Continua, el inventario se repone instantáneamente.
Modelo 2: OrderUpTo.
Objetivo: Muestra cómo crear una política de reposición de inventario hasta alcanzar un nivel máximo. Cuando el inventario cae por debajo del nivel máximo, entonces se repone el inventario hasta ese nivel.
Supuestos: Para un Período de Revisión Continua, el inventario se repone instantáneamente.
Modelo 3: MinMax.
Objetivo: Muestra cómo crear una política de reposición de inventario incorporando un punto de reorden y un nivel máximo. Cuando el inventario cae bajo al punto de reorden, entonces se repone el inventario hasta el nivel máximo. Supuestos: Para un Período de Revisión Continua, el inventario se repone instantáneamente.
Imagen: Ejemplo del modelo para una política de "PuntoDeReordenCantidadDeReorden."
La solución se encuentra en la aplicación de los Elements "Material" e "Inventory" disponibles en el apartado de Definitions. Estas permiten definir los materiales a utilizar y sus ubicaciones correspondientes, para que así estas puedan ser consumidas a la hora de que se ejecuten los procesos. Para cada modelo se estableció que el inventario "HotdogInventory" se trabaje bajo revision continua y "BurgerInventory" bajo revisión periódica.
Simbit: Servidor con consumo de materiales
Servidor con Consumo de Materiales.pdf Servidor con Consumo de Materiales.spfx
Los dos modelos están compuestos por:
- 1 Source (Source1)
- 1 Server (Server1)
- 1 Sink (Sink1)
- Connectors
Modelo 1: Servidor con consumo de material.
Objetivo: Consumir distintos materiales para la producción de un nuevo material según su Bill Of Materials (BOM).
Modelo 2: Servidor con consumo de material y reposición.
Objetivo: Sumado al modelo anterior, se agrega la capacidad de reponer el inventario de materiales al bajar de un nivel determinado por el modelador.
Ejemplo: Modelo 2, Servidor con consumo de material y reposición.
La solución se encuentra en la aplicación del Elements "Material" disponible en el apartado de Definitions. Este permite definir los materiales a utilizar y sus cantidades para la fabricación de un Material compuesto. De este modo, se van consumiendo los distintos materiales para su fabricación. El segundo modelo agrega un proceso para la producción de los materiales necesarios para seguir operando con normalidad.
Simbit: Inventarios y materiales
Inventario Y Materiales.pdf Inventario Y Materiales.spfx
El modelo está compuesto por:
Objetivo: Permitir representar un sistema que consume distintos materiales, los cuales están ubicados en distintas ubicaciones a lo largo del sistema.
Supuestos: Todos los inventarios están ubicados en el objeto en el que se realiza el consumo.
Modelo de ejemplo
La solución se encuentra en la aplicación de los Elements "Material" e "Inventory" de la pestaña Supply, disponibles en el apartado de Definitions. Estas permiten definir los materiales a utilizar y sus ubicaciones correspondientes, para que así estas puedan ser consumidas a la hora de que se ejecuten los procesos.
Nótese que cuando se consumen los materiales disponibles en las ubicaciones que hay estas no se reponen. Se recomienda revisar los ejemplos de "Servidor con consumo de materiales" y "Reposición de inventarios".
Preguntas/Problemas Frecuentes
¿Qué hacer si se están generando muchas entidades?
Muchas veces, la existencia de un gran número de entidades está asociada a un error en la lógica del modelo. A continuación, te presentamos algunas cosas que puedes revisar para identificar y corregir el problema.
Mensaje que avisa que se ha superado el límite de entidades activas de un determinado tipo, en este caso DefaultEntity.
Qué elementos del modelo puedes revisar
- Source: Ver si la distribución del tiempo entre llegadas está definida correctamente y con las unidades correspondientes.
- Servers, Combiners, Separators: Ver si la capacidad del servidor es suficiente, y que el tiempo de proceso esté definido correctamente y con las unidades correspondientes. Si utilizan algún recurso (como Worker), verificar que la capacidad esté correcta.
- Nodos de salida: Si estás utilizando una tabla de secuencia, verifica que el Sink esté en la tabla y que los nodos tengan el Entity Destination Type como By Sequence.
- Process: Si utilizas el Step Seize para tomar posesión de un recurso, verifica que tu modelo libere correctamente el recurso, por ejemplo: utilizando el Step Release.
¿Y si el modelo requiere de más entidades?
El mensaje es solo una advertencia. De hecho, al correr Experiments, Simio registrará la advertencia pero continuará corriendo hasta terminar.
Si consideras que tu modelo requiere un gran número de entidades y quieres evitar la ventana de advertencia, puedes configurar el umbral de la advertencia en la propiedad Population > Maximum Number in System Limit, de las entidades. Pero cuidado, a mayor número de entidades activas, mayor será la cantidad de recursos computacionales que requerirá Simio (el modelo se hará más pesado).
¿Cuántos objetos hay en una cola?
Las colas de los objetos de la Standard Library (Server, Separator, etc) corresponden a Stations. Para obtener la cantidad de elementos en un Station se debe utilizar la Expression Objeto.Station.Contents.NumberWaiting. Por ejemplo, el número de entidades esperando en el InputBuffer de un Server se obtiene utilizando la Expression: MiServer.InputBuffer.Contents.NumberWaiting
En modelos más avanzados la cola puede corresponder a un Storage. En este caso se debe utilizar la Expression Objeto.Storage.Queue.NumberWaiting.