• No se han encontrado resultados

Desarrollo de una herramienta software para la estimación de la probabilidad de eventos raros en redes de Jackson abiertas mediante el método RESTART

N/A
N/A
Protected

Academic year: 2020

Share "Desarrollo de una herramienta software para la estimación de la probabilidad de eventos raros en redes de Jackson abiertas mediante el método RESTART"

Copied!
83
0
0

Texto completo

(1)Escuela Técnica Superior de Ingenieros Informáticos Universidad Politécnica de Madrid. Desarrollo de una herramienta software para la estimación de la probabilidad de eventos raros en redes de Jackson abiertas mediante el método RESTART Trabajo Fin de Máster Máster Universitario en Inteligencia Artificial. AUTOR: Jorge Sánchez Cremades TUTOR/ES: Antonio Jiménez Martı́n y José Villén Altamirano. 2018.

(2)

(3) i. AGRADECIMIENTOS A mis padres, porque gracias a ellos he podido hacer este máster. Agradecer a Antonio Jiménez y a José Villén toda la ayuda proporcionada y la amabilidad que han tenido..

(4) ii.

(5) Índice. iii. Índice 1. 2. 3. 4. 5. 5.1. 5.2.. Resumen . . . . . . . . . . . . . . . . . . . . . . . . Abstract . . . . . . . . . . . . . . . . . . . . . . . . Introducción . . . . . . . . . . . . . . . . . . . . . . Objetivos . . . . . . . . . . . . . . . . . . . . . . . Modelos de colas . . . . . . . . . . . . . . . . . . . Elementos de un modelo de colas . . . . . . . . . . Notación de Kendall . . . . . . . . . . . . . . . . . 5.2.1. Medidas de rendimiento . . . . . . . . . . . 5.2.2. M/M/1 . . . . . . . . . . . . . . . . . . . . 5.2.3. M/M/c . . . . . . . . . . . . . . . . . . . . 5.2.4. M/M/∞ . . . . . . . . . . . . . . . . . . . . 6. Redes de colas . . . . . . . . . . . . . . . . . . . . . 6.1. Redes de Jackson . . . . . . . . . . . . . . . . . . . 6.1.1. Medidas de rendimiento . . . . . . . . . . . 6.2. Simulación de redes de colas . . . . . . . . . . . . . 7. Simulación de eventos raros . . . . . . . . . . . . . 8. RESTART . . . . . . . . . . . . . . . . . . . . . . . 8.1. Descripción . . . . . . . . . . . . . . . . . . . . . . 8.2. Tipos de eventos raros . . . . . . . . . . . . . . . . 8.3. Cálculo de la probabilidad del evento raro . . . . . 8.4. Eficiencia . . . . . . . . . . . . . . . . . . . . . . . 8.5. Prueba piloto . . . . . . . . . . . . . . . . . . . . . 8.6. Cálculo automático de la función de importancia . . 8.7. Variantes . . . . . . . . . . . . . . . . . . . . . . . 9. Aplicación . . . . . . . . . . . . . . . . . . . . . . . 9.1. Parte interna . . . . . . . . . . . . . . . . . . . . . 9.1.1. Refactorización y consistencia del programa 9.1.2. Red de Jackson . . . . . . . . . . . . . . . . 9.1.3. RESTART . . . . . . . . . . . . . . . . . . . 9.1.4. Guardado y cargado de la red . . . . . . . . 9.2. Parte gráfica . . . . . . . . . . . . . . . . . . . . . . 9.2.1. Pantalla de bienvenida . . . . . . . . . . . . 9.2.2. Pantalla principal . . . . . . . . . . . . . . . 9.2.3. Menús . . . . . . . . . . . . . . . . . . . . . 9.2.4. Edición de una red . . . . . . . . . . . . . . 9.2.5. Eventos raros y función de importancia . . . 9.2.6. Prueba piloto . . . . . . . . . . . . . . . . . 9.2.7. Ejecución RESTART . . . . . . . . . . . . . 10. Ejemplos de redes ejecutadas . . . . . . . . . . . . . 10.1. Red en tándem de 3 nodos . . . . . . . . . . . . . . 10.2. Red de 7 nodos . . . . . . . . . . . . . . . . . . . . 10.3. Red de 5 nodos . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 1 3 5 9 11 11 12 13 14 16 18 21 21 22 23 27 29 29 31 31 31 32 33 34 37 37 37 38 40 43 44 44 45 46 48 49 49 49 61 61 63 65.

(6) Índice. iv. 11.. Conclusiones y trabajo futuro . . . . . . . . . . . . . . . . . . . . . . 71.

(7) Índice de figuras. v. Índice de figuras 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.. Ejemplo de una simulación RESTART. [13] . . . . . . . . . . . . . . . Esquema básico de un modelo de colas. . . . . . . . . . . . . . . . . . Diagrama de transición de un modelo M /M /1. . . . . . . . . . . . . Diagrama de transición de un modelo M /M /c . . . . . . . . . . . . . Diagrama de transición de un modelo M /M /∞ . . . . . . . . . . . . Esquema básico de una red de colas abierta. . . . . . . . . . . . . . . Ejemplo ilustrativo de llegadas (ei ) y salidas (si ) a lo largo de la simulación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo de una simulación RESTART. . . . . . . . . . . . . . . . . . Ejemplo de una petición de información a la red. . . . . . . . . . . . Pantalla de bienvenida. . . . . . . . . . . . . . . . . . . . . . . . . . . Pantalla de creación de una nueva red. . . . . . . . . . . . . . . . . . Pantalla principal del programa. (1) Menús del programa. (2) Accesos directos a ciertas funciones del programa. (3) Área de edición de la red. Pantalla principal de la versión antigua del programa. . . . . . . . . . Dos redes en la versión antigua del programa. . . . . . . . . . . . . . Dos redes en la versión nueva del programa. . . . . . . . . . . . . . . Ventana de edición matricial y su distribución al mostrarse en la vista. Ventana de edición de un nodo y sus medidas de rendimiento. . . . . Ventana JN-Information. . . . . . . . . . . . . . . . . . . . . . . . . . Ventana JN-Performance. . . . . . . . . . . . . . . . . . . . . . . . . Arriba, ventana para la gestión de los eventos raros y la función de importancia. Abajo, ventana que se muestrea cuando el usuario desea crear un nuevo evento raro. . . . . . . . . . . . . . . . . . . . . . . . Ventana de parámetros de la prueba piloto. . . . . . . . . . . . . . . . Arriba, ventana que muestra el estado de la simulación. Abajo, ventana con los umbrales y repeticiones calculados por la prueba piloto. . Ventana de parámetros de RESTART. . . . . . . . . . . . . . . . . . Ventana con los resultados de 4 ejecuciones y su mediana. . . . . . . Red en tándem de 3 nodos. . . . . . . . . . . . . . . . . . . . . . . . Número de repeticiones a realizar en las distintas variantes de RESTART para cada umbral. . . . . . . . . . . . . . . . . . . . . . . . . . Red de 7 nodos a ejecutar. . . . . . . . . . . . . . . . . . . . . . . . . Umbrales y repeticiones para la red de 7 nodos. . . . . . . . . . . . . Red de 5 nodos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Umbrales y repeticiones para la red de 5 nodos para el evento raro de tipo suma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Umbrales y repeticiones para la red de 5 nodos para el evento raro de tipo máximo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comparativa entre los tiempos de ejecución de cada versión para las distintas ejecuciones realizadas. En cada ejecución se ha divido los tiempos entre el tiempo máximo de la ejecución. . . . . . . . . . . . .. 6 11 15 16 18 21 24 30 39 44 45 45 46 51 52 53 54 55 56. 56 57 58 59 59 61 62 63 64 65 67 68. 69.

(8) vi. Índice de figuras.

(9) Índice de cuadros. vii. Índice de cuadros 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.. Parámetros de la red en tándem. . . . . . . . . . . . . . . . . . . . Matriz de transiciones de la red en tándem. . . . . . . . . . . . . . Resultados obtenidos para la red en tándem. . . . . . . . . . . . . . Parámetros de la red de 7 nodos. . . . . . . . . . . . . . . . . . . . Matriz con las probabilidades de transición de la red de 7 nodos. . . Resultados obtenidos para la red de 7 nodos. . . . . . . . . . . . . . Parámetros de la red de 5 nodos. . . . . . . . . . . . . . . . . . . . Matriz con las probabilidades de transición de la red de 5 nodos. . . Resultados de la simulación del evento raro de tipo suma en la red de 5 nodos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resultados obtenidos para el evento raro de tipo máximo en la red de 5 nodos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . .. 61 61 63 64 64 65 66 66. . 66 . 68.

