lunes, 26 de marzo de 2012

08 - Práctica Laboratorio 6

PRÁCTICA LABORATORIO 6


Simulación  de un banco:


          Para realizar esta simulación nos vamos a servir de la ayuda que nos proporciona un tutorial de la página "xjtek", en este caso realizaremos la simulación de un banco en el que los clientes irán entrando a la sucursal, y serán atendidos por cajeros u oficinas siempre que haya servidores libres, si no harán cola hasta que puedan ser atendidos. El tutorial está disponible en el siguiente enlace:


        http://www.xjtek.com/anylogic/help/index.jsp?topic=/com.xj.anylogic.help/html/_Enterprise/

          Comienza el tutorial creando un nuevo modelo (elegir la opción "Use template to create model" y posteriormente "Discrete event"), estos parámetros crearán un modelo con los elementos "source", "queue", "delay" y "sink" conectados, de esta manera ahorramos tiempo de diseño. 




          Para simular las entrada de clientes se dibuja  una polilínea y una circunferencia las cuales las asignaremos a "queue" y "delay" respectivamente. En el delay activaremos el tipo Single, y en el "source" introduciremos un evento con figura de persona para que la simulación sea lo más real posible. Por último, para que se observe cuando está el banco ocupado y cuando libre, en las propiedades de la circunferencia introduciremos en la opción "Fill Color" la siguiente instrucción: "delay.size() > 0 ? red : green". Este código de colores representa que cuando el banco está ocupado, el circulo se rellenará de color rojo mientras que si el banco está vacío, el banco se rellenará de color verde.  




           En el espacio de diseño se colocarán dos gráficas que nos permitan observar cual es el grado de ocupación del "delay" como el índice de tamaño de la cola de personas. Las respectivas instruccionesde código que se introducen son las que se muestran a continuación:

delay.statsUtilization.mean()  //Indice de utilización del delay
queue.statsSize.mean()         //Indice de tamaño de la cola

           Las gráficas que mostrarán estos datos son del tipo "Bar Chart" y se encuentran en la parte derecha de la ventana y las líneas de código se introducen en la propiedad "Value" de la misma.



Introducimos nuevos bloques: 

SelectOutput: Es un bloque que permite a los clientes seleccionar con una probabilidad de 0,5 (variable) si van a los cajeros o si van a la oficina. 
Service: Simula los clientes que decidan ir hacia los cajeros.
Resource Pool: Asignamos el nombre "Tellers" y simula los cajeros.
Slider: En función de cuántos cajeros se introduzcan, permite seleccionar cuántos de ellos están en funcionamiento.

           En el elemento service se modifican las propiedades, asignándole una polilínea en la propiedad "Anymation guide shape (queue)" .

           En el elemento Tellers se modificarán varias propiedades. En primer lugar se introducirán dos imágenes denominadas iddleTeller y busyTeller que se encuentran en la siguiente dirección: <AnyLogic folder>\resources\tutorials\Bank Office. 
En segundo lugar, se asignará "set" como tipo de animación. 
Por último, se le asigna una polilínea que tenga cuatro puntos.

           Finalmente, al elemento slider, se le asignará 4 como valor máximo, ya que en este caso solo se quieren cuatro cajeros. Y en la propiedad link to se introduce la línea de código: tellers.capacity. 

           El funcionamiento del programa es el siguiente:
