SIMIO
videos que vi:
Curso de Simulación con Simio | Simulación de 20 min | Clase #1
Introducción Simulación en Simio - Parte 1: Creación del Modelo (este ejercicio está bueno
para empezar a ver simio).
Ejercicio básico simulado en Simio
SIMIO (Simulación) | Workshop 8 "La suburban en el Aeropuerto"
Simulación en Simio: Listas, Tablas y Tiempo Dependientes de la Entidad
Combiner Simio
Tipos de elementos que se usan en el software
Clases de SIMIO de la cátedra: clase1 clase2 (ver esta antes, hace la del aeropuerto)
clase 3 part1
clase 3 part2
clase 4
Los source te permiten ingresar entidades al modelo. Los server son procesos. Todos
estos elementos hay que conectarlos, con un connector (si no hay tiempos ni distancias).
También hay otros conectores, como Path, TimePath y Conveyor (este último se usa si te
dan datos de velocidad).
Los sink te permiten hacer la salida de las entidades del modelo, las destruye.
Las entities son las “cosas” que van a entrar por el source, pasar por el server, salir por los
sink, etc.
Los resource objects son objetos tales que su capacidad puede ser requerida por otros
objetos del modelo. Ej: camas en un hospital. ¿cómo se hace para tomar la capacidad de
los objetos recurso? dentro de las propiedades de un server, combiner o separator, en la
categoría secondary resources tenemos las opciones seize para tomar recurso y release
para liberarlo.
Si querés hacer unas label y mostrar datos:
Para mostrar la cantidad de gente en la estación processing de un objeto Server:
FiestaClandestina.Processing.Contents
Cantidad máxima de personas en la fiesta:
FiestaClandestina.Processing.Contents.MaximumNumberWaiting
Cantidad total de personas que asistieron a la fiesta:
FiestaClandestina.InputBuffer.NumberEntered
Tiempo promedio de cada persona en la fiesta:
NombreEntidad.Population.TimeInSystem.Average
Duración total de la fiesta:
TimeNow
Cuanto tiempo estuvo ocupado el recurso:
Virginia.ResourceState.PercentTime(1)
Utilización del server:
Cajero.Capacity.ScheduledUtilization
Tiempo de una entidad en el sistema
DefaultEntity.TimeInSystem
Promedio de tiempo de todas las entidades en el sistema
click en la salida, agregas el status label,
TimeInSystem.Average
Utilización promedio de cada vete:
Resource.Luis.Capacity.ScheludedUtilization
Tiempo total de atención de emergencias de cada recurso:
Virgnia.ResourceState.TotalTime(3)
el valor 1 es cuando el recurso está ocupado, 2: bloqueado, 3:fallado, 4: fuera de servicio,
5:fallado y ocupado, 6: fuera de srevicio y ocupado
a) pongo una label con ArriboPasajero.OutputBuffer.NumberEntered
b) Pasajero.Population.TimeInSystem.Average*60 (seria en minutos)
c) InsideCheckIn.InputBuffer.Contents.AverageNumberWaiting, y
InsideCheckIn.InputBuffer.Contents.MaximumNumberWaiting
d) CurbsideCheckIn.ResourceState.PercentTime(1) en cada uno de los checkin
Tipos de distribuciones:
Arriban bla bla cada 20 ± 5 minutos Random.Uniform(15,25)
Demora en la atención 10 ± 2 minutos Random.Uniform(8,12)
velocidad uniformemente distribuida entre 3 Random.Unifoirm(3,6)
y 6 kilómetros por hora.
bla bla lo hacen siguiendo una distribución Random.Exponential(60)
exponencial con media de 1 hora.
tiempo distribuido exponencialmente con Random.Exponential(6.5)
media de 6.5 minutos
Con un descanso de entre 15 y 20 minutos Failure type: caldendar type based
cada 2 horas de trabajo Uptime btw failures:
Random.Uniform(110,130)
Time to repair:
Random.Uniform(15,20)
llegan a una tasa de 18 por hora Random.Exponential(1/18)
sigue una dist. uniforme con minimo de 5 y Random.Uniform(5,10)
maximo de 10 min.
Random.Exponential(90)
GUÍA DE EJERCICIOS DE SIMIO
Antes hago este que es de un video (pegué el link arriba de todo)
Desde los sources hay que usar Conveyor, porque nos pide una distancia determinada y
una velocidad determinada. Cuando abrís las settings del conveyor tenes que poner el
drawn to scale en false y en logical length el largo del camino (en realidad el va a
caractareistica fisicas o algo asi y setea el largo pero no se si nos pediran tanto), y la
velocidad en “initial desired speed”.
Este es de un vídeo (SIMIO (Simulación) | Workshop 2 "El cajero automático")
Para repartir llegada de distintas entidades según porcentajes: Para manejar que el 60% de
los arribos pertenecen a hombres, y el resto mujeres, creamos ambas entities, y luego
vamos a la pestaña “data”, tables, add data table, le cambiás el nombre en vez de Table1
ponele “llegadas”.
Luego vas al botón object reference property > Entity, le cambias el nombre a la columna en
“General”, le pones de nombre “Tipo”, luego seleccioná en la columna todos los tipos de
entidades que tengas que usar. Ahora creas la columna de los porcentajes, vas a property >
real, cambiás el nombre de la columna y ponés los porcentajes, si es 60% o 0.6, pones 60.
La suma debe dar 100.
Ahora volvés a la pestaña facility, vas al source, y en entity type elegís la tabla que creaste.
En table row referencing > before creating entities > table name > selecciónas tu tabla y
luego en row number > nombretabla.nombreatributoporcentajes.RandomRow (el que tiene
el número va aca)
Logical length del path es 10 en el primero y 7 en el segundo.
Cuando te dicen que las entidades empiezan a llegar en tal minuto: Como nos dice que la
primera entidad debe llegar en el minuto 2, en el source hay una propiedad time offset para
agregar esos 2 min.
En el input buffer del server inspector (buffer logic) ponemos 15.
Para los horarios: vas a pestaña data > work schedules. Te van a aparecer StandardWeek
(esquema de trabajo de lunes a viernes, con descanso el finde)y abajo StandardDay (8-12 y
13-17 todos los días).
Para cambiar el horario vas a StandarDay, para cambiar los días, a StandardWeek.
Luego para asignar el horario al server, vas al server, y en la propiedad CapacityType ponés
WorkSchedule. Se te crea un nuevo campo abajo con un dropdown, elegí “StandardWeek”.
Para repartir en la salida según porcentajes (para una misma entidad): Una vez que termina
el inspector, tiene que decidir si la pieza es buena, es mala, o tiene que remaquinarse. Para
esto haces click en el nodo nodo del output el server (o del source en otro caso), y en
outbound link rule seleccionás “by link weight”.
Luego en cada path o conector que salga de ese nodo, vas a ir a Routing logic > selection
weight y ahí pones, si es 85%, 0.85. La suma de todos los caminos debe dar 1.
Cuando te dicen que una actividad la hacen más de 1 persona: initial capacity = cantidad.
No sé el tema de los resources y eso, creo que no es necesario.
Para hacer una unifila:
SIMIO 02 - Como hacer una cola acá tambiién lo explica
En este caso tenes el source y de ahí van a 4 cajeros, pero ojo, la fila tiene que ser una
sola, no 4 distintas. Para esto, vamos a usar un TransferNode. IMPORTANTE USAR Path,
no connector! en el Path que llega al TransferNode, poné el Allow passing en false (para
que no se colen).
Además tenés que setear el InputBuffer de cada uno de los servers en 0. Para que hagan
fila en el transferNode.
Además, tenés que crear una lista de nodos. Vas a pestaña definitions > lists > Node. En la
ventana de abajo vas tirando vas seleccionando todos los servers, en este caso
Input@Server1… Input@Server4
Volvés al TransferNode, y en sus propiedades de routing logic, entity destination type, elegís
“select from list” y en node list name elegís la lista que creaste y en selection goal ponés
random (en este caso puede ir a cualquiera de los 4 cajeros de manera aleatoria).
Camino con un tiempo asociado para recorrerlo: Acá se usa un TimePath.
Simulación se detiene cuando se llega a 800 entidades: En el source, vas a Stopping
conditions y en Maximum arrivals ponés 800.
Para establecer el largo de un camino: Vas a las propiedades de path, ponés Drawn to
scale en false y logical length en los metros que quieras.
Para setear el vehículo: primero seteamos el Path que va a hacer. Si nos pide distancia
establacemos el largo del Path como dice arriba. También definimos que el Path sea
bidireccional en la propiedad Type. (en este caso va y viene).
En este caso antes del vehículo se pone un server. En ese server ponés processing time 0.
Vas al nodo output de este server y en Transport Logic, Ride on transporter poné true, en
transporter name seleccioná el vehículo.
Al vehículo le ponés la capacidad que te piden, en Initial ride capacity, establecés el tiempo
que te dice que demoran los pasajeros en subir y en bajar en Load time y en Unload time.
La velocidad en la que viaja la seteás en Initial desired speed, y fijate si te pide unidades
distintas a m/s cambialo.
En routing logic, en initial node (home) ponés el nodo output del server.
En idle action, poné go to home.
Si tenés 2 entidades y tienen distintos tiempos de llegada: Tenés que usar 2 source distintos
(parece obvio pero por las dudas te digo)
Si te dicen que 2 entidades se unen en una: Te van a dar la propoción, tenes que usar un
combiner. Es como un server (fijate el loguito), pero además combina entidades.
En Batch Quantity vas a poner la proporción. El nodo superior es el ParentInput y el nodo de
abajo es el MemberInput. El nro que pongas en el Batch Quantity, por ej 2, significa que 2
memberinput y 1 parentInput van a hacer una nueva entidad. En este caso, 2 de plástico y 1
de metal harán una nueva entidad. Si te piden un tiempo, lo ponés en Processing time.
Ver lo de matching rule si se usa o no
Si te dicen que 1 entidad se divide en 2: Tenés que usar un separator, es como un server,
pero además separa entidades.
En este caso queremos que simplemente separe las entidades, así que en Separation Mode
elegimos Split Batch.
Preguntar pa que sirven los demas valores de separation mode
Si te piden un tiempo, lo ponés en Processing time.
En este ejemplo le cambié el Initial Capacity, para que pueda procesar toda la carga del
camion (8 entidades).
Si te dicen que los caminos distancia y velocidad: Tenés que usar un camino de tipo
Conveyor.
Si te dicen que trabajadores (workers) tienen que recolectar las entidades en vez de que las
entidades se muevan por el Path: Vas al nodo de output del souce (en este caso -también
podría ser un server supongo-), y en Ride on transporter ponés true y en transporter name
seleccionas el nombre del worker. Y en el objeto Worker, vas a Initial node (home) y
seleccionas en qué nodo querés que arranque, y en Idle Action, go to home.
Los path que recorran los workers, deben ser seteados como bidireccionales en la
propiedad Type de cada path.
En el vehículo, nos dicen que puede llevar hasta 12 toneladas. 12 toneladas equivalen a 8
entidades de las nuevas (de las que se transformaron con el combiner), pero como? sí,
porque cada bote de metal o plástico tiene media tonelada. Cada nueva entidad tiene 2
botes de plástico y uno de metal (media tonelada*3 = 1,5 toneladas), cuántas nuevas
entidades entrarán en el camión si puede llevar 12 ton? 12/1.5 = 8.
También dice que el camión debe estar completamente lleno para partir. Esto se setea en la
propiedad Minimum Dwell Time, y seleccionás dwell until full.
En el server de Fundido, como te dice que puede procesar hasta 4 toneladas de metales,
significa que su Initial capacity es de 8 (cada bote de metal tiene media ton).
En el server de Triturado, como te dice que puede procesar ahsta 1,5 toneladas de plástico,
su Initial capacity será de 3.
____
Si tenés 2 tiempos de procesamiento distintos en un mismo server para 2 entidades
distintas (no es de este ejercicio):
Ejercicio 1 DE LA GUÍA SIMIO el de las chapas, clase 1 minuto 1:15 aprox
En este caso usamos una sola entidad así que no tiene sentido, pero explica que vos podes
crear entidades y setearselas al objeto source. Seteamos el tiempo entre arribos del objeto
source.
Ojo que a veces te dan los tiempos así y en realidad el tiempo de procesamiento es
1/tiempo
El server máquina de corte le ponemos initial capacity 1 porque puede aceptar de a 1 hoja
por vez. Tiempo de procesamiento 1/4.5.
El enuciado te pide 1 sólo buffer entre cada máquina: entonces tenemos que hacer el output
buffer de cada server (menos el último) igual a cero.
El input buffer es ilimitado así que la dejamos en infinito, y el ouput buffer capacidad 0, para
que se encolen directamente en el input buffer de la máquina siguiente.
En el server máquina de golpe, forma y doblado ponemos como input buffer 20, ya que es lo
que dice el enunciado para cada buffer intermedio.
Todo lo que sea mantenimiento, fallas, tiempo de descanso,etc: se hace en Reliability logic
> failure type. Este tipo de falla puede darse por tiempo de procesamiento de server, o por
unidades que han pasado por el server (hay más pero esas son las 2 mas comunes).
Generalmente te dan el tiempo entre fallas/descanso/etc, y el tiempo en que esa
falla/descanso se arregla.
En este caso fijate que te dan el tiempo entre fallas y el tiempo de reparación para golpe y
forma (estos son failure type processing time based), y también te dan nro de chapas para
cambio de componentes y el tiempo de cambio (processing count based)
Si no te dan tiempo entre arribos del source: podes cambiar el arrival mode a On event,
inital number entities 1, triggering event name [email protected] (cada vez
que una entidad ingrese al nodo de salida de ese server, se larga un evento que hace entrar
otra).
La simulación puede terminar especificando un tiempo, o en este caso nos piden que
termine después de haber tenido 50.000 hojas de metal. Esto se agrega en stopping
conditions en el objeto source.
Cuando haces click en un objeto te aparece la pestaña symbols, en active symbols te dice
los colores que toma según qué cosa, procesando, bloqueado, fallado o mantenimiento, etc.
Ejercicio 2 DE LA GUÍA SIMIO
Lo primero que hacemos es crear la entidad ClienteConMascota, luego creamos un source
y le decimos que genere entidades del tipo ClienteConMascota y que el tiempo de arribos
sea de Random.Exponential(6.5)
Agregamos un servidor llamado Veterinaria, y un sink.
Si te piden representar trabajadores con Resources:
No necesariamente son personas, pueden ser camas, respiradores (Dijo la profe)
Se le pueden setear fallas
Al server veterinaria le pondríamos initial capacity de 4 (son 4 los resources veterinarios), y
creamos 4 resources. Agregamos el tiempo de procesamiento del server, que es de
Random.uniform(10,30)
Ahora hay que indicarle al Server que tomaremos recursos de los resources: en secondary
resources, vas a resources for processing y tocas los 3 puntitos, luego add. Y luego la
flechita a la derecha arriba y select from list.
Pero antes de hacer esto debemos crear la lista. Para eso, hay que ir a definitions > lists. Y
arriba a la izq poner Object.
Cambiar nombre de la lista, y agregás todos los objetos: Luis, nicolas, susana, virginia.
Ahora sí volves a secondary resources y seleccionas la lista en dodne dice Object list name
Las llamadas de emergencia las vamos a representar con fallas. Entonces en cada resource
veterinario, en failure type ponemos Calendar type based.
En uptime between failures Random.exponential (6) y en time to repair
random.uniform(40,60). Lo mismo para cada vete.
Lo demás no tocas nada.
El tiempo lo ponemos en 24 hs y corremos.
Utilización promedio de cada vete: Resource.Luis.Capacity.ScheludedUtilization
Tiempo total de atención de emergencias de cada recurso:
Virgnia.ResourceState.TotalTime(3)
Tiempo total del animal dentro de la veterinaria:
Ver clase de este ejercicio porque tira algunas postas (clase 2)
Ejercicio 3 DE LA GUÍA SIMIO
(se da a lo último en la clase 2). Usa variables de control (definitions > properties), pero es
lo mismo poner los datos directamente.
este ej es la posta mepa, es parecido a los que toman en el parcial
Hago un source, 2 server y un sink. Creo la entidad pasajero y se la asigno al objeto source.
El tiempo entre arribos es Random.Exponential(1). En el nodo de output del source, en la
propiedad outbound link rule seleccionamos “by link weight”.
Después con objetos path conectas los objetos (vamos a usar estos porque nos piden que
sean de un determinado largo), y le asignas a cada path el sélection weight
correspondiente. El drawn to scale ponerlo en false y poner un logical lenght según el
enunciado por cada camino.
Nos dan datos de velocidad de movimiento de las entidades: Para setear la velocidad a la
entidad, cliqueamos en la entidad, propiedad Intial desired speed, Random.Uniform(3,6)
e) pongo una label con ArriboPasajero.OutputBuffer.NumberEntered
f) Pasajero.Population.TimeInSystem.Average*60 (seria en minutos)
g) InsideCheckIn.InputBuffer.Contents.AverageNumberWaiting, y
InsideCheckIn.InputBuffer.Contents.MaximumNumberWaiting
h) CurbsideCheckIn.ResourceState.PercentTime(1) en cada uno de los checkin
Ejercicio 4 DE LA GUÍA SIMIO (fin de la guía)
Hay que diferenciar los tipos de pasajeros.
Esta parte que sigue también la podés hacer según “Para repartir llegada de distintas
entidades según porcentajes” (definido en otro ej más arriba)
Para hacer esto vas a ModelEntity en el cuadrito blanco de la derecha > Definitions >
States. Creas una variable tipo entera que se llame tipoPasajero. Después vas al objeto
source, dentro de la categoría State Assignments el atributo “before exiting”, agregas
variable, en State Variable name pones ModelEntity.tipoPasajero y en new value ponemos
los valores y las probabilidades: Random.discrete(1,0.5,2,0.7,3,1)
Esto de abajo lo podés hacer según:
Si tenés 2 tiempos de procesamiento distintos en un mismo server para 2 entidades
distintas:
En este caso para 3 entidades en el server InsideCheckIn: Math.If(ModelEntity.Is.Pasajero1,
Random.Uniform(2, 5), ModelEntity.Is.Pasajero2, Random.Uniform(3, 5),
Random.Uniform(4,6))
Y en el server CurbsideCheckIn
Math.If(ModelEntity.Is.Pasajero1, Random.Triangular(1,2,5), ModelEntity.Is.Pasajero2,
Random.Triangular(2,3,6), Random.Triangular(3,4,7))
_____________________________
Ahora el tiempo de procesamiento en los servers debe variar según el tipo de pasajero.
Para el InsideCheckIn, dentro del processing time ponemos:
Math.if(modelEntity.tipoPasajero==1,Random.uniform(2,5), modelEntity.tipoPasajero==2,
Random.uniform(3,5), Random.uniform(4,6))
Para el CurbsideCheckIn, dentro del processing time ponemos:
el mismo if, pero con las distribuciones triangulares como dice el enunc.
Cuando la cola de espera en alguno de los check in supera las 30 personas, se incorpora
un recurso mas: Vas a los server de check in, Add-on process triggers, y en Entered
seleccionás “create new”, ahora vas a la pestaña procesos (te va a aparecer el proceaso
definido). En el proceso arrastramos un Decide entre medio de Begin y End y en Condition
Or Probability ponés InsideCheckIn.InputBuffer.Contents > 30. Para el caso true, arrastrás
un bloque assign y pones esto
*En new value tenía que poner el valor 3, sino cada vez que supere las 30 va a sumar.-
Esa variable ya está creada por defecto en Simio.
Para contar la cantidad de pasajeros de distinto tipo que arribaron, creamos 3 variables de
estado. ModelEntity > definitions > states. Definimos 3 variables enteras.
Dentro del source, en state asignments, before exiting ahi agregas la expresion para sumar
si es tipo 1, tipo 2 o tipo 3
Esto si usas entidades como te conté anteriormente es más fácil porque te fijas en el
número de entidades de cada tipo que se crearon y listo.
Ejercicios de Simio de finales
El de los espectáculos
Me lo corrigió la profe el 14/10 así que estaría bien.
Para crear y manipular variables de estado:
ModelEntity > Definitions > States. Definimos una variable “tamañoGrupo”
También podría meter un Math.if en Entites per arrival del source, pero por alguna razón no
me funciona.
Una vez que salen de cada server cajero, agarro la variable de estado tamañoGrupo y la
seteo en randomUniform(3,5), 2, o 1 dependiendo de si es GrupoDeAmigos,
ParejaDeNovios o PersonaSola. Para ello en cada server cajero, state assignments > after
processing. En state variable name: ModelEntity.tamanoGrupo y en new value:
Math.If(ModelEntity.Is.GrupoDeAmigos,
Random.Uniform(3,5),ModelEntity.Is.ParejaDeNovios,2,1)
El de la fábrica (9/02/17)
Para crear varias entidades en el arribo: Seteas Entities per arrival en el source.
Para usar el Combiner teniendo de entrada 2 servers, como en este caso:
Tenés que agregar un BasicNode, en outbound link rule poner “by link weight”, y luego en
cada path que entra al Combiner, en Selection Weight poner “ModelEntity.Is.Articulo1” en un
path y “ModelEntity.Is.Articulo2” en el otro, esto dependiendo del parent y member, lo
expliqué mas arriba.
Para dar prioridad a una entidad por sobre otra en la cola de un server:
En process logic > ranking rule, elegir largest value first (por ej para priorizar articulo2 por
sobre articulo1), no entiendo bien como funciona igual
Seleccionar entidades luego de un server:
“Para el Afinado, dos especialistas pueden atender cualquier artículo 1 o 2, demorando un
tiempo con distribución triangular (8, 12, 16) por unidad. La atención en esta cola asigna
prioridad a los artículos 1.
Con esta operación se seleccionan satisfactoriamente 80 % de los artículos 1 y 90 % de los
artículos 2.”
Los artículos 1 o 2 no seleccionados pasan a un Reproceso común realizado por un experto
quien demora un tiempo con distribución exponencial cuya media es 50 minutos por
artículo.
DUDA, NO SÉ COMO HACERLO