(10) 1. 1.. Resumen. Este Trabajo Fin de Máster es la continuación del desarrollo de un programa para la simulación de eventos raros en una red de colas utilizando el método RESTART. Una red de colas es una red de nodos en la que en cada nodo se presta un servicio, como podrı́a ser una cadena de montaje de coches. Interesa estudiar estas redes y obtener sus medidas de rendimiento para posibles mejoras. Existen fórmulas matemáticas cerradas para el cálculo de ciertas medidas de rendimiento en redes con unas caracterı́sticas concretas pero, si la red a estudiar no cumple estas caracterı́sticas o se desea obtener otras medidas de rendimiento más complejas entonces se requiere del uso de simulaciones informáticas de la red. Un evento raro es un cambio en la red que genera un nuevo estado de la red muy poco probable, haciendo que la obtención de su probabilidad por métodos comunes de simulación sea impracticable por el tiempo requerido para que el evento se produzca. El método RESTART permite acelerar este proceso de simulación dividiendo los estados de la red en regiones. RESTART irá recorriendo estas regiones hasta conseguir alcanzar el estado objetivo, donde ocurre el evento raro, mediante sucesivas repeticiones de la simulación en cada región. Esto permite conseguir que el evento raro sea más probable que ocurra en la simulación, permitiendo obtener su probabilidad de una forma extremadamente rápida comparado con otros métodos de simulación y obtener resultados de su probabilidad bastante aproximados. Para poder llevar a cabo estos análisis se ha desarrollado un programa gráfico que permite diseñar redes de colas de Jackson abiertas, especificar los eventos raros que se quieren simular y realizar su simulación utilizando el método RESTART. Este programa ha sido pensado para dos tipos de usuarios, un usuario inexperto y otro experto. Al usuario inexperto se le dan las herramientas básicas de forma clara y sencilla para que pueda diseñar la red que desea simular, especificar el evento raro y ejecutar la simulación sin necesidad de introducir parámetros. Sin embargo, a un usuario experto se le da la posibilidad de modificar distintas propiedades del método RESTART para ajustarlo a su criterio y obtener resultados más pulidos..

(11) 2. 1 Resumen.

(12) 3. 2.. Abstract. This Final Master Thesis is the continuation of the development of a program for the simulation of rare events in queueing networks using the method RESTART. A queueing network is a network composed of nodes in which each node offers a service like, for example, a car assembly line. It’s interesting to study these networks and obtain their performance measures for possible improvements. There exist mathematical formulas for the calculation of some performance measures but, the network must have some concrete properties. If the network doesn’t have these properties or more complex measures want to be calculate, then computer simulations of the network are required. A rare event is an occurrence that may change the network state into a very improbable one, the calculation of its probability using standard simulation methods is impracticable due to the large simulation time required for the event to occur. RESTART allows the acceleration of this simulation process by dividing the possible network states into regions. RESTART will traverse these regions until reaching the rare event region making several repetitions of the simulation path in each region. These repetitions make the rare event occurrence probability more likely during simulation, making the calculation of its probability extremely fast compared with other simulation methods and obtaining accurate results. For the analysis of this probabilities, a program has been developed that allows to graphically design open Jackson networks and compute RESTART on them. This program has been designed for two kinds of users, an inexpert user and an expert user. An inexpert user can easily and intuitively design the network he desires to simulate, specify the rare event and execute RESTART without the need to introduce RESTART parameters. On the other hand, an expert user can deeply customize the parameters of RESTART and obtain better results..

(13) 4. 2 Abstract.

(14) 5. 3.. Introducción. En la vida real es muy común encontrarse sistemas en los que se da un servicio a un cliente pero que, si el sistema está ocupado dando servicio a otro, hay que esperar a ser atendidos en una cola. Lugares como hospitales, supermercados, aeropuertos o sistemas informáticos presentan esta caracterı́stica por lo que su estudio es de gran interés por parte del propietario para detectar puntos débiles, como cuellos de botella, y poder mejorar el sistema. Existe un área de la Investigación Operativa, denominada teorı́a de colas, que se encarga de estudiar estos sistemas de manera analı́tica para obtener fórmulas matemáticas para el cálculo de medidas de rendimiento, como puede ser el número medio de clientes en el sistema. Un modelo de colas es un modelo matemático que representa un sistema en el cual un grupo de clientes, denominado población, entra al sistema con una cierta tasa de llegadas para recibir un servicio y salir del sistema. El servicio se realiza en un determinado tiempo, denominado tiempo de servicio, y puede ser realizado por varios servidores idénticos en paralelo. Si todos los servidores están ocupados entonces los clientes que lleguen al sistema tendrán que esperar en una cola a ser atendidos. Un ejemplo podrı́a ser una pescaderı́a, donde los clientes van llegando para ser atendidos por uno de los pescaderos. Si todos los pescaderos están ocupados atendiendo a otro cliente entonces el cliente tendrá que esperar en la cola, en este caso una cola FIFO, el primero en entrar a la cola es el primero en salir. También existen sistemas en los que se imparten distintos servicios, su modelización se denomina redes de colas y es un sistema de nodos interconectados en donde cada nodo es un modelo de colas especı́fico. Un ejemplo en la vida real podrı́a ser un hospital, donde en cada departamento se imparte un servicio y algunos están conectados entre ellos, por ejemplo el servicio de urgencias prestará un servicio y cuando acabe enviará al paciente a otro servicio dependiendo de su dolencia. Las denominadas redes de Jackson son redes de colas con unas caracterı́sticas concretas para las que existen fórmulas cerradas para el cálculo de ciertas medidas de rendimiento. El problema es que muchos modelos no cumplen estas caracterı́sticas o se busca estudiar ciertas medidas de rendimiento que no son fácilmente derivables matemáticamente. En estos casos se utilizan métodos aproximados para el cálculo de estas medidas de rendimiento. Uno de ellos es la simulación, que trata de simular las redes de colas informáticamente permitiendo un estudio en profundidad del sistema. El estado de una red se representa como el número de clientes que hay en cada nodo. Se denomina evento de simulación, en adelante evento, a un acontecimiento instantánea que puede alterar el estado de la red. Por ejemplo, la entrada de un cliente a un nodo que provoque que haya 30 clientes o más en total. Un evento raro es un evento que es muy poco probable que ocurra dentro de un sistema, muchas veces no existen fórmulas matemáticas para calcular la probabilidad de este evento y su baja probabilidad lo hace muy difı́cil de reproducir mediante simulación, dado que tardarı́a una gran cantidad de tiempo en suceder y generarı́a tiempo de simulación.

(15) 6. 3 Introducción. intratables. Para poder estudiar estos eventos raros de una manera práctica existen diversos métodos, en este trabajo utilizaremos el método RESTART. El método RESTART es un algortimo desarrollado por José Villen-Altamirano y Manuel Villén-Altamirano [13]. Es un método de simulación para el cálculo de sucesos raros mediante una técnica denominada splitting pero mejorada. RESTART establece una serie de regiones, delimitadas por umbrales, los cuales tienen asignado un valor numérico de importancia. Se puede entender importancia como la posibilidad de encontrarse en la región donde se produce el evento raro, a mayor importancia mayor es la probabilidad que ocurra el evento raro. Mediante una función conocida como función de importancia RESTART mapea el estado actual de la simulación a un valor numérico de importancia, lo que le permite saber en qué umbral se encuentra. La simulación va moviéndose por estos umbrales hacia el umbral en la que se produce el evento raro, el cual tiene el mayor valor de importancia. Desde el punto donde se alcanza cada umbral realizará una serie de repeticiones de la simulación para tener más posibilidades de conseguir alcanzar el siguiente umbral con un coste adicional de computación relativamente pequeño. Cuando el número de repeticiones en un umbral se agota, la simulación prosigue normalmente hasta que vuelve a alcanzar otro umbral. Esto permite acelerar drásticamente el tiempo de simulación permitiendo obtener la probabilidad del evento raro en tiempos de simulación muy reducidos. En la Figura 1 se muestra un ejemplo de simulación mediante el método RESTART. Se han establecido cuatro umbrales, siendo TL el umbral a partir del cual se produce el evento raro. Cada umbral tiene asignado un valor de importancia representado en el eje Y. En cada umbral se permite un número máximo de tres repeticiones si no se alcanza el siguiente umbral. Di representa una repetición en el umbral i que no consigue llegar al siguiente umbral y Bi el punto donde se alcanzó el umbral i desde el umbral i − 1. Las repeticiones de la simulación en el umbral i comienzan desde el punto Bi . Las lı́neas indican los valores de importancia que toma el estado de la red durante la simulación a lo largo del tiempo.. Fig. 1: Ejemplo de una simulación RESTART. [13] Este trabajo se centra en mejorar y continuar el desarrollo de una aplicación.

(16) 7. gráfica que permite el diseño de redes de Jackson, especificar distintos tipos de eventos raros y ejecutar RESTART sobre la red para calcular las probabilidades de estos eventos raros. La aplicación ha sido pensada para su utilización tanto por un usuario experto como uno inexperto por lo que es muy intuitiva, gráfica y fácil de usar, pero que permite un alto grado de personalización de la simulación RESTART si ası́ se desea. El programa permite la creación y configuración de nodos de forma gráfica y matricial. Estos nodos son conectados mediante una matriz de probabilidades de transición para formar la red de colas. El usuario introduce el evento raro que desea simular, pudiendo seleccionar entre tres tipos: número de clientes en un nodo igual o superior a un valor establecido, suma del número de clientes de varios nodos superior a un valor introducido o número de clientes alcanzado en alguno de los nodos seleccionados igual o superior a un valor establecido. Al usuario se le permite calcular de forma automática la función de importancia o introducirla a mano. Una vez está todo configurado, el usuario realiza una simulación de prueba, denominada prueba piloto, que calcula automáticamente los umbrales en los que se divide el sistema y las repeticiones a realizar en cada umbral. Por último, el usuario ejecuta una simulación RESTART para calcular la probabilidad del evento raro. Esta simulación se puede configurar de varias maneras dependiendo de las preferencias del usuario experto. Además de la simulación de eventos raros, el programa proporciona todas las medidas de rendimiento tı́picas de los modelos de colas y redes de Jackson abiertas. El usuario puede ver estas medidas para el conjunto de la red o para un nodo en concreto, pudiendo analizar la red y hacer cambios en las propiedades de la red y sus nodos en tiempo real. También permite otras opciones adicionales, como guardar una imagen de la red en distintos formatos, guardar la red en un archivo o importar una red guardada..