Los clientes con una probabilidad del 50% se dirigirán a los cajeros o a la oficina del banco. Si se dirigen a la oficina, se observará el sistema como en la imagen anterior, con la polilínea representando a la cola y la circunferencia rellena de verde o rojo en función de si está libre u ocupada.  En cambio, si los clientes se dirigen a los cajeros, se podrá observar en la polilínea asignada a los clientes que se encuentran haciendo cola para entrar a los cajeros ocupados. Mientras, en la polilínea con cuatro puntos, se podrá observar a los cuatro cajeros con una imagen u otra en función de si están libres u ocupados. El elemento slider nos permite mientras la simulación seleccionar el número de cajeros operativos, en el caso de la imagen, tres de los cuatro se encuentran operativos y los tres cajeros se encuentran ocupados.




           Por último, se quiere almacenar los datos referentes al tiempo han permanecido los clientes en la cola y cuanto tiempo han estado los clientes siendo atendidos. Para ello, se aprovecha la característica de la herencia de Java, y se crea una nueva clase de Java a la que se denominara "Customer" y que heredará las características de la superclase "entity".




           A la clase Customer le añadiremos las variables de tipo double "startWaiting" y "enteredSystem". Para visualizar los datos en un histograma, introducimos dos "histrogram data" que se llamarán "waitTimeDistr" y "timeInSystemDistr" para poder almacenar los datos de tiempo en el sistema y tiempo en espera.


IMPORTANTE: Es necesario modificar las propiedades de la fuente, ya que hay que asignar como entity class "Customer", en la propiedad new entity "new Customer()" para que se creen clientes en lugar de entidades de la superclase, y por último, para almacenar el tiempo en el sistema, en la propiedad "on exit" se introducirá la línea de comando "entity.enteredSystem = time()" la cual utiliza el reloj de Anylogic para que almacene el momento en el que el cliente entra en el sistema.

           En la cola sucede lo mismo, como entity class se introduce la nueva clase Customer. En la propiedad "On Enter" se introduce la línea "entity.startWaiting = time()" para almacenar el momento en el que el cliente comienza a esperar, mientras que en la opción "On Exit" se introduce la línea  "waitTimeDistr.add(time() - entity.startWaiting)lo cual asigna al elemento "waitTimeDistr" el tiempo en el sistema en el que el cliente no ha estado esperando.

           Por último en el elemento "sink", se asigna como "entity class" a la clase Customer, y en la propiedad "On Enter" se escribe la instrucción "timeInSystemDistr.add(time()-entity.enteredSystem)" la cual nos muestra cuanto tiempo han estado los clientes en el sistema, ya sea siendo atendidos o esperando.

           Finalmente, se introducen dos histogramas, a los que se les asigna los dos "histogram data" creados anteriormente, introduciendo en la propiedad Histrogram el nombre de los mismos. Una vez realizados dichos cambios, el resultado de la simulación del banco se puede observar en la siguiente imagen.


martes, 20 de marzo de 2012

09 - Práctica Laboratorio 7


PRÁCTICA LABORATORIO 7


Simulación  de un centro oftalmológico:


          Para realizar esta simulación nos vamos a servir de la ayuda que nos proporciona un tutorial de la página "xjtek", en este caso realizaremos la simulación de un centro oftalmológico en el que utilizaremos redes "network". El tutorial está disponible en el siguiente enlace:


        http://www.xjtek.com/anylogic/help/index.jsp?topic=/com.xj.anylogic.help/html/_Enterprise/




          Como el tutorial viene explicado muy detalladamente paso a paso en esta sección se mencionarán los aspectos más importantes y los detalles que sean oportunos para comprender la ejecución de la simulación. 





          En primer lugar se coloca una imagen en el espacio de trabajo.





          La imagen a colocar está guardada en las librerías de Anylogic y corresponde al mapa en planta de un centro de oftalmología. Después de colocar la imagen es importante ponerla en su tamaño inicial.





          para diferencial cada habitación o sala de este centro colocamos rectángulos en cada sala y los llamamos cada uno con el nombre de la correspondiente sala (staffRoom, waitingRoom,...). No olvidar colocar la salida en la puerta.




          Para simular el recorrido que van a realizar los pacientes y doctores por el centro se crean unas polilíneas por los pasillos de forma que podamos observar el recorrido entre las habitaciones. Hay que dibujar rectángulos que funcionen como nodos en nuestra res "network".



          Una vez realizado todo esto se tiene que agrupar todo el conjunto  dibujado en nuestro área de trabajo y lo llamaremos "networGroup".




          A continuación se dibuja una polilínea que pase por las tres habitaciones en las que serán tratados los pacientes, esta línea les permite distribuirse uniformemente en las tres salas en las que pueden entrar. Haremos invisible esta linea en las propiedades dinámicas de la polilínea.





          Para nuestra simulación es necesario introducir a los doctores y pacientes así como el instrumento que va a utilizar el doctor para tratar al paciente, este instrumento lo dibujamos a mano, los tres objetos tienen que tener un nombre definido (shapeDoctor, shapePatient, shapeScope)



          
          Una vez configurado el modelo a simular falta realizar todo el programa que va a permitir la simulación del sistema, el primer paso es crear una red network:






          Ya está lista la red Network, en ella básicamente introducimos a la figura del doctor que será del tipo "moving", es decir un ente que se mueve, la figura del scope que será "portable", es decir un objeto que va a transportar el doctor y finalmente la procRoom que será del tipo "static", algo que está siempre en un sitio fijo. Tambien se debe de especificar el número de doctores y de scopes que queremos utilizar en nuestra simulación.



          En esta ocasión nos centramos en los pacientes que han de entrar al centro oftalmológico, ser tratados y abandonar éste. En el esquema de funcionamiento podemos observar a grandes rasgos cómo un paciente entra en el sistema (source), entra a la red network (networkEnter), se dirige a la procRoom (networkToProcRoom), recibe el tratamiento (procedure), abandona la sala (networkToExit), abandona la red network (networkExit) y finalmente abandona el sistema (sink).
Podemos observar todos los detalles de cada bloque en el tutorial.



          Haciendo una prematura simulación vemos como los pacientes se comportan de la manera esperada, visto esto continuamos con el diseño de la simulación.



          En esta último paso básicamente de que una vez que entren los pacientes hagan cola o sean tratados, para ser tratados el doctor debe de hacer pasar al paciente a la sala, coger el instrumento, dar el tratamiento necesario, devolver el instrumento a la sala correspondiente y finalmente el paciente se marchará sano pudiendo dar paso al siguiente.



          La simulación final queda de este modo:





















miércoles, 7 de marzo de 2012

07 - Práctica Laboratorio 5


PRÁCTICA LABORATORIO 5


Simulación  de colas en Anylogic:


          Como segunda práctica de Anylogic vamos a generar un sistema de colas, la forma más sencilla de hacernos una idea de que trata esto es imaginarnos una carnicería, por ejemplo, la gente va entrando y siendo atendida, habra un número de carniceros (servidores), personas siendo atendidas, personas esperando en la cola y personas que ya recibieron el servicio y abandonan la tienda. Con Anylogic podemos hacer simulaciones de este estilo y aplicarlo a diferentes campos, como pueden ser flujo de piezas en una fábrica, aeropuertos, restaurantes, ...


          En primer lugar colocamos los dos componentes básicos para estas simulaciones, un "source" y un "sink".


Source: generará eventos (personas que entran a la carnicería)
Sink: donde acaban los eventos que ya han sido atendidos (personas que abandonan la carnicería)


          El source genera eventos de acuerdo a las especificaciones que le programemos, podemos indicarle que genere eventos de manera aleatoria exponencial, eventos por unidad de tiempo, ...


          A continuación colocamos un "conveyor" en nuestro sistema.

Conveyor: que es el encargado de hacer que los eventos se muevan como si de una cinta transportadora se tratase.

Lo malo es que todos los eventos se moverán a la misma velocidad. Para observar este movimiento en la simulación debemos insertar una polilínea en nuestro espacio de diseño y asignarle el nombre que le hayamos puesto al "conveyor", la simulación más básica son bolas de colores que se mueven por la polilínea.



           Ahora que hemos generado un flujo de eventos nos falta darles un servicio para que se produzcan las colas, vamos a introducir en nuestro sistema un "queue" y un "delay",