(17) 8. 3 Introducción.

(18) 9. 4.. Objetivos. El objetivo principal del trabajo es la mejora y continuación del programa gráfico para la simulación de eventos raros mediante el método RESTART. La primera fase consistirá en mejorar el programa ya existente para su correcto funcionamiento, arreglando fallos importantes y mejorando caracterı́sticas internas del código y optimizarlo. La segunda fase consistirá en añadir nuevas funcionalidades al programa para poder realizar simulaciones más complejas para nuevos tipos de eventos raros. Para ello, se han establecido los siguientes subobjetivos: Estudiar los modelos de colas y redes de colas, concretamente las redes de Jackson abiertas dado que son las que el programa implementará. Esto me permitirá poder diseñar redes de colas y poder entender y aplicar las distintas medidas de rendimiento. Investigar sobre los métodos de simulación de redes de colas. Aunque no se vayan a implementar en el programa, me ayudará a comprender con más facilidad el método RESTART. Estudiar el método RESTART, parte principal sobre la que se basa el trabajo. Obtener la comprensión necesaria para la fácil implementación de las nuevas caracterı́sticas de RESTART que se desean implementar. Analizar el código y el funcionamiento de la aplicación sobre la que parte el trabajo. El código está escrito en C++ y usa el framework QT para la interfaz gráfica, por lo que aprender QT será necesario para entender y ampliar el código. Es importante entender las estructuras de datos usadas y la estructura de diseño que sigue el código. Mejorar el programa, haciéndolo más consistente e intuitivo. El programa en su estado inicial tiene muchos errores y hace casi imposible su uso normal. Ası́ mismo, la interfaz no es muy intuitiva por lo que un usuario, sobre todo a uno inexperto en el método RESTART, tendrá muchas dificultades para poder diseñar una red y ejecutar RESTART. Implementar nuevas funcionalidades al programa para dotarlo de mayor potencial. Se quieren probar variantes de RESTART para estudiar su funcionamiento, dar más opciónes de configuración y añadir más tipos de eventos raros. Una prioridad será enfocar RESTART a un usuario inexperto, por lo que se requerirá diseñar herramientas de automatización para el cálculo de ciertas propiedades de RESTART, como la función de importancia. Traducir los textos de la parte gráfica al inglés. Realizar pruebas sobre redes de colas para estudiar los resultados obtenidos y corroborar el correcto funcionamiento del programa y su diseño visual. Esto es.

(19) 10. 4 Objetivos. importante de cara a las nuevas funcionalidades que se añadirán, permitiendo comprobar su funcionamiento y analizar los resultados para poder sacar conclusiones..

(20) 11. 5.. Modelos de colas. En la vida real es muy común encontrarse en situaciones donde hay que esperar en una cola para obtener un servicio, ejemplos como una cola de supermercado, una cadena de montaje, el procesamiento de datos en un servidor, etc. a menudo presentan una situación de espera debido a que la demanda del servicio es mayor que la velocidad a la que se presta el mismo. Su estudio es interesante desde distintos puntos de vista (económicos, confort...) por lo que se han ido estudiando matemáticamente, concretamente en el área denominada teorı́a de colas, para su análisis y la obtención de datos de una forma analı́tica. En este capı́tulo se expondrá de una forma simplificada algunos modelos de colas básicos, notación y medidas de rendimiento que se usarán a lo largo de este TFM.. 5.1.. Elementos de un modelo de colas. Un modelo de colas es una representación de un sistema en el que puede existir una condición de espera para entrar. Estos sistemas siguen un esquema secuencial básico como se muestra en la Figura 2. Existe una población de clientes (donde cliente es un término genérico usado independientemente de si se trata de personas, programas, trabajos, etc.) los cuales van llegando al sistema de forma individual. En el sistema existen una serie de servidores que darán servicio a los clientes según vayan llegando. Si un cliente entra al sistema y todos los servidores están ocupados tendrá que esperar en una cola hasta que pueda ser atendido por un servidor libre. Una vez un cliente ha sido servido, sale del sistema.. Fig. 2: Esquema básico de un modelo de colas. Un modelo de colas puede representarse mediante una serie de caracterı́sticas: Población: Representa el conjunto de clientes que llegan al sistema. Puede ser finita o infinita. Una población infinita implica un análisis matemático más sencillo por lo que es el modelo más común. Poblaciones finitas pero suficientemente grandes suelen considerarse como infinitas para la simplicación matemática de los modelos. Modelo de llegadas: Los clientes llegan al sistema siguiendo un modelo de llegadas concreto. Este puede ser determinista o aleatorio. Un modelo determinista es aquél donde los clientes llegan al sistema cada cierto tiempo contante. Esto permite caracterizarlo como una tasa media de clientes por unidad de tiempo, conocida como tasa media de llegadas λ, siendo 1/λ el tiempo entre llegadas consecutivas. Un modelo aleatorio es aquél en el que las llegadas de los clientes es un proceso estocástico, siendo el más común un proceso de Poisson, donde el tiempo entre llegadas sigue una distribución exponencial con tasa λ..

(21) 12. 5 Modelos de colas. Número de servidores: Un sistema puede tener uno o más servidores en paralelo al que los clientes accederán cuando estén libres. Estos servidores son independientes entre sı́ y una vez atienden a un cliente, este sale del sistema. El caso más básico y que se utilizará a lo largo de este documento es aquel en donde la entrada a los servidores del sistema (ya sea un único servidor o varios) proviene de una única cola, como por ejemplo en una carnicerı́a. Los clientes esperan en una única cola y los carniceros (que pueden ser solo uno o varios) llamarán al siguiente cliente en la cola una vez hayan acabado de dar servicio al anterior cliente. Modelo de servicio: Un servidor atenderá al cliente actual en un determinado tiempo, conocido como tiempo de servicio. El número medio de clientes servidos por unidad de tiempo se denomina μ. Al igual que en el modelo de llegadas, este tiempo de servicio puede ser determinista, siendo el tiempo de servicio una constante o aleatorio, donde se especificará una distribución de probabilidad sobre una variable aleatoria s. Normalmente se usa una distribución exponencial con tasa μ. Cabe aclarar que la tasa media de clientes servidos μ indica el número medio de clientes que serán procesados por unidad de tiempo si el servidor está continuamente ocupado. Por ejemplo, si μ = 10 clientes por hora, esto indica que los clientes salen del servidor a una tasa de 10 clientes por hora si el servidor está atendiendo a clientes continuamente, es decir, está ocupado el 100 % del tiempo. Disciplina de la cola: La cola del sistema estará regida por un modelo de comportamiento. Existen númerosos modelos de comportamiento dependiendo del sistema que se esté estudiando, cada uno con sus caracterı́sticas y distinto análisis matemático. Los más comunes suelen ser: FIFO (first in, first out): El primer cliente que llegó es el primero que sale de la cola. LIFO (last in, first out): El último cliente en llegar es el primero en salir. SIRO (service in random order): Se elige al siguiente cliente en salir de la cola de modo aleatorio. Capacidad del sistema: La longitud de la cola normalmente se considera infinita. Sin embargo, ésta podrı́a tener un número máximo de clientes en espera K, lo que implicará que una vez se alcance K clientes esperando en cola los siguientes clientes en llegar serán rechazados.. 5.2.. Notación de Kendall. Estas seis caracterı́sticas que describen un modelo de colas se suelen representar de una forma abreviada denominada notación de Kendall [3]. Esta notación se representa como A/B/c/K/m/Z, donde: A: Modelo de llegadas, tomará el valor M si es un proceso de Poisson, D si el tiempo entre llegadas es contante o Ek si el tiempo entre llegadas sigue una distribución Erlang de k etapas..