Queue: Representa la cola de eventos que se genera esperando a recibir el servicio.
Delay: Es el tiempo de servicio que recibe cada evento, puede ser fijo o aleatorio.


Podemos simular estos dos últimos elementos de la misma forma que el "conveyor", asignándoles una pililínea, en una vamos a ver como se genera una cola de eventos y en otra el tiempo que tarda en recibir el servicio. En este primer caso colocaremos un servidor M/M/1 (exponencial, exponencial 1 servidor)







           Si queremos añadir mas servidores lo hacemos desde el menú del delay, donde podemos poner los servidores que nos parezca oportuno para dar un mejor servicio a los eventos, tambien podemos cambiar la simulación asignando a este "delay" un "animation Type" de tipo "bag", y en vez de una linea donde se ve el tiempo de servicio vemos un rectángulo que podría representar una sala y los eventos aparecen en ella durante el tiempo de servicio, es necesario dibujar un rectangulo para este tipo de simulaciones.



           Una vez generado nuestro sistema de colas queda hacer la simulación lo más real posible, podemos cambiar la forma de ver los eventos, en vez de bolas de colores podemos asignarles formas de personas, en dibujo lineal o en 3D.





           Finalmente podemos dar el mayor realismo posible a la animación haciéndola completamente en 3D, para ello unicamente  debemos de incluir una ventana de 3D (3D Window) encima de las polilíneas  y demás elementos a simular. Tambien debemos de colocar una cámara (camera) enfocando hacia la ventana 3D como si de una película se tratase. Los resultados son  sorprendentes.



jueves, 1 de marzo de 2012

06 - Práctica Laboratoria 4


PRÁCTICA LABORATORIO 4


Simulación  en Anylogic:

          Anylogic es un programa que nos permite desarrollar modelos de simulación de grandes y complejas y sofisticadas animaciones, integrando modelos en varios entornos de TI, y se puede crear y utilizar bibliotecas personalizadas para áreas específicas de aplicación.


          Vamos a realizar una simulación similar a la practica anterior (simulación muelle con EJS) utilizando el programa de simulación Anylogic, pero en este caso vamos a tener también en cuenta el peso del objeto que con ayuda de la fuerza de la gravedad terrestre hace una fuerza vertical hacia abajo.



             



          Anylogic trabaja con Diagramas de Forrester, son herramientas específicas de modelado de los sistemas dinámicos, que es una metodología para el estudio de sistemas continuos complejos, mediante la búsqueda de relaciones entre los subsistemas. En los diagramas de Forrester la variable independiente es la t, no hace falta indicárselo.


          Para traducir las ecuaciones del sistema a este lenguaje debemos de realizar los siguientes cambios:









Funciones incógnitas:



      x      --->    x(0) = 1
      v      --->    v(0) = 0




         
          Después de estudiar el problema vamos a comenzar a traducirlo a lenguaje anylogic, en primer lugar dibujamos las funciones incógnitas como "stocks" y sus derivadas como "flows" y las relacionamos mútuamente. También podemos introducir el valor de todas las variables que intervienen en la simulación en el menú Main / Properties / Active Object Class / Advance.  e introducimos el valor de "g", "m", "K", "b". 




          Unimos con flechas "link" las funciones que estén relacionadas y ponemos la fuerza "f" como un parámetro para poder modificarla comodamente y observas las consecuencias en la simulación.
Podemos observar en la parte de abajo dónde se han especificado las ecuaciones necesarias para la simulación.



          Finalmente observamos la simulación como datos que cambian en el tiempo.





          Lo ideal es crear un entorno de simulación gráfica que veamos como se mueven los objetos representando el problema propuesto, en nuestro caso hemos elegido un tomate que se colgara de un muelle hasta casi quedar atrapado en un cepo. Relacionando estas imágenes con los parámetros de nuestro sistema estos realizarán los movimientos esperados.