(22) 5.2 Notación de Kendall. 13. B : Modelo de servicio, tomará el valor M si el tiempo de servicio es exponencial, D si el tiempo de servicio es determinista. c: Número de servidores. K : Capacidad del sistema. m: Tamaño de la población. Z : Disciplina de la cola. Por ejemplo, M /M /5/∞/∞/FIFO indicarı́a un sistema cuyo modelo de llegadas es un proceso de Poisson con 5 servidores cuyo tiempo de servicio es exponencial, capacidad del sistema infinita, un tamaño de población infinito y una disciplina de cola FIFO. Normalmente, K = m = ∞ y Z = FIFO, por lo que se suelen omitir, por lo tanto, el ejemplo anterior se suele escribir como M /M /5. 5.2.1.. Medidas de rendimiento. Conociendo los parámetros cque forman el modelo de colas (elementos que aparecen en la notación de Kendall, la tasa de llegadas λ y la tasa de servicio μ) podemos calcular ciertas medidas de rendimiento (también denominadas medidas de interés) que nos aportarán cierta información del comportamiento del sistema. Los modelos de colas representan sistemas dinámicos pero, para su estudio y cálculo de las medidas de rendimiento nos interesa un estado del sistema en equilibrio, es decir, cuando el comportamiento transitorio inicial ha terminado y nos encontramos en un estado estacionario y normalizado y, por lo tanto, las medidas de rendimiento son independientes del tiempo. En un estado estacionario se verifica que la tasa a la que los clientes llegan al sistema es igual a la tasa de la que salen del mismo, a esto se le denomina sistema estable. Si esta situación se cumple entonces existen fórmulas cerradas para el cálculo de las medidas de rendimiento. Las medidas de rendimiento más importantes y usadas son: Probabilidad de que haya n clientes en el sistema, πn : Indica la probabilidad de que n clientes se encuentren en el sistema, P (N ≤ n). Intensidad del tráfico, r : Indica la cantidad de trabajo a la que está sometido el sistema. Por ejemplo, si r = 0.75 indica que el 75 % del tiempo los servidores estarán ocupados. Factor de utilización del servidor, ρ: Es la tasa de trabajo media de cada servidor. En el caso anterior, si c = 1 (solo un servidor) entonces ρ = r = 0.75, si c = 3 entonces ρ = r/3 = 0.25, la carga de trabajo se divide entre tres servidores y de media cada servidor estará ocupado el 25 % del tiempo. ρ se utiliza para ver si el sistema es estable. La condición de estabilidad se cumple si ρ < 1..

(23) 14. 5 Modelos de colas. Tiempo de permanencia en el sistema, w : Mide el tiempo medio total que un cliente permanece en el sistema, es decir, el tiempo en la cola más el tiempo en el servidor. Tiempo en cola, wq : Tiempo medio que un cliente se pasa esperando en la cola. Número medio de clientes en el sistema, L. Número medio de clientes en la cola, Lq . Tamaño esperado de la cola cuando hay cola, Lq . Distribución de la variable aleatoria q, probabilidad de que el tiempo de espera de un cliente en cola sea menor o igual que t, Fq (t). Distribución de la variable aleatoria w, probabilidad de que el tiempo de estancia de un cliente dentro del sistema sea menor o igual que t, Fw (t). Existen unas ecuaciones que relacionan los tiempos medios con los números medios de clientes denominadas ecuaciones de Little [6]: L = λW, Lq = λWq .. (1). Las ecuaciones de Little son válidas bajo condiciones muy generales. El sistema a de ser estable, tener al menos un servidor y los clientes han de llegar al sistema de uno en uno (no en grupos). Dependiendo del modelo de sistema, la fórmula para cada medida de rendimiento puede variar. A continuación, se describen las fórmulas para los modelos M/M/1 y M/M/c, siendo este último de especial interés dado que es el modelo de colas sobre el que se centra el trabajo. 5.2.2.. M/M/1. En este modelo sólo se dispone de un servidor por lo que se prestará servicio a los clientes de uno en uno, teniendo el resto que esperar en la cola. El diagrama de transición del modelo se muestra en la Figura 3. Para este modelo se tiene que: r=ρ=. λ . μ. El modelo tiene una solución en equilibrio, es decir, se puede alcanzar la estabilidad en el sistema si se cumple ρ < 1. Con el sistema en equilibrio podemos calcular las distintas medidas de rendimiento aplicando las siguientes fórmulas:.

(24) 5.2 Notación de Kendall. 15. Fig. 3: Diagrama de transición de un modelo M /M /1. Probabilidad de que haya n clientes en el sistema, πn : 1 π0 = = 1 − ρ, 1/(1 − ρ) πn = (1 − ρ)ρn , n = 0, 1, 2, 3... . Número medio de clientes en el sistema, L: ρ λ L= = . 1−ρ μ−λ Número medio de clientes en la cola, Lq : Lq =. ρ2 λ2 = . 1−ρ μ(μ − λ). Tamaño esperado de la cola cuando hay cola, Lq : Lq =. 1 . 1−ρ. El tiempo de permanencia en el sistema W y tiempo en cola Wq se calculan a través de las ecuaciones de Little como se muestra en (1). L ρ = , λ λ(1 − ρ) Lq ρ2 Wq = = . λ λ(1 − ρ) W =. Distribución de la variable aleatoria q, probabilidad de que el tiempo de espera de un cliente en cola sea menor o igual que t, Fq (t): Fq (t) = P (q = 0) + P (0 < q ≤ t) = 1 − ρ + ρ(1 − e−t/W ) = 1 − ρe−t/W. (t > 0).. Distribución de la variable aleatoria w, probabilidad de que el tiempo de estancia de un cliente dentro del sistema sea menor o igual que t, Fw (t): Fw (t) = P (w ≤ t) = 1 − e−μ(1−ρ)t = 1 − e−t/W. (t ≥ 0).. Probabilidad de encontrar al menos n clientes, P (N ≥ n): P (N ≥ n) = ρn .. (2).

(25) 16. 5 Modelos de colas. 5.2.3.. M/M/c. A diferencia del modelo anterior, este modelo dispone de un número c de servidores idénticos, es decir, la tasa de servicio μ es igual para todos. Por lo tanto, la tasa a la que se presta servicio será:  nμ, si n = 1,2,...,c cμ, si n ≥ c como se muestra en la Figura 4.. Fig. 4: Diagrama de transición de un modelo M /M /c El sistema será estable si nuevamente se cumple ρ < 1, donde esta vez. λ . cμ Las medidas de rendimiento para este modelo y las que se usan en el programa desarrollado, como posteriormente se comentará, son: ρ=. Intensidad del tráfico, r : r=. λ . μ. Probabilidad de que haya n clientes en el sistema, πn : π0 =. c−1 n  r n=0. . πn =. n!. +. rc c!(1 −. rn π, n! 0 rn π, c!cn−c 0. λ ) cμ. ,. si n = 0,1,...,c si n ≥ c. Fórmula C de Erlang: Es una medida de rendimiento interesante de calcular para los modelos M /M /c. La llamada C de Erlang indica la probabilidad de que un cliente tenga que esperar en la cola debido a que todos los servidores se encuentran ocupados: C(c, r) = P (Número clientes ≥ c) =. ∞  n=c. πn =. πc . 1−ρ.

(26) 5.2 Notación de Kendall. 17. Número medio de clientes en la cola, Lq : Lq = C(c, r). ρ . 1−ρ. Tiempo en cola, Wq : Wq =. Lq . λ. Tiempo de permanencia en el sistema, W : Se puede calcular mediante la suma del tiempo en cola y el tiempo recibiendo el servicio Ws 1 , μ W = Wq + Ws . Ws =. Número medio de clientes en el sistema, L: Se calcula mediante la Fórmula de Little (1) L = λW. Tamaño esperado de la cola cuando hay cola, Lq : Lq =. 1 . 1−ρ. Tiempo en cola cuando hay que esperar, Wq : Tiempo medio que un cliente se pasa esperando en la cola cuando tiene que esperar Wq =. Wq . C(c, r). Distribución de la variable aleatoria q, probabilidad de que el tiempo de espera de un cliente en cola sea menor o igual que t, Fq (t) Fq (t) = 1 − C(c, r)e−(1−ρ)cμt . Distribución de la variable aleatoria w, probabilidad de que el tiempo de estancia de un cliente dentro del sistema sea menor o igual que t, Fw (t).  Fw (t) =. C(c,r) −(1−ρ)cμt e−μt + c−1−r e , si r = c − 1 1 + r−c+1−C(c,r) c−1−r −μt 1 − [1 + C(c, r)μt]e , si r = c − 1.

(27) 18. 5 Modelos de colas. 5.2.4.. M/M/∞. El modelo M /M /∞ es muy similar al modelo M /M /c pero cuenta con un número ilimitado de servidores lo que implica que todo cliente que llega al sistema sea atendido inmediatamente, es decir, nunca habrá un cliente en cola. Este modelo es interesante para estimar medidas de rendimiento de sistemas de redes con capacidades de servicio muy grandes, como el número medio de lı́neas en uso en una gran red de comunicaciones o sistemas donde el número de servidores es suficientemente grande como para considerarlo infinito y simplificar los cálculos. En la Figura 5 se muestra el diagrama del modelo M /M /∞. Debido a al número ilimitado de servidores, la tasa a la que se presta servicio es: μn = nμ,. n = 1, 2, 3... .. Fig. 5: Diagrama de transición de un modelo M /M /∞ Gracias a la caracterı́stica de este modelo se pueden simplificar las fórmulas de las medidas de rendimiento. Probabilidad de que haya n clientes en el sistema, πn : πn =. (λ/μ)n − μλ e , n!. n = 0, 1, 2, 3... .. Número medio de clientes en el sistema, L: L=. λ . μ. Número medio de clientes en la cola, Lq : Lq = 0. Tamaño esperado de la cola cuando hay cola, Lq : Lq = 0. Tiempo de permanencia en el sistema, W : W = Ws =. 1 . μ.

(28) 5.2 Notación de Kendall. 19. Distribución de la variable aleatoria w, probabilidad de que el tiempo de estancia de un cliente dentro del sistema sea menor o igual que t, Fw (t): Sigue una distribución exponencial de tasa μ Fw (t) = Exp(μ). A parte de los modelos de colas comentados M /M /1 y M /M /c existen otros modelos bastante comunes y bien estudiados pero que no los estudiaremos en profundidad porque sus caracterı́sticas no nos interesan para el trabajo realizado. El modelo M /M /c/K, el cual es una extensión del anteriormente explicado M /M /c. Este modelo presenta una limitación en cuanto a la capacidad del sistema, cuya capacidad máxima ahora es K clientes. Este modelo se comporta igual que el modelo M /M /c mientras n ≤ K, si n > K entonces λ = 0. Uno de los modelos más útiles en teorı́a de colas es el modelo M/M/1/K/K, en donde el sistema tiene una población finita de K clientes, estos clientes pueden estar en el sistema (sirviéndose o en la cola) o fuera del mismo hasta que precisen entrar al sistema. A este modelo se le conoce como modelo de reparación de máquinas. Los clientes una vez servidos saldrán del sistema y se incorporarán a la población hasta que requieran otra vez del servicio del sistema..

(29) 20. 5 Modelos de colas.

(30) 21. 6.. Redes de colas. En el capı́tulo anterior introdujimos los modelos de colas, sistemas donde los clientes acuden para recibir un único servicio y una vez recibido lo abandonan. Sin embargo, en la vida real es común encontrarse sistemas que ofrecen distintos servicios, por ejemplo una cadena de montaje de coches tiene varias etapas, primero se monta el chasis en un área, seguidamente los coches con chasis se desplazan a un nuevo área donde se les tapiza y ası́ sucesivamente entre varios servicios hasta que el coche sale de la cadena de montaje a un concesionario. Llamamos redes de colas a los sistemas formados por distintos modelos de colas, en adelante nodos, que funcionan de forma ası́ncrona y concurrentemente en los que se presta un servicio. Estos nodos pueden o no estar relacionados entre sı́, un esquema básico puede verse en la Figura 6. Los clientes entrarán a un nodo, recibirán el servicio y saldrán del mismo, cuando salgan podrán dirigirse a otro nodo dependiendo de una matriz de transiciones entre nodos, pudiendo estas transiciones ser aleatorias o deterministas. Por ejemplo, en una red de servidores un tipo concreto de archivos será tratado por una serie de servidores en concreto siguiendo un orden de procesamiento.. Fig. 6: Esquema básico de una red de colas abierta. Existen dos tipos de redes de colas, abiertas y cerradas. Las abiertas son aquellas donde existe al menos un punto de entrada y salida de la red, por lo que el número de clientes es variable, las redes cerradas son aquellas donde no existe ninguna entrada y salida de la red, y el número de clientes dentro del sistema se mantiene constante. De ahora en adelante trabajaremos con redes de colas abiertas.. 6.1.. Redes de Jackson. Existe un teorema para las redes de colas abiertas denominado Teorema de Burke. Teorema 1 (Teorema de Burke): El proceso de salidas de clientes en un sistema M/λ < 1) con tasa de llegadas λ es un proceso de Poisson de tasa M/c estable (ρ = cμ λ. [2] Esto indica que el proceso de llegadas y de salidas son idénticos, concretamente una distribución exponencial  de kparámetro λ. Esto permite el cálculo de una distribución estacionaria π = n,m πn que indica la probabilidad de que haya n clientes en el nodo k, la demostración puede verse en [15]..

(31) 22. 6 Redes de colas. Esta distribución estacionaria permite la definición de una generalización de ciertas redes de colas abiertas denominadas redes de Jackson como indica el siguiente teorema. [9] Teorema 1 (Teorema de Jackson): Sea una red de colas, denominada red de Jackson, con R nodos que satisfacen las siguientes condiciones: 1. Cada nodo i consiste en ci servidores idénticos, cada uno con un tiempo de servicio exponencial de tasa μi . 2. La llegada de clientes al nodo i desde fuera del sistema es según un proceso de Poisson de tasa λi . (También pueden llegar clientes al nodo i desde otros nodos de dentro de la red). 3. Una vez servido el cliente en el nodo i, el cliente pasa de forma instantánea al nodo j (donde se puede dar que j = i) con probabilidad pij o puede abandonar  la red con probabilidad 1 − R j=1 pij . Entonces para cada nodo i, la tasa media total de llegadas Λi es Λ i = λi +. R . Λi pij. donde R es el número total de nodos.. (3). j=1. Además, si π(n1 , ..., nR ) denota la probabilidad estacionaria de que haya ni clientes en el nodo 1,...,R, y Λi < ci μi , para todo i, entonces π(n1 , ..., nR ) = π1 (n1 )...πR (nR ), donde πi (ni ) es la probabilidad estacionaria de que haya ni clientes en el nodo i si éste se trata como un sistema M /M /ci con tasa media de llegadas Λi y tasa media de servicio μi en cada servidor. Más aún, cada nodo se comporta como si fuese un sistema M /M /ci independiente, con llegadas de Poisson de tasa Λi . Cabe destacar que si existe retroalimentación en un nodo (pii = 0) el proceso de llegadas totales a ese nodo no será un proceso de Poisson, pero, el teorema de Jackson indica que las redes de Jackson en las que esto ocurre se comportan como sı́ todos los procesos de llegadas fueran procesos de Poisson por lo que esto no produce ningún problema. 6.1.1.. Medidas de rendimiento. Para poder calcular las medidas de rendimiento, al igual que en los modelos de colas, hace falta que la red de colas sea estable, es decir, que se cumpla la condición de estabilidad. Una red de colas es estable si se cumple que para todo nodo i : λi <1 cμi. (4).

(32) 6.2 Simulación de redes de colas. 23. o lo que es lo mismo ρi < 1. Si esto se cumple entonces podemos calcular el número medio de clientes en la red, L, y el tiempo de permanencia en la red, W. Resulta que L es la suma del número medio de clientes en cada nodo Li y, una vez se ha calculado, W se obtiene aplicando la ecuación de Little (1) como L=. R . Li ,. i=1. L W = , λ. 6.2.. donde λ =. R . λi .. i=1. Simulación de redes de colas. Hasta ahora hemos visto modelos y redes de colas concretos los cuales poseen unas ciertas caracterı́sticas y cumplen una serie de requisitos que permiten aplicar procedimientos analı́ticos para la obtención de fórmulas cerradas para el cálculo de ciertas medidas de interés. Sin embargo, muchas veces nos encontramos con sistemas que no cumplen alguna de estas caracterı́sticas, por ejemplo, sistemas con tiempos de llegadas arbitrarios, disciplinas de colas que no son FIFO, nodos con un máximo de clientes en cola, tiempos de servicios no exponenciales, etc. Esto hace imposible o muy difı́cil el cálculo de fórmulas cerradas lo que nos lleva a la obtención de soluciones aproximadas mediante métodos de aproximación. Existen diversos métodos de aproximación, por ejemplo, algunos simplifican ciertos puntos del sistema para aproximar el comportamiento de la red a uno más sencillo o que cumpla ciertas caracterı́sticas. En adelante nos centraremos en un método aproximado denominado simulación, en este caso simulación de redes de colas. La simulación de redes de colas es especialmente útil cuando necesitamos calcular medidas de rendimiento complejas para las cuales no son fáciles de obtener fórmulas matemáticas cerradas. La simulación de una red de colas es un método que intenta imitar, de la forma más exacta posible, el comportamiento del sistema real mediante un programa informático. Esto permite un estudio bastante aproximado y personalizable, permitiendo simular situaciones hipotéticas, contraer o expandir el tiempo, cambiar de forma dinámica el sistema y otro sin fin de modificaciones que otros métodos de aproximación no permiten. Debido a la potencia actual de los ordenadores se puede llegar a simular un sistema real de una forma muy próxima a la realidad y sin requerir las caracterı́sticas que los modelos analı́ticos necesitan. Aun ası́, este método es un método aproximado y hay que ser cautos con el resultado obtenido y su utilización, teniendo también en cuenta que puede haber sufrido de errores humanos dando resultados muy alejados de la realidad. La construcción de un método de simulación [1] se divide en:.

(33) 24. 6 Redes de colas. 1. Formulación del problema: Consiste en definir los objetivos, componentes del sistema, variables a estudiar, etc. 2. Recolección y procesamiento de la información del sistema real: Capturar los datos reales que se requieran para la simulación del sistema y procesarlos para obtener información útil. Posibles fuentes son el estudio de campo por ejemplo, ver la tasa de clientes que llegan a la tienda de media cada hora, obtención de datos históricos o información dada por expertos. 3. Formulación del modelo matemático: Caracterizar matemáticamente la información extraı́da en la anterior fase, como por ejemplo, el cálculo de las distribuciones de probabilidad de los procesos de servicio. 4. Implementación de un programa de simulación. 5. Realización de experimentos con el programa para la obtención de resultados. 6. Estudio de los resultados. El programa de simulación tendrá una reloj de simulación que representa el tiempo transcurrido y este reloj avanza cuando suceden eventos. Existen dos tipos de eventos, evento de llegada de un cliente (desde fuera de la red o desde la cola del nodo) y evento de salida de un cliente de un nodo. Estos eventos modifican el estado de un nodo (número de clientes). En la Figura 7 se muestra un ejemplo ilustrativo de los eventos de llegadas y salidas en una simulación. Los números en el interior de la flecha indican el tiempo en el que ocurren los eventos. No se han ilustrado los nodos sobre los que ocurren los eventos de salida/llegada.. Fig. 7: Ejemplo ilustrativo de llegadas (ei ) y salidas (si ) a lo largo de la simulación. Los eventos ocurren sobre un nodo siendo un ejemplo básico de una simulación el siguiente: 1. No hay ningún evento. El reloj de simulación está a cero. 2. Se genera el tiempo de llegada de un cliente desde el exterior (a un nodo que permita llegadas desde el exterior) siguiendo el modelo de llegadas establecido.

(34) 6.2 Simulación de redes de colas. 25. por el nodo. Por ejemplo, en el caso de un proceso de Poisson se generará mediante una distribución exponencial de tasa λ. A esto se le llama evento. 3. Se avanza el reloj al tiempo en el que ocurre el nuevo evento dado que es el único. Se procesa el evento. 4. Se genera un evento de salida del nodo, el tiempo en el que se producirá el evento dependerá del modelo de servicio del nodo, es decir, la tasa de servicio μ. 5. Se avanza el reloj al tiempo en el que ocurre siguiente evento. Se procesa el evento. 6. Como se trata de un evento de salida se determina mediante la matriz de transiciones entre nodos a qué nodo irá. Se genera un evento de entrada al nodo destino. Cabe destacar que este tiempo de transición muchas veces se considera inexistente por lo que directamente se generará el evento de salida del nodo al que se transita, es decir, el tiempo del evento de salida que se genera es el tiempo en el que el cliente saldrı́a del nodo destino una vez haya recibido el servicio. 7. Se genera un evento de llegada de un cliente desde el exterior a un nodo que permita este tipo de llegadas. 8. Se avanza el reloj al tiempo en el que ocurre el evento más cercano en la linea temporal de simulación (podrá ser el evento de llegada o de salida, dependiendo del tiempo de ocurrencia generado para cada uno). Como se ve, se van generando eventos de llegada y salida, estos eventos tienen asignado un tiempo en el que ocurren. El reloj de simulación va avanzando de evento a evento más cercano en la lı́nea temporal. A lo largo de la simulación se puede saber el número total de clientes que hay en el sistema y en cada nodo, tiempo de permanencia en el nodo, en la cola, etc. pudiendo calcular las medidas de rendimiento deseadas. Se suelen utilizar dos lı́mites del tiempo de duración de la simulación, cuando se alcanza un tiempo de simulación deseado en el reloj de simulación (por ejemplo un año de simulación) o cuando se ha servido a un número total de clientes por el sistema. En el Capı́tulo 9.1 se explica en detalle la implementación del proceso de simulación en el programa desarrollado para simular eventos raros..

(35) 26. 6 Redes de colas.

(36) 27. 7.. Simulación de eventos raros. Durante el proceso de simulación sabemos en todo momento el estado del sistema, definimos como estado del sistema al número de clientes que hay en cada nodo, tanto en la cola como recibiendo servicio. Por lo tanto, podemos saber cuando se producen ciertas situaciones (en adelante eventos) que nos interesa estudiar. Por ejemplo, un evento de interés podrı́a ser que un servidor de acceso a un sistema tenga un cierto número de clientes. Esto es algo que con la simulación podemos detectar y calcular su probabilidad. Como se puede deducir fácilmente, la probabilidad de que ocurra un evento dependerá de la caracterı́sticas del sistema, no tendrá la misma probabilidad de ocurrir el evento de que haya una carga de diez mil usuarios en un servidor de una pequeña empresa que en un servidor de Google. Un evento raro es aquel que es muy difı́cil que se produzca en un sistema y por lo tanto es muy difı́cil que se produzca durante la simulación en un periodo aceptable de tiempo, dando P (evento raro) = 0. Por ejemplo, obtener probabilidades mediante una simulación ordinaria para eventos cuyas probabilidades son del orden de 10−6 , 10−10 , 10−14 podrı́a llevar, si el sistema es complejo, un tiempo de computación de 11 horas, 13 años y 127 milenios, respectivamente [13]. Para el cálculo de este tipo de eventos raros (interesantes en sistemas como redes de comunicación o sistemas ultra fiables) se han utilizado a lo largo del tiempo distintos tipos de métodos. Uno de esos métodos se denomina importance sampling [4]. La idea principal de importance sampling es la alteración de las medidas de probabilidad que rigen los eventos para que el evento raro ocurra más a menudo. Por lo tanto, la principal dificultad de este método es elegir el cambio de medida, cambio que depende del sistema que se está simulando. Este cambio suele buscarse mediante heurı́sticas, siendo la más usada el método de Montecarlo para calcular la integral (área bajo la curva) del cociente entre la función de densidad que rige el sistema f (x) y otra función de densidad más simple g(x). Se busca una función (x) ≈ 1 de tal forma que se pueda usar g(x) en vez de f (x) para sacar g(x) tal que fg(x) muestras más fácilmente del evento raro. Un ejemplo serı́a, nos interesa la probabilidad de que se sature el sistema cuando hay un número de clientes X muy grande. Mediante importance sampling buscarı́amos aumentar la tasa de llegadas de usuarios al sistema (sin modificar la tasa de salidas) de tal forma que se favorezca la situación de saturación buscada. Para ello, buscarı́amos una nueva distribución de probabilidad g(x) que nos permita esto, (x) ≈ 1. Una vez obtenidos los resultados se “desharı́a” el cambio tratando que fg(x) para obtener la probabilidad que se habrı́a obtenido con f (x). Existe otro método para calcular la probabilidad de eventos raros denominado splitting[5] que trata de dividir el estado del sistema en “partes”, denominadas regiones de importancia, e intentar llegar a la región en la que se encuentra el evento raro mediante repeticiones de la simulación desde regiones más probables de tal forma que sea más probable que se produzca el evento raro. Nosotros nos centraremos en.

(37) 28. 7 Simulación de eventos raros. un método parecido al método de splitting denominado RESTART sobre el que se basa el trabajo realizado..

(38) 29. 8.. RESTART. RESTART (REpetitive Simulation Trials After Reaching Thresholds)[7][8][11][12] [13][14] es un método de simulación acelerada para el cálculo de probabilidades de eventos raros. En este trabajo nos centraremos en su utilización para el cálculo de las probabilidades de eventos raros en redes de colas. Cuando se quiere estudiar la probabilidad de que se produzca un evento raro en una red los métodos tradicionales de simulación no son factibles, la baja probabilidad de éstos eventos hace que se necesiten tiempos de simulación enormes para conseguir que se produzcan y poder calcular su probabilidad. RESTART soluciona este problema utilizando una versión mejorada de una técnica conocida como splitting.. 8.1.. Descripción. Dada una red de colas, denotamos como Ω el espacio de estados de la red, entendemos como estado de la red el número de clientes que hay en cada nodo. RESTART divide el espacio de estados Ω en un conjunto de regiones (C1 ⊃ C2 ⊃ ... ⊃ CM ), donde cada región Ci contiene a uno o más estados. Cuanto mayor sea el valor de i mayor es el valor de importancia de la región Ci − Ci+1 . Estas regiones se definen mediante la función Φ : Ω =⇒ , llamada función de importancia. Para cada Ci se define un umbral Ti (1 ≤ i ≤ M ) tal que cada región Ci tiene asociado un umbral y un estado pertenecerá a la región i si Φ ≥ Ti . La función de importancia es la combinación lineal del número clientes de cada nodo por un peso especı́fico asignado a cada nodo:  w i Qi , Φ= ∀n. donde wi ∈ [0, 1] es el peso asignado al nodo i y Qi el número de clientes en el nodo i. Denotaremos Pr (A) como la probabilidad de que ocurra el evento raro A. Esta probabilidad en una simulación normal se puede calcular dividiendo el tiempo que la simulación se encuentra en un estado perteneciente a la región del evento raro CM entre el tiempo total de simulación: Pr (A) =. Tiempo en CM . Tiempo total de simulación. Del mismo modo, se define como Pr (Ci ) la probabilidad de que el estado del sistema se encuentre en la región Ci . Definimos los eventos Bi y Di del sistema como: Bi : evento que se produce cuando Φ ≥ Ti y previamente Φ < Ti . Di : evento que se produce cuando Φ < Ti y previamente Φ ≥ Ti . RESTART funciona de la siguiente manera:.

(39) 30. 8 RESTART. Un recorrido de la simulación, denominado camino principal, es ejecutado como si de una simulación ordinaria se tratase. Dura hasta que la condición de “parada de la simulación” se cumple. Durante la simulación, el estado actual de la red es asignado a un valor de importancia mediante Φ. Cada vez que se produce un evento Bi , es decir, se sube de umbral, el estado del sistema se guarda, se interrumpe el camino actual de la simulación y se ejecutan Ri repeticiones. Cada repetición es un camino de simulación nuevo que empieza desde el estado guardado cuando ocurrió Bi y termina cuando se produce un evento Di , ejecutando una nueva repetición hasta que las Ri simulaciones hayan sido ejecutadas. Estos nuevos caminos se comportan igual que el camino principal, pudiendo producir eventos Bj donde j > i. Una vez se han ejecutado las Ri repeticiones, el camino que provocó el evento Bi continúa desde su estado guardado. Cuando no hay más repeticiones por ejecutar se continúa con el camino principal. Puede darse el caso que se produzcan dos eventos Bi seguidos, en tal caso se guardarı́a el estado para cada evento y se procederı́a de la manera habitual desde el último producido. [11] La condición de “parada de la simulación” se puede definir de la misma manera que una simulación normal, por ejemplo, superar un número de clientes servidos o un tiempo de simulación. Si esta condición de parada se produce en el camino de simulación de una repetición ésta se detendrá, ası́ como todos los caminos de repeticiones restantes y, por último, el camino principal. La Figura 8 muestra este proceso para una simulación con cuatro regiones, el umbral TL marca el inicio de la región del evento raro. El número de repeticiones es R1 = R2 = 4, R3 = 3. La lı́nea continua en negrita representa el camino principal, la lı́nea continua, con guiones y con puntos representan las simulaciones de las repeticiones en la región 1, 2 y 3, respectivamente.. Fig. 8: Ejemplo de una simulación RESTART..

(40) 8.2 Tipos de eventos raros. 8.2.. 31. Tipos de eventos raros. Se han implementado y estudiado 3 tipos de eventos raros: Único: Se elige un nodo y un número de clientes. El evento raro se produce cuando un cliente entra o sale del nodo y el número de clientes en el nodo es igual o superior al valor introducido. Suma: Se eligen varios nodos y un número de clientes. El evento raro se produce cuando un cliente entra o sale de alguno de los nodos y la suma del número de clientes de todos los nodos seleccionados iguala o supera el valor introducido. Máximo: Se eligen varios nodos y un número de clientes. El evento raro se produce cuando un cliente entra o sale del nodo y el número de clientes de alguno de los nodos seleccionado es igual o superior al valor establecido.. 8.3.. Cálculo de la probabilidad del evento raro. Como se realiza un número de Ri repeticiones en cada región, la probabilidad de un evento tiene que ser calculada teniendo en cuenta este sobremuestreo. Se define el número acumulado de repeticiones en cada región i como ri =. i . Rj. (1 ≤ i ≤ M ).. j=1. Por lo tanto, la probabilidad de que ocurra un evento en la región i tiene que ser multiplicada por el peso 1/ri para obtener su probabilidad insesgada. La probabilidad el evento raro Pr (A) es calculada por RESTART como Pr (A) =. 8.4.. Tiempo en CM . Tiempo total de simulación ∗ rM. Eficiencia. Una demostración detallada de la eficiencia de RESTART puede verse en [13]. A modo de resumen comentar que hay cuatro factores que afectan a la eficiencia de RESTART: fr : Ineficiencia originada por la elección subóptima del número de repeticiones en cada umbral. fv : Ineficiencia originada por la varianza de la importancia asignada a los estados de la red producida por una mala elección de la función de importancia. ft : Ineficiencia por la elección subóptima del número de umbrales y su valor de importancia asignado..

(41) 32. 8 RESTART. fo : Ineficiencia producida por el trabajo computacional originado por la implementación de RESTART. Este trabajo computacional viene sobrecargado principalmente por: (1) el coste de evaluar la función de importancia y compararla con los valores de los umbrales, y (2) el coste de guardar el estado de la red y cargarlo por cada repetición, ası́ como la reprogramación de los futuros eventos que ya estaban programados. En este trabajo estas ineficiencias se han mitigado de la siguiente manera: fr y ft : Se ha implementado una prueba piloto que calcula automáticamente los valores cuasi óptimos del número de repeticiones y el número de umbrales. fv : Se ha implementado una fórmula matemática para el cálculo de los valores cuasi óptimos de la función de importancia. fo : Se ha realizado la implementación de RESTART utilizando el lenguaje informático C++, caracterizado por su rapidez.. 8.5.. Prueba piloto. Para calcular el número cuasi óptimo de umbrales y repeticiones en cada umbral se utiliza lo que se denomina prueba piloto. La prueba piloto es un proceso que ejecuta una simulación RESTART normal pero a la que se le han asignado unos valores por defecto. Cuando la simulación termina, se extrae cierta información obtenida gracias a la ejecución que permite calcular el número de repeticiones y umbrales cuasi óptimos. El evento raro A del que se quiere obtener su probabilidad tiene establecido un valor L como el número de clientes necesarios para que el evento raro se produzca. La prueba piloto crea L + 2 umbrales 1 y les asigna un número de repeticiones tal que:  , cuando el evento raro es de tipo único ( ρ1 )i+1 ∗ i R1 1 i−1 Ri = 2, en caso contrario Con estos valores por defecto ejecuta la simulación RESTART. Una vez terminada la simulación, se calcula el número óptimo de umbrales y el número de repeticiones de cada uno del modo: 1. Se calcula la probabilidad de cada región dividiendo el tiempo que ha estado la simulación en la región por el tiempo total de simulación multiplicando por los pesos 1/ri . 1. Nótese que al crear L+2 umbrales estamos definiendo dos regiones tal que (... ⊃ CL ⊃ CL+1 ⊃ CL+2 ). Esto no es ningún problema dado que el evento raro también se producirá en estas regiones, al ser subconjuntos de CL y la probabilidad del evento puede ser calculada de la misma forma pero teniendo en cuenta los valores ri para i = L + 1 e i = L + 2..

(42) 8.6 Cálculo automático de la función de importancia. 33. 2. Con estas probabilidades, se calcula el número acumulado de repeticiones óptimo ri como  1 , ri = Pi/0 Pi+1/1 donde Pi/j =. Probabilidad de la región i . Probabilidad de la región j. 3. Se calcula el número de repeticiones para los L + 2 umbrales mediante  ri Ri =  i . 1 Ri 4. Se borran los umbrales con un número de repeticiones Ri = 1 empezando por el último umbral hasta que un umbral no cumpla la anterior condición. En caso de que el último umbral no cumpla Ri = 1 se evalúa si Rúltimo > 5, en tal caso . El valor 5 es un valor empı́rico. Aún se añaden H umbrales, donde H = Rúltimo 5 se están haciendo pruebas para determinar de forma matemática este número. 5. Si alguna de las condiciones del paso anterior se cumple entonces se repite la simulación y este proceso nuevamente hasta que no se añadan o eliminen umbrales. Una vez terminada la prueba piloto, el número de umbrales y repeticiones establecido será un valor cuasi óptimo.. 8.6.. Cálculo automático de la función de importancia. Anteriormente hemos definido la función de importancia como  Φ= w i Qi , ∀n. donde wi es el peso asignado al nodo i y Qi es el número de clientes en el nodo i. Los valores de estos pesos tienen un gran impacto en el funcionamiento de RESTART, unos buenos valores aumentan en gran medida el comportamiento de RESTART. En [8] se deriva y demuestra una fórmula general para el cálculo de los valores cuasi óptimos de estos pesos. La fórmula general para calcular la función de importancia es la siguiente, donde: H es el número de nodos a distancia 2 del nodo raro. K el número de nodos a distancia 1. γdi es la tasa de llegadas desde el exterior al nodo i con distancia al nodo raro d..

(43) 34. 8 RESTART. μdi es la tasa de servicio del nodo i con distancia al nodo raro d. λdi es la tasa media de llegadas al nodo i con distancia al nodo raro d. si es el número de servidores del nodo i. pij es la probabilidad de transición desde el nodo i al nodo j. El subı́ndice tg hace referencia al nodo raro.  H K   ln(ρtg /ρ∗tgi ) ln(ρtg /ρ⊥ tgj ) Q1i + Φ= mı́n 1, α1i mı́n 1, α1i lnρtg lnρtg i=1 j=1 donde ρtg = ρ∗tgi. = ρtg. K. Q1j + Qtg ,. λtg , stg μtg. mı́n {λ2j + (s1i μ1i − λ1i )pij , s2j μ2j } pjtg + λtg ptgtg , λtg  (s2j μ2j − λ2j )pjtg ⊥ , Ptgj = ρtg 1 + λtg K  K j=1 plj pjtg + j=1 γ2j pjtg + γtg l=i γ1l α1i = 1 + , K μ1i j=1 pij pjtg   H i=1 γ1i l=j pil pltg + l=j γ2l pltg + γtg . α2j = 1 + s2j μ2j pjtg γtg +. j=1. Para el cálculo de la función de importancia, cuando el evento raro afecta a más de un nodo, como el evento raro de tipo suma o máximo, se calcula la función de importancia para cada nodo del evento raro. Una vez se tienen los distintos pesos para cada nodo Qi se realiza el máximo de estos pesos para obtener la función de importancia final. Por ejemplo, tenemos una red de 7 nodos y se quiere calcular un evento raro de tipo suma para los nodos 6 y 7. Se calcula la función de importancia para el nodo 6 y el nodo 7 dando como resultado Φ6 = 0.25Q1 + 0.25Q3 + 0.75Q7 + Q6 y Φ7 = 0.33Q4 + 0.5Q1 + Q7 , respectivamente. Entonces, se harı́a el máximo para cada coeficiente Qi dando como resultado la función de importancia Φ = 0.33Q4 + 0.25Q3 + 0.5Q1 + Q6 + Q7 .. 8.7.. Variantes. La versión estándar del método RESTART ejecuta cada repetición de la simulación Ri hasta que esta repetición desciende del umbral i donde empezó la repetición. Esta condición puede ser modificada, dando lugar a versiones de RESTART que, si bien obtienen el mismo resultado, varı́an en el comportamiento y tiempo de ejecución..

(44) 8.7 Variantes. 35. Volviendo a considerar los eventos Bi y Di como: Bi : evento que se produce cuando Φ ≥ Ti y previamente Φ < Ti . Di : evento que se produce cuando Φ < Ti y previamente Φ ≥ Ti . Tenemos las siguientes variantes, también llamadas versiones, de RESTART: P0 : Versión estándar. Las repeticiones Ri que se inician cuando ocurre Bi terminan cuando ocurre Di . P1 : En esta versión se permite bajar un umbral más antes de finalizar la repetición, es decir, las repeticiones Ri que se inician cuando ocurre Bi terminan cuando ocurre Di−1 . P2 : Se permite bajar dos umbrales antes de finalizar la repetición. Las repeticiones Ri que se inician cuando ocurre Bi terminan cuando ocurre Di−2 . P3 : Se permite bajar tres umbrales antes de finalizar la repetición. Las repeticiones Ri que se inician cuando ocurre Bi terminan cuando ocurre Di−3 . Si en las variantes P1 – P3 en una repetición ha ocurrido el suceso Di y vuelve a subir el umbral i u otro inferior, no se realizan nuevas repeticiones. Éstas solo se realizarán si supera el umbral i + 1. Las variantes del método RESTART están pensadas para ser usadas por un usuario experto. Es algo que aún se está estudiando por lo que no existen comparaciones ni estudios exhaustivos. En el Capı́tulo 10 se compararán resultados obtenidos con las distintas variantes para poder sacar conclusiones..

(45) 36. 8 RESTART.

(46) 37. 9.. Aplicación. En este capı́tulo se explica la aplicación desarrollada. El capı́tulo se divide en dos parte, en la Subsección 9.1 se detalla la parte interna de la aplicación, es decir, la parte no visual, como puede ser la implementación de la red de Jackson abierta o la implementación de RESTART. En la Subsección 9.2 se explica la parte gráfica de la aplicación, explicando sus distintos menús, modos de uso, etc. Esta aplicación es la continuación de otra pero, a no ser que se especifique lo contrario, todo lo que se explique en las subsecciones serán ampliaciones hechas a la versión antigua.. 9.1.. Parte interna. 9.1.1.. Refactorización y consistencia del programa. El programa sobre el que se partı́a tenı́a dos principales problemas: 1. El código del programa estaba muy mal diseñado. 2. Una ejecución normal del programa era casi imposible. El programa sufrı́a de errores irrecuperables continuamente y muchas de las opciones que presentaba no funcionaban, cerraban el programa o habı́a que acceder a ellas de un modo poco intuitivo. Se decidió que lo primero en hacer era arreglar el código. Este es un programa que se quiere seguir expandiendo al largo plazo con nuevas funcionalidades por lo que se requiere de una estructura organizada y de un código limpio para su futuro desarrollo que, muy probablemente, sea realizado por distintos programadores. Sin embargo, el código del que se partı́a tenı́a un diseño poco planificado, lo que lo hacı́a difı́cil de extender, entender y depurar. Se supone que seguı́a un patrón de diseño Modelo-Vista-Controlador pero en realidad todo estaba mezclado y la mayorı́a de la lógica (a excepción de RESTART) estaba implementada en una única clase controlador. Se podrı́a decir que el 35 % de la vista estaba escrito en este controlador y el 75 % de la lógica del programa. No solo eso, el código está escrito en C++ y contaba con un total de 32 clases, de las cuales ninguna tenı́a un solo atributo o método privado, lo que lo hacı́a, entre otras cosas, bastante difı́cil de depurar. Se realizó una refactorización bastante grande, por ejemplo, se separó el método RESTART de la implementación de la red de Jackson. En el nuevo código se ha buscado una implementación Modelo-Vista en la mayor parte de lo posible, realizando la lógica en cada clase correspondiente, con sus métodos y atributos privados. Ahora, la vista solo obtiene información de los modelos que necesita, sin necesidad de recurrir a un controlador principal o depender de otras clases intermediarias al modelo que se desea acceder. Esto, además de mejorar la estructura y organización del código, aceleró bastante los tiempos de compilación del programa..

(47) 38. 9 Aplicación. Como ejemplo, el código inicial tenı́a alrededor de 12500 lı́neas de código. Al finalizar este trabajo, se habı́an añadido alrededor de 13,300 lı́neas y se habı́an borrado 12000 lı́neas. El nuevo código tiene una estructura clara y desacoplada, ya no depende de una clase descomunal. Esto ha permitido una mayor rapidez a la hora de añadir nuevas funcionalidades y un aumento muy considerable de la facilidad de depuración del código. El segundo problema se fue arreglando a la vez que el código se iba refactorizando. La nueva estructura del código permitió detectar más fácilmente los errores que causaban el cierre del programa y corregirlos, en muchos casos añadiendo funcionalidad no existente. Al acabar la refactorización, el código se habı́a corregido prácticamente al completo y se podı́a ejecutar el programa de una forma consistente y sin fallos crı́ticos. Esto permite que un usuario nuevo de la aplicación pueda experimentar con ella con total libertad. También se localizaron y eliminaron bastantes fugas de memoria. Se ha añadido un detector de dependencias y un instalador del Visual Studio Redistributable para evitar problemas con las librerı́as dinámicas (.dll) al ejecutar el programa en las máquinas de los usuarios. 9.1.2.. Red de Jackson. En la anterior versión del programa, el código para el manejo de una red de Jackson abierta estaba en la misma clase que la implementación de RESTART, ambos ligados entre sı́. Esto se decidió cambiar y desacoplar ambas funcionalidades. No solo eso, mucha de la lógica de la red se hacı́a dentro del controlador principal, por ejemplo, comprobar la estabilidad de la red. Toda la lógica y estructuras de datos de la red de Jackson ahora se encuentran únicamente en su propia clase, lo mismo se ha hecho con la implementación de RESTART. La red está representada por una lista de nodos donde cada nodo tiene las propiedades de un modelo de colas M/M/c (tasa de servicio, tasa de llegadas desde el exterior, número de servidores...), un identificador único y una lista de probabilidades de transición a los otros nodos de la red y fuera de la red. Se decidió no usar una matriz única donde representar todas las transiciones de los nodos de la red porque no iba a aportar ninguna ventaja frente a la implementación elegida, siendo esta última más cómoda. Los distintos tipos de modificaciones a los nodos se hacen a través de funciones de la clase, donde todas requieren del identificador único del nodo para identificar qué nodo se desea modificar. Estas modificaciones activan un evento de cambio de red. El evento es detectado automáticamente cada vez que se produce y se realizan dos acciones. La primera, calcular la tasa media de llegadas a cada nodo mediante la fórmula (3) y, seguidamente, comprobar la estabilidad de la red como se indica en (4). Este sistema de eventos tiene la ventaja de ser completamente interno a la clase y automático, eligiendo qué acciones concretas lo producen..

(48) 9.1 Parte interna. 39. Esta nueva implementación de la red de Jackson abierta tiene dos principales ventajas. En caso de que en un futuro quiera implementarse nuevos tipos de redes (redes no markovianas, redes cerradas...) bastarı́a con crear una clase base de la que deriven los distintos tipos de red y añadir a esta clase base las funciones de obtención de información y modificación de los nodos. Esto permitirı́a que las clases dependientes de una red (como la vista y RESTART) pudieran seguir funcionando independientemente del tipo de red o ajustar su comportamiento acorde al tipo de red. La segunda, la red está completamente desacoplada del resto de clases. Las clases que necesiten acceso a las funcionalidades de la red (como RESTART o la vista de renderizado de la red) lo pueden hacer directamente a través de su puntero como se muestra en la Figura 9. En (a) se muestra el proceso antiguo, donde se tenı́a que pedir al controlador principal la información que se querı́a, este la pedı́a a la clase donde estaba contenida la red y RESTART y la devolvı́a. (b) muestra el nuevo proceso donde las clases adquieren la información directamente de la clase de la red.. Fig. 9: Ejemplo de una petición de información a la red..

Referencias

Documento similar

Habiendo organizado un movimiento revolucionario en Valencia a principios de 1929 y persistido en las reuniones conspirativo-constitucionalistas desde entonces —cierto que a aquellas

The part I assessment is coordinated involving all MSCs and led by the RMS who prepares a draft assessment report, sends the request for information (RFI) with considerations,

d) que haya «identidad de órgano» (con identidad de Sala y Sección); e) que haya alteridad, es decir, que las sentencias aportadas sean de persona distinta a la recurrente, e) que

De hecho, este sometimiento periódico al voto, esta decisión periódica de los electores sobre la gestión ha sido uno de los componentes teóricos más interesantes de la

Ciaurriz quien, durante su primer arlo de estancia en Loyola 40 , catalogó sus fondos siguiendo la división previa a la que nos hemos referido; y si esta labor fue de

Las manifestaciones musicales y su organización institucional a lo largo de los siglos XVI al XVIII son aspectos poco conocidos de la cultura alicantina. Analizar el alcance y

Proporcione esta nota de seguridad y las copias de la versión para pacientes junto con el documento Preguntas frecuentes sobre contraindicaciones y

[r]