Full text
Equation Chapter 1 Section 1 Trabajo Fin de Grado En Ingeniería de las Tecnologías Industriales, Intensificación de Organización y Producción Determinación del horario óptimo de una línea de metro con salto de paradas y demanda variable. Autor: Félix García Heredia Tutor: José David Canca Ortiz Dpto. Organización y Gestión de Empresas I Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2021
iii Trabajo Fin de Grado En Ingeniería de Tecnologías Industriales Intensificación Organización y Producción Determinación del horario óptimo de una línea de metro con salto de paradas y demanda variable. Autor: Félix García Heredia Tutor: José David Canca Ortiz Profesor titular Dpto. Organización y Gestión de Empresas I Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2021
v Trabajo de Fin de Grado: Determinación del horario óptimo de una línea de metro con salto de paradas y demanda variable. Autor: Félix García Heredia Tutor: José David Canca Ortiz El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2021
El Secretario del Tribunal
vii A mi familia
Resumen En la sociedad actual, resulta imprescindible la utilización de los medios de transporte. En los grandes núcleos urbanos, una gran cantidad de pasajeros se desplazan diariamente desde sus domicilios u otros orígenes, a unos ciertos destinos, para poder llevar a cabo sus actividades cotidianas. Sin embargo, el diseño y operación de los medios de transporte exige la realización de una serie de estudios para poder llevar a cabo desde su construcción y planificación, al diseño de horarios de desplazamientos, implicando una gran cantidad de variables y datos. Concretamente, en este estudio se trata el diseño del horario de una línea de red de metro en la que se debe satisfacer una demanda de pasajeros variable con el tiempo, en las distintas plataformas de la línea. Para la determinación del diseño óptimo, se formula una estrategia skip-stopping, que permite que los servicios no se detengan en algunas plataformas de la línea. Dada la complejidad ofrecida por este problema de optimización, en el ámbito que les compete, los ingenieros, se apoyan en herramientas informáticas para su proyección y resolución matemática.
ix
Figura 73. Declaracion de la restricción (23.A.1) (I) 69 Figura 74. Declaración de las restricciones (23.A.1) (II). 70 Figura 75. Declaración de las restricciones (23.A.2) (I). 70 Figura 76. Declaración de las restricciones (23.A.2) (II) 70 Figura 77. Declaración de las restricciones (23.B.1) y (23.B.2) 71 Figura 78. Declaración de las restricciones (23.B.3) y (23.B.4). 71 Figura 79. Declaración de las restricciones (24.1.1) y (24.1.2) 72 Figura 80. Definiciones y pesos para integrar la función objetivo. 72 Figura 81. Declaración de la función objetivo (25.6) mediante la integración de las ecuaciones (25.1) - (25.5). 73 Figura 82. Datos escenarios iniciales I. 74 Figura 83. Datos escenarios iniciales II. 75 Figura 84. Ejemplo matriz O-D ajustada fraccionada cada 1 minuto. 75 Figuras 85.1 y 84.2. Ejemplo matriz O-D ajustada fraccionada cada 2 minutos y cada 4 minutos. 75 Figura 86. Ejemplo de ampliación de la matriz O-D fraccionada cada 1 minuto. 76 Figura 87. Ejemplo de ampliación de la matriz O-D fraccionada cada 2 minutos. 76 Figura 88. Ejemplo de ampliación de la matriz O-D fraccionada cada 4 minutos. 77 Figura 89. Demanda de pasajeros O-D upstream ajustada y fraccionada cada 4 min. 77 Figura 90. Demanda de pasajeros O-D downstream ajustada y fraccionada cada 4 min. 78 Figura 91. Demanda media de pasajeros O-D ajustada y fraccionada cada 4 min. 78 Figura 92. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (1) 79 Figura 93. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (1) 79 Figura 94. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (1) 80 Figura 95. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (1) 80 Figura 96. Dwell times (minutos) de los servicios upstream. (1) 81 Figura 97. Dwell time (minutos) de los servicios downstream. (1) 82 Figura 98. Abastecimiento espacio – temporal de la línea por los servicios. (1) 82 Figura 99. Headways (minutos) entre servicios consecutivos. (1) 82 Figura 100. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (2) 83 Figura 101. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (2) 84 Figura 102. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (2) 84 Figura 103. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (2) 85 Figura 104. Dwell times (minutos) de los servicios upstream y downstream. (2) 85 Figura 105. Abastecimiento espacio – temporal de la línea por los servicios. (2) 86 Figura 106. Headways (minutos) entre servicios consecutivos. (2) 86 Figura 107. Demanda de pasajeros entre plataformas O-D upstream, ampliada y fraccionada cada 4 min. 87 Figura 108. Demanda de pasajeros entre plataformas O-D downstream, ampliada y fraccionada cada 4 min.
xvii 87 Figura 109. Demanda media de pasajeros entre plataformas O-D, ampliada y fraccionada cada 4 min. 88 Figura 110. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (3) 89 Figura 111. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (3) 89 Figura 112. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (3) 90 Figura 113. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (3) 90 Figura 114. Dwell times medios (minutos) de los servicios upstream. (3) 91 Figura 115. Dwell times medios (minutos) de los servicios downstream. (3) 91 Figura 116. Abastecimiento espacio – temporal de la línea por los servicios. (3) 92 Figura 117. Headways (minutos) entre servicios consecutivos. (3) 92 Figura 118. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (4) 93 Figura 119. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (4) 93 Figura 120. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (4) 94 Figura 121. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (4) 94 Figura 122. Dwell times (minutos) de los servicios upstream. (4) 95 Figura 123. Dwell times (minutos) de los servicios downstream. (4) 96 Figura 124. Abastecimiento espacio – temporal de la línea por los servicios. (4) 96 Figura 125. Headways (minutos) entre servicios consecutivos. (4) 96 Figura 126. Demanda de pasajeros entre plataformas O-D upstream, ampliada y fraccionada cada 2 min. 99 Figura 127. Demanda de pasajeros entre plataformas O-D downstream, ampliada y fraccionada cada 2 min. 100 Figura 128. Demanda media de pasajeros entre plataformas O-D, ampliada y fraccionada cada 2 min. 100 Figura 129. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (5) 101 Figura 130. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (5) 101 Figura 131. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (5) 102 Figura 132. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (5) 102 Figura 133. Dwell times (minutos) de los servicios upstream. (5) 103 Figura 134. Dwell times (minutos) de los servicios downstream. (5) 104 Figura 135. Abastecimiento espacio – temporal de la línea por los servicios. (5) 104 Figura 136. Headways (minutos) entre servicios consecutivos. (5) 105 Figura 137. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (6) 105 Figura 138. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (6) 106 Figura 139. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (6) 106 Figura 140. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (6)
107 Figura 141. Dwell times (minutos) de los servicios upstream. (6) 108 Figura 142. Dwell times (minutos) de los servicios downstream. (6) 108 Figura 143. Abastecimiento espacio – temporal de la línea por los servicios. (6) 109 Figura 144. Headways (minutos) entre servicios consecutivos. (6) 109 Figura 145. Demanda dispar de pasajeros entre plataformas O-D upstream. 111 Figura 146. Demanda dispar de pasajeros entre plataformas O-D downstream. 112 Figura 147. Demanda media dispar de pasajeros entre plataformas O-D. 112 Figura 148. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (7) 113 Figura 149. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (7) 113 Figura 150. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (7) 114 Figura 151. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (7) 114 Figura 152. Dwell time medio (minutos) de los servicios upstream. (7) 115 Figura 153. Dwell time medio (minutos) de los servicios downstream. (7) 116 Figura 154. Abastecimiento espacio – temporal de la línea por los servicios. (7) 116 Figura 155. Headways (minutos) entre servicios consecutivos (minutos). (7) 116 Figura 156. Demanda media de pasajeros entre plataformas O-D empleada en experimento 8. 117 Figura 157. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (8) 118 Figura 158. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (8) 118 Figura 159. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (8) 119 Figura 160. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (8) 119 Figura 161. Dwell time (minutos) de los servicios upstream. (8) 120 Figura 162. Dwell time (minutos) de los servicios downstream. (8) 121 Figura 163. Abastecimiento espacio – temporal de la línea por los servicios. (8) 122 Figura 164. Headways (minutos) entre servicios consecutivos. (8) 122
xix
1 OBJETIVOS Y ALCANCE. on la expansión de las redes de transporte público urbano, se hace cada vez más evidente la distribución desigual de los pasajeros en el espacio y el tiempo, provocando congestiones extremas de pasajeros en los andenes de los servicios, debido a la superación de las capacidades máximas de los transportes en ciertas estaciones muy concurridas. Es por ello, la necesidad urgente de desarrollar maneras eficientes de transportar a los pasajeros, como se hace en (Yuan et al. 2020), mediante la incorporación de estaciones en las que los trenes pueden dar la vuelta y abastecer el sentido contrario de la línea. El objetivo de este proyecto consiste en diseñar y modelar el horario de un sistema ferroviario para determinar su solución óptima. Más concretamente, se pretende minimizar el tiempo total de espera de los viajeros que utilizan una línea de metro. El objeto del problema es también el de minimizar los costes relativos al empleo de material rodante debido al gasto de consumo energético asociado y maximizar el número de viajeros atendidos, permitiendo movimientos más rápidos y eficaces, a pesar de los problemas derivados por la capacidad, la limitación de material rodante y la exigencia de la demanda en ciertos tramos horarios. Para la consecución de los objetivos y minimización de los recursos, se propone la implementación de la técnica skip-stopping, posibilitando a los trenes saltarse ciertas paradas que se crean convenientes y ofreciendo una regularidad en los servicios dependiente de la demanda de pasajeros que se pretenda abastecer. La demanda, dependiente a su vez, del tiempo, pretende dibujar y simular una curva de distribución de viajeros de cualquier sistema de transporte ferroviario de los grandes núcleos urbanos del planeta. Se pretende construir un modelo matemático capaz de abastecer y planificar una línea de red de metro con un horizonte temporal propuesto. El modelo se implementa en un código Python capaz de cargar y leer los datos propuestos, así como, declarar las variables y restricciones, y obtener el resultado óptimo del problema mediante las librerías del solver GUROBI. Para facilitar el análisis de las soluciones que se obtienen, Python permite escribir los resultados en hojas Excel. Con el fin de evaluar el desempeño del modelo construido, se realizan una serie de experimentos en los que se analizan las soluciones que ofrecen cada uno de los escenarios de datos propuestos para un horizonte temporal de una hora de servicio, así como las alternativas que surgen en distintas fases del modelo construido, descartando aquellas combinaciones que ofrezcan peores resultados, y ascendiendo en la escala de precisión con aquellas que ofrezcan resultados más favorables, de los que obtener conclusiones. C
Introducción a las líneas de metro y su planificación. 12 12 2 INTRODUCCIÓN A LAS LÍNEAS DE METRO Y SU PLANIFICACIÓN. 2.1. Definición de metro. El metro es un sistema ferroviario de trenes urbanos que recorre estaciones distanciadas regularmente y no muy lejanas unas de otras dentro de una misma área metropolitana. Se caracteriza por unir distintas partes de ciudades y sus alrededores, recogiendo una gran cantidad de pasajeros con una frecuencia alta. Destaca por su carácter subterráneo, aunque se suele complementar con tramos en la superficie. No cubre tanta capacidad ni distancias tan largas como el tren de cercanías o suburbano, pero supera al tranvía o tren ligero, en la velocidad con que presta su servicio. Tiene su origen en 1843, cuando Charles Pearson propuso diseñar túneles subterráneos con vías férreas, como plan de mejora para la ciudad de Londres. Tras su aprobación por parte del parlamento inglés en 1853 y el comienzo de sus obras en 1860, se inauguró la primera línea de metro de Londres en 1863, comprendiendo una longitud de 6 km. En ese mismo año, de igual manera, en la ciudad de Nueva York, se abrió la primera línea de metro urbano. Budapest y Glasgow fueron las siguientes ciudades europeas en disponer de metro en 1896, extendiéndose por otras ciudades de Europa y Estados Unidos. En el siglo XX, se comenzaron a abrir las primeras líneas de metro por Sudamérica, Oceanía, África y Asia, destacando el crecimiento que tuvo en este último continente, que cuenta actualmente con más de 160 ciudades abastecidas por este sistema de transporte (Wikipedia 2021a). 2.1.1 Elementos de un sistema ferroviario. Antes de comenzar el planteamiento de la resolución del problema, se introducen una serie de elementos básicos en un sistema ferroviario, que facilitarán la construcción del modelo, como son: las infraestructuras, las líneas, el material rodante, la demanda y la planificación. 2.1.1.1 Infraestructura. Tal y como dicta (Ley 38/201 2015) se entenderá por infraestructura ferroviaria, la totalidad de los elementos que forman parte de las vías principales, de las de servicio y los ramales de desviación para particulares, con excepción de las vías situadas dentro de los talleres de reparación de material rodante y de los depósitos o garajes de máquinas de tracción. Entre dichos elementos se encuentran los terrenos, las estaciones de transporte de viajeros, las terminales de transporte de mercancías, las obras civiles, los pasos a nivel, los caminos de
13 servicio, las instalaciones vinculadas a la seguridad, a las telecomunicaciones, a la electrificación, a la señalización de las líneas, al alumbrado, almacenamiento de combustible necesario para la tracción y a la transformación y el transporte de la energía eléctrica, sus edificios anexos, los centros de control de tráfico y cualesquiera otros que reglamentariamente se determinen. Sin embargo, dado que en este trabajo no se contempla la fase de construcción del sistema de metro, se decide agrupar y definir los siguientes elementos físicos del sistema ferroviario que sí tienen repercusión en la fase diseño del horario, comprendiendo, en este caso a los depósitos: - Las vías principales y ramales: parte de la infraestructura ferroviaria que uno une dos puntos determinados del territorio. Se emplean para cada uno de los sentidos que recorra la línea de tren urbano. Suelen diseñarse de acero convencional. - Depósitos de trenes: son los lugares donde se almacena el material rodante y donde se le aplican los distintos tipos de mantenimiento fuera de servicios. - Zonas de operaciones: lugares donde confluyen todos los intercambios y acceso de pasajeros, mercancías y material rodante. Se constituyen por los andenes de las estaciones. Se entiende por estación, una construcción habilitada a la llegada y a la salida de transportes y clientes, y a la comercialización de dicho medio con los clientes; y por andén o plataforma, cada uno de los accesos a las vías que dispone una estación, desde donde los viajeros embarcan en el tren y bajan de él, en el caso de pasajeros. 2.1.1.2 Línea de transporte ferroviario. Una línea es una conexión ferroviaria directa entre dos estaciones finales que se explota con una frecuencia determinada y con un determinado tipo de tren o material rodante (Huisman et al. 2005). 2.1.1.3 Material rodante. Se define el material rodante como todo aquel tipo de vehículo dotado de ruedas que es capaz de circular por una vía férrea (Wikipedia 2019). El material rodante suele clasificarse por su capacidad tractora y uso comercial, quedando dividido en: - Material motor: vehículo con capacidad tractora que no puede portar carga comercial. Dependiendo de la fuente de energía empleada se pueden encontrar: locomotoras de vapor, locomotoras térmicas, locomotoras eléctricas y coches motores. - Material remolcado: material rodante sin capacidad motora y que porta carga comercial. Dependiendo del tipo de transporte para el que estén destinados pueden ser: coches de pasajeros, vagones de mercancías, furgones de mercancía en trenes de viajeros y autotrenes para el transporte de automóviles.
Introducción a las líneas de metro y su planificación. 14 14 - Trenes de servicio: composiciones de material rodante empleados y diseñados para la realización de cualquier trabajo concreto en la vía, como asistencia por averías, tracción o mantenimientos. La mayor parte del material rodante que se emplea en los ferrocarriles urbanos se compone por unidades de trenes eléctricas, diseñadas con una longitud que suele comprender entre dos o más de diez coches para poder albergar una determinada capacidad de pasajeros que viajan a lo largo de una línea, satisfaciendo los desplazamientos entre estaciones de la misma (Wikipedia 2021a). 2.1.1.4 Demanda de pasajeros. La demanda horaria recoge unos registros de pasajeros que llegan a unas plataformas de una línea concreta, desde las que se quiere partir hacia otras, en un instante concreto del horario de servicio. La distribución de la demanda temporal de pasajeros comprende unas horas pico, donde se alcanza un mayor registro de pasajeros esperando. Denominando como hora pico u hora punta al periodo de tiempo, no necesariamente una hora, en el que se suelen producir congestiones (Wikipedia 2020). 2.1.1.5 Horario. Se define horario como registro de instantes en los que se producen los movimientos de llegadas y salidas en las distintas paradas de un sistema de transporte, con un carácter rígido o flexible con respecto a la demanda de pasajeros. 2.1.2 Planificación del sistema ferrroviario del metro. La planificación en los sistemas de transporte es una actividad que debe estar en constante desarrollo y renovación, adaptándose a la evolución de la sociedad, debido a la influencia que tiene en el desarrollo de las actividades cotidianas (Orro 2006). La planificación de un sistema ferroviario puede ser clasificado por la ubicación física en la que se opera: problemas de enfoque local, que tratan de estudiar los movimientos de los trenes de algún punto y momento concretos; o problemas con enfoque global para toda la red. También se puede clasificar la planificación en función del horizonte temporal en el que se opere, asegurando un correcto funcionamiento del sistema diseñado, tanto en el día a día como a largo plazo, prestando servicios seguros, eficaces y de calidad. En (Huisman et al. 2005) se distinguen tres fases de planificación, descritas a continuación: - Planificación estratégica: comprende un periodo de tiempo que puede variar desde 2 a 20-25 años como máximo, en el que se consideran decisiones que afectan a las infraestructuras, el diseño de nuevas líneas, la ampliación de las existentes, así como, la adquisición del material rodante, con el fin de anticiparse a cualquier futuro escenario que se desarrolle. Destaca las grandes cantidades de dinero que se mueven en las decisiones que se toman en esta fase, ya que una inversión acertada podría minimizar los costes en las otras fases de la planificación.
15 - Planificación táctica comprende un horizonte temporal de máximo un año. Se le asigna la programación de material rodante y de los horarios del transporte, siendo esta última, el producto principal de dicha programación, en la que se obtiene una estructura de horario determinado para cada línea. Para la determinación de dicho horario se suele elaborar un procedimiento para asegurar su fiabilidad compuesto por las siguientes pautas: o Medición de la fiabilidad de las operaciones en el mundo real, empleando medidas de fiabilidad de los datos, como son la puntualidad y los retrasos de los trenes. o Análisis de los datos: se suelen detectar cuellos de botella y estudiar las características de los retrasos y las perturbaciones. o Previsión de la fiabilidad de un horario determinado: se emplean métodos algebraicos, análisis estocásticos y simulaciones. o Optimización de un horario con respecto a la fiabilidad: se suelen mejorar los horarios a base de prueba y error, evaluándose el horario con respecto a los cuellos de botella. o Implementación de otras mejoras, como pueden ser los mantenimientos preventivos del material rodante, la construcción de nuevas infraestructuras y la implementación de las nuevas tecnologías. - La programación operativa comprende un horizonte temporal de corto plazo, de días, y se centra en la programación detallada de horarios, material rodante y la programación de la tripulación. Esta fase se enfrenta a alteraciones en el funcionamiento del sistema que exigirían recolocaciones de personal, problemas derivados por la falta de este o la aparición de condiciones meteorológicas adversas, entre otros. La mayoría de las investigaciones realizadas sobre el diseño de horarios de transportes públicos se centran en las fases táctica y operativa, trabajando con un escenario más restrictivo y un horizonte temporal más corto, en el que no se permiten o no se desean cambios en las infraestructuras. 3 DESCRIPCIÓN DEL PROBLEMA. n el problema actual, se pretende diseñar un horario de línea de metro, usando la estrategia de skip-stopping, permitiendo a los trenes operar con una mayor velocidad y ahorrar más tiempo de viaje a los usuarios que en un servicio tradicional (Mei Y. 2021). E
Modelado matemático. 22 22 Variables Definición detallada. 𝜏𝑘 Variable binaria 0-1; 𝜏𝑘=1, si el servicio potencial 𝑘−é𝑠𝑖𝑚𝑜 es seleccionado; si no, 𝜏𝑘=0. Para 𝑘 ∈ 𝐾𝑈 y 𝑘 ∈ 𝐾𝐷. λ𝑘,𝑖 Variable binaria 0-1; λ𝑘,𝑖=1, si el servicio 𝑘−é𝑠𝑖𝑚𝑜 sirve al andén 𝑖−é𝑠𝑖𝑚𝑜; si no, λ𝑘,𝑖=0. Para el conjunto upstream 𝑖∈ 𝑆𝑈,𝑘∈𝐾𝑈 y downstream 𝑖∈𝑆𝐷,𝑘∈𝐾𝐷. ℎ𝑘−1,𝑘 Variable continua. Headway entre el servicio el servicio 𝑘−é𝑠𝑖𝑚𝑜 y el anterior. Para 𝑘−1,𝑘∈𝐾𝑈 y 𝑘−1,𝑘∈𝐾𝐷. 𝑎𝑘,𝑖 Variable continua. Tiempo de llegada del servicio 𝑘−é𝑠𝑖𝑚𝑜 al andén 𝑖−é𝑠𝑖𝑚𝑜. Para el conjunto upstream 𝑖∈𝑆𝑈,𝑘∈𝐾𝑈 y downstream 𝑖∈𝑆𝐷,𝑘∈𝐾𝐷. 𝑑𝑘,𝑖 Variable continua. Tiempo de salida del servicio 𝑘−é𝑠𝑖𝑚𝑜 desde el andén 𝑖−é𝑠𝑖𝑚𝑜. Para el conjunto upstream 𝑖∈𝑆𝑈,𝑘∈𝐾𝑈 y downstream 𝑖∈𝑆𝐷,𝑘∈𝐾𝐷. 𝑒𝑘,𝑖 Variable continua. Tiempo de parada en el andén 𝑖−é𝑠𝑖𝑚𝑜. Para el conjunto upstream 𝑖∈𝑆𝑈,𝑘∈𝐾𝑈 y downstream 𝑖∈𝑆𝐷 ,𝑘∈ 𝐾𝐷. 𝛾𝑘,𝑙 𝑈 Variable binaria 0-1; 𝛾𝑘,𝑙 𝑈=1, si un tren tras terminar el servicio 𝑘−é𝑠𝑖𝑚𝑜,𝑘∈𝐾𝑈, gira en el andén de la estación terminal, N, para llevar a cabo el servicio 𝑙−é𝑠𝑖𝑚𝑜,𝑙∈𝐾𝐷 en el sentido contrario. 𝛾𝑘,𝑙 𝐷 Variable binaria 0-1; 𝛾𝑙,𝑘 𝐷=1, si un tren tras terminar el servicio k−é𝑠𝑖𝑚𝑜,𝑘∈ 𝐾𝐷, gira en el andén de la última estación, 2*N, para llevar a cabo el servicio 𝑙−é𝑠𝑖𝑚𝑜,𝑙∈𝐾𝑈 en el sentido contrario. 𝛼𝑘 𝑈 Variable binaria 0-1; 𝛼𝑘 𝑈=1, si un servicio 𝑘−é𝑠𝑖𝑚𝑜, 𝑘∈𝐾𝑈 es llevado a cabo por un tren que sale del depósito 1 (dirección upstream). 𝛼𝑘 𝐷 Variable binaria 0-1; 𝛼𝑘 𝐷=1, si un servicio 𝑘−é𝑠𝑖𝑚𝑜,𝑘∈𝐾𝐷 es llevado a cabo por un tren que sale del depósito 2 (dirección downstream). 𝛽𝑘𝑈 Variable binaria 0-1; 𝛽𝑘𝑈=1, si un tren tras realizar el servicio 𝑘− é𝑠𝑖𝑚𝑜,𝑘∈𝐾𝑈, se desplaza hacia el depósito 2. 𝛽𝑘𝐷 Variable binaria 0-1; 𝛽𝑘𝐷=1, si un tren tras realizar el servicio 𝑘− é𝑠𝑖𝑚𝑜,𝑘∈𝐾𝐷, se desplaza hacia depósito 1.
23 𝑅𝑆1𝐼 Variable entera. Número de trenes que se contabilizan originalmente en el depósito 1 al inicio de la planificación. 𝑅𝑆2𝐼 Variable entera. Número de trenes que se contabilizan originalmente en el depósito 2 al inicio de la planificación. 𝑅𝑆1𝐹 Variable entera. Número de trenes que se contabilizan en el depósito 1 al final del horizonte de planificación del horario. 𝑅𝑆2𝐹 Variable entera. Número de trenes que se contabilizan en el depósito 2 al final del horizonte de planificación del horario. 𝑤𝑘,𝑖 Variable entera. Número de pasajeros esperando en el andén 𝑖− é𝑠𝑖𝑚𝑜 antes de la llegada del servicio 𝑘−é𝑠𝑖𝑚𝑜 en dirección upstream 𝑖∈𝑆𝑈,𝑘∈𝐾𝑈 y downstream 𝑖∈𝑆𝐷,𝑘∈𝐾𝐷. 𝑤𝑘,𝑖,𝑗 Variable entera. Número de pasajeros esperando en el andén 𝑖− é𝑠𝑖𝑚𝑜 antes de la llegada del servicio 𝑘−é𝑠𝑖𝑚𝑜, para llegar al andén destino 𝑗−é𝑠𝑖𝑚𝑜 en dirección upstream 𝑖,𝑗∈𝑆𝑈,𝑖<𝑗 , 𝑘∈𝐾𝑈 y downstream 𝑖,𝑗∈𝑆𝐷,𝑖<𝑗,𝑘∈𝐾𝐷. 𝑤𝑘,𝑖,𝑗 𝑏 Variable entera. Número de pasajeros potenciales para embarcar en el metro de servicio 𝑘−é𝑠𝑖𝑚𝑜, en el andén 𝑖−é𝑠𝑖𝑚𝑜, para llegar al andén destino 𝑗−é𝑠𝑖𝑚𝑜 en dirección upstream 𝑖,𝑗∈𝑆𝑈,𝑖< 𝑗 ,𝑘∈𝐾𝑈 y downstream 𝑖,𝑗∈𝑆𝐷,𝑖<𝑗,𝑘∈𝐾𝐷. 𝑤𝑘,𝑖 𝑏 Variable entera. Número total de pasajeros potenciales para embarcar en el metro de servicio 𝑘−é𝑠𝑖𝑚𝑜, en el andén 𝑖− é𝑠𝑖𝑚𝑜 en dirección upstream 𝑖∈𝑆𝑈,𝑘∈𝐾𝑈 y downstream 𝑖∈ 𝑆𝐷,𝑘∈𝐾𝐷. 𝑐𝑘,𝑖 𝑏 Variable entera. Número de pasajeros que pueden embarcar en metro en el servicio 𝑘−é𝑠𝑖𝑚𝑜 y en el andén 𝑖−é𝑠𝑖𝑚𝑜 en dirección upstream 𝑖∈𝑆𝑈,𝑘∈𝐾𝑈 y downstream 𝑖∈𝑆𝐷,𝑘∈ 𝐾𝐷. 𝑐𝑘,𝑖,𝑗 𝑏 Variable entera. Número de pasajeros que pueden embarcar en el metro en el servicio 𝑘−é𝑠𝑖𝑚𝑜, en el andén 𝑖−é𝑠𝑖𝑚𝑜, para llegar al andén destino 𝑗−é𝑠𝑖𝑚𝑜 en dirección upstream 𝑖,𝑗∈𝑆𝑈,𝑖< 𝑗 ,𝑘∈𝐾𝑈 y downstream 𝑖,𝑗∈𝑆𝐷,𝑖<𝑗,𝑘∈𝐾𝐷. 𝑐𝑘,𝑖 𝑎 Variable entera. Número de pasajeros que se bajan del metro en el servicio 𝑘−é𝑠𝑖𝑚𝑜, en el andén 𝑖−é𝑠𝑖𝑚𝑜, en dirección upstream 𝑖∈𝑆𝑈,𝑘∈𝐾𝑈 y downstream 𝑖∈𝑆𝐷,𝑘∈𝐾𝐷. 𝑐𝑘,𝑖 Variable entera. Número de pasajeros dentro del metro después de que el servicio 𝑘−é𝑠𝑖𝑚𝑜 sirva el andén 𝑖−é𝑠𝑖𝑚𝑜, en dirección upstream 𝑖∈𝑆𝑈,𝑘∈𝐾𝑈 y downstream 𝑖∈𝑆𝐷,𝑘∈𝐾𝐷.
Modelado matemático. 24 24 Figura 1. Descripción de la línea de metro. 𝑤𝑘,𝑖,𝑗 𝑟 Variable entera. Número de pasajeros con destino 𝑗−é𝑠𝑖𝑚𝑜 que quedan esperando en el andén 𝑖−é𝑠𝑖𝑚𝑜 tras la salida del servicio 𝑘−é𝑠𝑖𝑚𝑜 de dicha plataforma, en dirección upstream 𝑖,𝑗∈𝑆𝑈, 𝑖<𝑗 ,𝑘∈𝐾𝑈 y downstream 𝑖,𝑗∈𝑆𝐷,𝑖<𝑗,𝑘∈𝐾𝐷. 𝑧𝑘,𝑖 𝑡 Variable binaria. 𝑧𝑘,𝑖 𝑡=1, si el tren que cubre el servicio 𝑘− é𝑠𝑖𝑚𝑜 sale de la plataforma 𝑖−é𝑠𝑖𝑚𝑎 en el instante 𝑡. Si no, 𝑧𝑘,𝑖 𝑡=0. Para el conjunto temporal upstream 𝑖∈𝑆𝑈,𝑘∈𝐾𝑈,𝑡∈ 𝑇 y downstream 𝑖∈𝑆𝐷,𝑘∈𝐾𝐷,𝑡∈𝑇. 𝑏𝑘,𝑖 𝑡 Variable binaria. 𝑏𝑘,𝑖 𝑡=1, si se produce la activación de la variable 𝑧𝑘,𝑖 𝑡 con respecto al servicio anterior. Si no, 𝑏𝑘,𝑖 𝑡=0, en el conjunto temporal upstream 𝑖∈𝑆𝑈,𝑘∈𝐾𝑈,𝑡∈𝑇 y downstream 𝑖∈𝑆𝐷, 𝑘∈𝐾𝐷,𝑡∈𝑇 𝜗𝑖,𝑗 𝑘 Variable binaria 0-1; 𝜗𝑖,𝑗 𝑘=1, si el servicio 𝑘−é𝑠𝑖𝑚𝑜 de un metro sirve a los andenes 𝑖−é𝑠𝑖𝑚𝑜 y 𝑗−é𝑠𝑖𝑚𝑜. Si no, 𝜗𝑖,𝑗 𝑘=0, en el conjunto temporal upstream arriba 𝑖,𝑗∈𝑆𝑈,𝑖<𝑗 ,𝑘∈𝐾𝑈 y downstream 𝑖,𝑗∈𝑆𝐷,𝑖<𝑗,𝑘∈𝐾𝐷. 𝑥𝑘,𝑖 𝑈 Variable continua. Variable auxiliar para 𝑘∈𝐾𝑈,𝑖∈𝑆𝑈. 𝑥𝑘,𝑖 𝐷 Variable continua. Variable auxiliar para 𝑘∈𝐾𝐷,𝑖∈𝑆𝐷. 𝑦𝑘,𝑖 𝑈 Variable continua. Variable auxiliar para 𝑘∈𝐾𝑈,𝑖∈𝑆𝑈. 𝑦𝑘,𝑖 𝐷 Variable continua. Variable auxiliar para 𝑘∈𝐾𝐷,𝑖∈𝑆𝐷. 𝑝𝑜𝑟𝑐𝑘,𝑖,𝑗 𝑈 Variable continua. Porcentaje de la variable 𝑐𝑘,𝑖 𝑏 para estimar 𝑐𝑘,𝑖,𝑗 𝑏; 𝑖,𝑗∈𝑆𝑈,𝑖<𝑗 ,𝑘∈𝐾𝑈 . 𝑝𝑜𝑟𝑐𝑘,𝑖,𝑗 𝐷 Variable continua. Porcentaje de la variable 𝑐𝑘,𝑖 𝑏 para estimar 𝑐𝑘,𝑖,𝑗 𝑏; 𝑖,𝑗∈𝑆𝐷,𝑖<𝑗 ,𝑘∈𝐾𝐷 .
25 4.2 Restricciones. Las restricciones del modelo propuesto corresponden a cuatro subproblemas que se deben controlar: las estaciones que serán servidas por los diferentes servicios, el horario de los trenes, el material rodante y la demanda. Se describen y detallan a continuación, empleando las notaciones y variables descritas anteriormente. 4.2.1 Restricciones de estaciones servidas y activación de servicios. 1. Si el servicio potencial 𝑘 ∈𝐾𝑈 no es seleccionado, 𝜏𝑘=0, ningún andén en el sentido upstream es servido por el servicio 𝑘, λ𝑘,𝑖=0,𝑘 ∈𝐾𝑈,𝑖∈𝑆𝑈. Este comportamiento se consigue con las siguientes restricciones: λ𝑘,𝑖≤𝜏𝑘, ∀ 𝑘 ϵ 𝐾𝑈,𝑖∈𝑆𝑈 (1.1) Lo mismo para el sentido downstream: λ𝑘,𝑖≤𝜏𝑘, ∀ 𝑘 ϵ 𝐾𝐷,𝑖∈𝑆𝐷 (1.2) 2. Para evitar que dos servicios consecutivos no se detengan en un mismo andén, 𝑖∈ 𝑆𝑈 o 𝑖∈𝑆𝐷, se imponen las siguientes restricciones para ambas direcciones: λ𝑘−1,𝑖+λ𝑘,𝑖≥1, ∀ 𝑘−1,𝑘 ∈𝐾𝑈,𝑖∈𝑆𝑈, (2.1) λ𝑘−1,𝑖+λ𝑘,𝑖≥1, ∀ 𝑘−1,𝑘 ∈𝐾𝐷,𝑖∈𝑆𝐷. (2.2) El objetivo de estas restricciones es el de evitar que los pasajeros no tengan que esperar un tiempo excesivamente grande en las estaciones, hasta la llegada de un servicio en el que pueden iniciar o proseguir su viaje. De esta forma se garantiza que al menos uno de cada dos servicios consecutivos se detendrá en cada estación para cargar pasajeros. 4.2.2 Restricciones del horario. 4.2.2.1 Restricciones de llegadas y salidas. 3. Para evitar detenciones excesivas de los trenes en las estaciones, se acota el tiempo de parada imponiendo que este sea menor o igual que un tiempo de parada máximo. También se impone un valor mínimo. En el caso en que una estación no sea parada de un determinado servicio, se fuerza que el tiempo de parada de ese servicio en la estación sea nulo.
Modelado matemático. 26 26 𝑒𝑘,𝑖≤𝑒𝑚𝑎𝑥∗λ𝑘,𝑖, 𝑘∈𝐾𝑈,𝑖∈𝑆𝑈 (3.1) 𝑒𝑘,𝑖≤𝑒𝑚𝑎𝑥∗λ𝑘,𝑖, 𝑘∈𝐾𝐷,𝑖∈𝑆𝐷 (3.2) 𝑒𝑘,𝑖≥𝑒𝑚𝑖𝑛∗λ𝑘,𝑖, 𝑘∈𝐾𝑈,𝑖∈𝑆𝑈 (3.3) 𝑒𝑘,𝑖≥𝑒𝑚𝑖𝑛∗λ𝑘,𝑖, 𝑘∈𝐾𝐷,𝑖∈𝑆𝐷 (3.4) 4. Teniendo en cuenta que el tiempo de parada también es una variable, para cada servicio 𝑘 y plataforma 𝑖, se impone que sea igual a la diferencia entre los instantes de salida y de llegada, mediante las siguientes dos restricciones: 𝑑𝑘,𝑖−𝑎𝑘,𝑖=𝑒𝑖 , ∀ 𝑘∈𝐾𝑈,𝑖∈𝑆𝑈 (4.1) 𝑑𝑘,𝑖−𝑎𝑘,𝑖=𝑒𝑖 , ∀ 𝑘∈𝐾𝐷,𝑖∈𝑆𝐷 (4.2) 5. Partiendo de que las salidas y las llegadas son variables y que los tiempos de ejecución son datos, controlamos dichas variables con las siguientes restricciones, imponiendo que la diferencia de tiempo de la llegada al andén 𝑖 y la salida del anterior, 𝑖−1, sea el tiempo de recorrido: 𝑎𝑘,𝑖−𝑑𝑘,𝑖−1=𝑠𝑖−1,𝑖 , ∀ 𝑘 ∈𝐾𝑈,𝑖−1,𝑖∈𝑆𝑈 (5.1) 𝑎𝑘,𝑖−𝑑𝑘,𝑖−1=𝑠𝑖−1,𝑖 , ∀ 𝑘 ∈𝐾𝐷,𝑖−1,𝑖∈𝑆𝐷 (5.2) 4.2.2.2 Restricciones del headway. 6. Si el servicio 𝑘 es seleccionado, 𝜏𝑘=1 , para garantizar la seguridad de las operaciones debemos imponer que el headway entre dos servicios consecutivos 𝑘− 1 y 𝑘 se encuentre entre unos valores máximos y mínimos, para asegurar una cierta cantidad de servicios en un periodo de tiempo. Sin embargo, si el servicio 𝑘 no es seleccionado, 𝜏𝑘=0, ℎ𝑘−1,𝑘=0. Las dos ecuaciones de arriba pueden ser sustituidas por las siguientes ecuaciones, lineales {ℎ𝑚𝑖𝑛≤ℎ𝑘−1,𝑘≤ℎ𝑚𝑎𝑥,𝑠𝑖 𝜏𝑘=1, ∀ 𝑘−1,𝑘∈𝐾𝑈 ℎ𝑘−1,𝑘=0, 𝑠𝑖 𝜏𝑘=0, ∀ 𝑘−1,𝑘∈𝐾𝐷
27 ℎ𝑚𝑖𝑛∗𝜏𝑘≤ℎ𝑘−1,𝑘≤ℎ𝑚𝑎𝑥∗𝜏𝑘, ∀ 𝑘−1,𝑘∈𝐾𝑈, (6.1) ℎ𝑚𝑖𝑛∗𝜏𝑘≤ℎ𝑘−1,𝑘≤ℎ𝑚𝑎𝑥∗𝜏𝑘, ∀ 𝑘−1,𝑘∈𝐾𝐷 (6.2) 7. Si un servicio 𝑘 no es elegido, 𝜏𝑘=0, ℎ𝑘−1,𝑘=0 y, por lo tanto, su tiempo de salida en una plataforma 𝑖 es el mismo que el del servicio anterior. Sin embargo, si 𝑘 es elegido, 𝜏𝑘=1, la diferencia entre sus tiempos de salida será el headway entre ambos servicios consecutivos. 𝑑𝑘,𝑖=𝑑𝑘−1,𝑖+ℎ𝑘−1,𝑘, ∀ 𝑘−1,𝑘∈𝐾𝑈,𝑖∈ 𝑆𝑈 (7.1) 𝑑𝑘,𝑖=𝑑𝑘−1,𝑖+ℎ𝑘−1,𝑘, ∀ 𝑘−1,𝑘∈𝐾𝐷,𝑖∈ 𝑆𝐷 (7.2) 4.2.2.3 Restricciones de giros. 8. El giro de un tren sucede cuando este llega a la última estación del servicio 𝑘, y es seleccionado para llevar a cabo el servicio 𝑙 produciendo por ello un cambio de sentido del movimiento del tren. Si un servicio 𝑘 es finalizado por un tren y éste gira en su última estación para llevar a cabo el servicio 𝑙, el tiempo comprendido entre la salida de una plataforma y la llegada a la otra de esta misma estación terminal debe estar comprendido entre los tiempos de giro máximo y mínimo. Lo vemos con las ecuaciones siguientes para ambos sentidos: 𝛿𝑚𝑖𝑛≤𝑑𝑘,𝑁−1−𝑎𝑙,𝑁≤𝛿𝑚𝑎𝑥, 𝑠𝑖 𝛾𝑘,𝑙 𝑈=1, ∀ 𝑘∈𝐾𝑈,𝑙∈𝐾𝐷,𝑚∈𝑆𝑀 𝑈 𝛿𝑚𝑖𝑛≤𝑑𝑙,2∗𝑁−1−𝑎𝑘,0≤𝛿𝑚𝑎𝑥, 𝑠𝑖 𝛾𝑙,𝑘 𝐷=1, ∀ 𝑙∈𝐾𝐷,𝑘∈𝐾𝑈,𝑚∈𝑆𝑀 𝐷 Estas dos ecuaciones equivaldrían a las siguientes cuatro restricciones para nuestro modelo: 𝑎𝑙,𝑁−𝑑𝑘,𝑁−1≥𝛿𝑚𝑖𝑛+𝑀∗(𝛾𝑘,𝑙 𝑈−1),∀ 𝑘∈𝐾𝑈,𝑙 ∈𝐾𝐷,𝑚∈𝑆𝑀 𝑈 (8.1.1) 𝑎𝑙,𝑁−𝑑𝑘,𝑁−1≤𝛿𝑚𝑎𝑥−𝑀∗(𝛾𝑘,𝑙 𝑈−1),∀ 𝑘∈𝐾𝑈,𝑙 ∈𝐾𝐷,𝑚∈𝑆𝑀 𝑈 (8.1.2)
Modelado matemático. 28 28 𝑎𝑘,0−𝑑𝑙,2∗𝑁−1≥𝛿𝑚𝑖𝑛+𝑀∗(𝛾𝑙,𝑘 𝐷−1),∀ 𝑙∈𝐾𝐷,𝑘 ∈𝐾𝑈,𝑚∈𝑆𝑀 𝐷 (8.2.1) 𝑎𝑘,0−𝑑𝑙,2∗𝑁−1≤𝛿𝑚𝑎𝑥−𝑀∗(𝛾𝑙,𝑘 𝐷−1),∀ 𝑙∈𝐾𝐷,𝑘 ∈𝐾𝑈,𝑚∈𝑆𝑀 𝐷 (8.2.2) 4.2.3 Restricciones del material rodante. 9. Si un servicio potencial es seleccionado, 𝜏𝑘=1, para recorrer el sentido aguas arriba, este se llevará a cabo por un tren que saldrá del depósito 1 ( 𝛼𝑘 𝑈=1, 𝛾𝑙,𝑘 𝐷= 0,) o por un tren que ha llegado a su final del recorrido aguas abajo, finalizando el servicio 𝑙 ( 𝛼𝑘 𝑈=0, 𝛾𝑙,𝑘 𝐷=1). Lo mismo ocurriría para un servicio potencial aguas abajo, que deberá ser llevado a cabo por un tren que se encuentra en el depósito 2 (𝛼𝑘 𝐷=1, 𝛾𝑘,𝑙 𝑈=0) o por uno que ha llegado al final de un servicio 𝑘 en el sentido aguas arriba (𝛼𝑘 𝐷=0, 𝛾𝑘,𝑙 𝑈= 1). Se satisface lo dicho anteriormente con las siguientes dos restricciones: ∑𝛾𝑙,𝑘 𝐷+𝛼𝑘 𝑈=𝜏𝑘, ∀ 𝑘 𝜖 𝐾𝑈 𝑙∈𝐾𝐷 (9.1) ∑𝛾𝑙,𝑘 𝑈+𝛼𝑘 𝐷=𝜏𝑘, ∀ 𝑘 𝜖 𝐾𝐷 𝑙∈𝐾𝑈 (9.2) 10. Cuando un servicio 𝑘 es seleccionado, 𝜏𝑘=1, y está siendo ejecutado por un tren que llega a la última estación del sentido aguas arriba, el tren puede moverse al depósito 2 ( 𝛽𝑘𝑈=1, 𝛾𝑘,𝑙 𝑈=0) o ser seleccionado para girar y ejecutar el servicio 𝑙 en el sentido aguas abajo (𝛽𝑘𝑈=0, 𝛾𝑘,𝑙 𝑈=1). Lo mismo para un tren que llega a la estación final del servicio aguas abajo. Este puede ser enviado al depósito 1 (𝛽𝑘𝐷=1, 𝛾𝑘,𝑙 𝐷=0) o girar y ejecutar el servicio 𝑙 en sentido aguas arriba (𝛽𝑘𝐷=0, 𝛾𝑘,𝑙 𝐷=1). ∑𝛾𝑘,𝑙 𝑈+𝛽𝑘𝑈=𝜏𝑘, ∀ 𝑘 𝜖 𝐾𝑈 𝑙∈𝐾𝐷 (10.1) ∑𝛾𝑘,𝑙 𝐷+𝛽𝑘𝐷=𝜏𝑘, ∀ 𝑘 𝜖 𝐾𝐷 𝑙∈𝐾𝑈 (10.2)
29 11. Con las siguientes dos restricciones podemos controlar que el número de salidas que se realizan en cada uno de los dos depósitos no sea mayor que el número de trenes que se tienen antes de comenzar el horario. 𝑅𝑆1𝐼≥∑𝛼𝑘 𝑈 𝑘∈𝐾𝑈 (11.1) 𝑅𝑆2𝐼≥∑𝛼𝑘 𝐷 𝑘∈𝐾𝐷 (11.2) 12. Para poder contabilizar el número de trenes que se tienen al terminar la operación de la línea, se establece el siguiente balance de entradas y salidas: 𝑅𝑆1𝐹=𝑅𝑆1𝐼+∑𝛽𝑘𝐷 𝑘∈𝐾𝐷−∑𝛼𝑘 𝑈 𝑘∈𝐾𝑈 (12.1) 𝑅𝑆2𝐹=𝑅𝑆2𝐼+∑𝛽𝑘𝑈 𝑘∈𝐾𝑈−∑𝛼𝑘 𝐷 𝑘∈𝐾𝐷 (12.2) 13. Con la siguiente ecuación, se impone que el número de trenes que se contabiliza en cada depósito no pueda ser mayor que el número de trenes disponibles. 𝑅𝑆1𝐼+𝑅𝑆2𝐼≤𝑅𝑆 (13) 14. Para forzar que la cantidad final de trenes en cada depósito sea igual a la inicial (opcional), se pueden imponer las siguientes restricciones: 𝑅𝑆1𝐹=𝑅𝑆1𝐼 (14.1) 𝑅𝑆2𝐹=𝑅𝑆2𝐼 (14.2) 4.2.4 Restricciones de demanda. Con las siguientes cuatro restricciones se impiden las transferencias de pasajeros entre servicios. 15. Se impone que el número de pasajeros esperando al servicio 𝑘 en el andén 𝑖, sea la suma de todos los pasajeros que esperan en 𝑖 al servicio 𝑘, para llegar a los andenes 𝑗 posteriores al 𝑖.
Modelado matemático. 30 30 𝑤𝑘,𝑖=∑𝑤𝑘,𝑖,𝑗 𝑁 𝑗=𝑖+1 ,∀ 𝑘 ∈𝐾𝑈,𝑖∈𝑆𝑈, (15.1) 𝑤𝑘,𝑖=∑𝑤𝑘,𝑖,𝑗 𝑁 𝑗=𝑖+1 ,∀ 𝑘 ∈𝐾𝐷,𝑖∈𝑆𝐷. (15.2) 16. El número de pasajeros que podrían embarcar en el servicio 𝑘 desde la plataforma 𝑖 es la suma de todos los pasajeros que embarcan en el servicio 𝑘 en el andén 𝑖 y con destino 𝑗. 𝑤𝑘,𝑖 𝑏=∑𝑤𝑘,𝑖,𝑗 𝑏 ,∀ 𝑘∈𝐾𝑈 𝑁 𝑗=𝑖+1 ,𝑖∈𝑆𝑈, (16.1) 𝑤𝑘,𝑖 𝑏=∑𝑤𝑘,𝑖,𝑗 𝑏 ,∀ 𝑘∈𝐾𝐷 𝑁 𝑗=𝑖+1 ,𝑖∈𝑆𝐷. (16.2) 17. El número de pasajeros que pueden embarcar en el servicio 𝑘 desde el andén 𝑖 (que como se verá posteriormente dependerá de si el tren se detiene en ese andén) se compone por la suma todos los pasajeros que pueden embarcar en el servicio 𝑘 desde el andén 𝑖 para llegar a cualquier plataforma posterior 𝑗. 𝑐𝑘,𝑖 𝑏=∑𝑐𝑘,𝑖,𝑗 𝑏 ,∀ 𝑘∈𝐾𝑈 𝑁 𝑗=𝑖+1 ,𝑖∈𝑆𝑈, (17.1) 𝑐𝑘,𝑖 𝑏=∑𝑐𝑘,𝑖,𝑗 𝑏 ,∀ 𝑘∈𝐾𝐷 𝑁 𝑗=𝑖+1 ,𝑖∈𝑆𝐷. (17.2) 18. El número de pasajeros que esperan para ser recogidos por el servicio 𝑘 desde el andén 𝑖 con destino 𝑗 (𝑗 posterior a 𝑖) será la suma de los pasajeros residuales que no pudieron montarse en el servicio anterior más los pasajeros que han llegado desde la salida del último servicio, extraídos de los datos de la matriz O-D de demanda temporal:
31 𝑤𝑘,𝑖,𝑗= { 𝑤𝑘−1,𝑖,𝑗 𝑟+∫𝑃𝑖[𝜏]·𝑂𝐷𝑖,𝑗[𝜏] 𝑑𝑘,𝑖 𝑑𝑘−1,𝑖 ·𝑑𝜏, 𝑠𝑖 𝑘>0,∀ 𝑘∈𝐾𝑈,∀ 𝑖,𝑗∈𝑆𝑈,𝑖<𝑗,∀ 𝜏∈𝒯 ∫𝑃𝑖[𝜏]·𝑂𝐷𝑖,𝑗[𝜏]·𝑑𝜏, 𝑑𝑘,𝑖 0 𝑠𝑖 𝑘=0,∀ 𝑖,𝑗 ∈ 𝑆𝑈,𝑖<𝑗,∀ 𝜏∈𝒯 𝑤𝑘,𝑖,𝑗= { 𝑤𝑘−1,𝑖,𝑗 𝑟+∫𝑃𝑖[𝜏]·𝑂𝐷𝑖,𝑗[𝜏] 𝑑𝑘,𝑖 𝑑𝑘−1,𝑖 ·𝑑𝜏, 𝑠𝑖 𝑘>𝑁,∀ 𝑘∈𝐾𝐷,∀ 𝑖,𝑗∈𝑆𝐷,𝑖<𝑗,∀ 𝜏∈𝒯 ∫𝑃𝑖[𝜏]·𝑂𝐷𝑖,𝑗[𝜏]·𝑑𝜏, 𝑑𝑘,𝑖 0 𝑠𝑖 𝑘=𝑁,∀ 𝑖,𝑗 ∈ 𝑆𝐷,𝑖<𝑗,∀ 𝜏∈𝒯 Debido a la no linealidad de las restricciones anteriores, se deben realizar modificaciones, para evitar problemas al integrarlas en el Solver que usaremos para resolver el problema. De esta manera, la restricción anterior se sustituye por el siguiente conjunto de restricciones lineales equivalentes. Si el tren que cubre el servicio 𝑘, sale del andén 𝑖 en el instante 𝑡, la variable 𝑧𝑘,𝑖 𝑖𝑛𝑑𝑡 queda activada para todo instante 𝑡 posterior. 𝑧𝑘,𝑖 𝜏−1≤𝑧𝑘,𝑖 𝜏 ,∀ 𝑘∈ 𝐾𝑈,∀ 𝑖∈𝑆𝑈,∀ 𝜏∈𝒯,𝜏≥2. (18.1.1) 𝑧𝑘,𝑖 𝜏−1≤𝑧𝑘,𝑖 𝜏 ,∀ 𝑘∈ 𝐾𝐷,∀ 𝑖∈𝑆𝐷,∀ 𝜏∈𝒯,𝜏≥2. (18.1.2) Para determinar el instante 𝑡 de salida del tren del andén 𝑖 en el servicio 𝑘, se impone: 𝑑𝑘,𝑖=∑𝜏∗(𝑧𝑘,𝑖 𝜏 𝒯 𝜏=2 −𝑧𝑘,𝑖 𝜏−1), ∀ 𝑘∈ 𝐾𝑈,∀ 𝑖∈𝑆𝑈, (18.2.1) 𝑑𝑘,𝑖=∑𝜏∗(𝑧𝑘,𝑖 𝜏 𝒯 𝜏=2 −𝑧𝑘,𝑖 𝜏−1), ∀ 𝑘∈ 𝐾𝐷,∀ 𝑖∈𝑆𝐷. (18.2.2) Para activar las variables que miden los instantes de captura de pasajeros 𝑏𝑘,𝑖 𝑖𝑛𝑑𝑡 en función de las que señalen el momento de salida de un servicio 𝑧𝑘,𝑖 𝑖𝑛𝑑𝑡 se impone:
Programación del problema. 38 38 5 PROGRAMACIÓN DEL PROBLEMA. on el fin de resolver el modelo matemático construido, se procede a describir el proceso de programación requerido mediante código Python y la implementación de librerías del solver Gurobi. 5.1 Implementación del solver Gurobi. Gurobi Optimizer es un solver comercial de optimización fundado en 2008 por Zonghao Gu, Edward Rothberg y Robert Bixby. Está considerado como el solver matemático más rápido y poderoso para programación lineal, cuadrática y mixta. Esta implementado en más de 2500 empresas de más de 40 sectores diferentes, con el fin de tratar los datos con mayor inteligencia, permitiendo a los usuarios plantear problemas empresariales como modelos matemáticos, encontrando la mejor solución de entre dos millones de posibilidades. Puede funcionar como asistente para la toma de decisiones, guiado por un experto o incluso de forma autónoma, ejecutándose sin intervención humana (https://www.gurobi.com/ 2021). Entre los distintos problemas matemáticos que puede llegar a resolver se encuentran: - Programación lineal (LP): simplex, método de penalización y barrera, implementación concurrente. - Programación cuadrática (QP): simplex y algoritmos de barrera en paralelo. - Programación cuadrática restringida (QCP). - Programación lineal entera mixta (MILP): paralelo determinista, búsqueda no tradicional, heurísticas, mejora de la solución, planos de corte y ruptura de simetría. - Programación cuadrática mixta entera (MIQP). - Programación cuadrática mixta entera restringida (MIQCP). El optimizador Gurobi es compatible con diversos lenguajes de programación y modelado: - Interfaces orientadas a objetos para C++, Java, .NET y Python. - Interfaces orientadas a matrices para C, Pyhton, MATLAB y R. - Enlaces a lenguajes de modelado estándar: AIMMS, AMPL, GAMS y MPL. - Enlaces a Excel a través de sus productos Analytic Solver y Solver SDK. Gurobi Optimizer incluye también una serie de elementos y características para apoyar la construcción y resolución de modelados de optimización, incluyendo: - Múltiples objetivos, flexiblemente ponderables. - Restricciones generales como MIN, MAX, ABS, AND/OR. - Modelos con funciones objetivos convexas y poco lineales. - Funciones objetivos arbitrarias poco lineales, para facilitar la expresión de esta característica común de los modelos. C
39 - Ajuste distribuido, para acelerar la exploración de los ajustes de los parámetros y acelerar los tiempos de resolución. Para programar el modelado y resolver el problema matemático concreto que se trate, se emplean las siguientes funciones que nos proporciona la librería Python del Solver: xxxx=Model('XXXX') Se emplea para declarar el modelo matemático bajo un nombre. El modelo del problema se nombra y se guarda en la variable tr: tr = Model('Transporte'). yyyy=xxxx.tr.addVar(l b=a, ub=b, vtype=c, name="YYYY") Esta función se usa para declarar una variable del problema. - lb: define el límite inferior de la variable, a. - ub: define el límite superior, b. - vtype: para indicar el tipo de variable. - name: para indicar el nombre de dicha variable en el modelo. xxxx.addConstr(yyyy= =d, name="Restriction ") Con esta función se declara una restricción del modelo. xxxx.setObjective(yyyy -e) Con esta función se declara la función objetivo del sistema. xxxx.optimize() Esta función procede a la búsqueda de soluciones del problema. xxxx.modelSense() Esta función permite introducir el sentido de la resolución, minimizando o maximizando la función objetivo. xxxx.write('Problema.l p') Esta función permite escribir el modelo en un archivo de texto nombrado con la cadena de caracteres que se le pasa a la función.
Programación del problema. 40 40 Tabla 1. Funciones de GUROBI en Python. También se emplean definiciones mostradas a continuación proporcionadas por la librería: GRB.INFINITY esta constante permite hacer referencia al infinito. GRB.CONTINUOUS permite identificar una variable de tipo continuo. GRB.BINARY permite identificar una variable de tipo binaria. GRB.INTEGER permite identificar una variable de tipo binaria. GRB.MINIMIZE indica que se pretende minimizar el valor de la función objetivo. setParam(ffff, gggg, hhhh) Se emplea esta función para ajustar ciertos parámetros como: - El tiempo de ejecución máximo para encontrar la solución óptima. Por ejemplo, para indicar que el tiempo límite sean 400 segundos: setParam('Timelimit', 400) (https://www.gurobi.com/documentation/9.1/refman/time limit.html 2021) - Indicar que el problema no sea convexo. setParam ('NonConvex', 2): Dado el valor 2, los problemas cuadráticos no convexos se resuelven traduciéndolos a forma bilineal y aplicando ramificaciones espaciales. (https://www.gurobi.com/documentation/9.1/refman/nonc onvex.html 2021) - Indicar que la brecha entre el límite inferior y superior del objetivo sea menor que MIPGap veces el valor absoluto del valor del objetivo titular. Por ejemplo, para indicar que el solucionador se detenga cuando la brecha impuesta sea del 0,05%: setParam(“MIPGap”, 0,005) (https://www.gurobi.com/documentation/9.1/refman/nonc onvex.html 2021)
41 GRB.MAXIMIZE indica que se pretende maximizar el valor de la función objetivo. Tabla 2. Definiciones de GUROBI en Python. 5.2 Datos. Los datos del problema se cargan desde un fichero Excel desde el que se leen tanto el número de estaciones y servicios, el número de trenes disponibles, la capacidad y velocidad de los trenes, las distancias entre plataformas, los datos de demanda, y se establecen valores límites para la determinación de algunas variables como el headway, el tiempo de giro y los dwell times o tiempos de parada en las estaciones. Figura 2. Interfaz Excel para número de estaciones. Figura 3. Interfaz Excel para número de servicios. Figura 4. Interfaz Escel límites para headways y tiempos de giro. Figura 5. Interfaz Excel para límites de dwell times. Figura 6. Interfaz Excel para nº de trenes disponibles y tamaño de los trenes. Numero de estaciones: 4 NÚMERO DE SERVICIOS PARA UPSTREAM 10 PARA DOWNSTREAM 10 HEADWAY minutos hmax 30 hmin 3,5 TIEMPOS DE GIRO minutos 3,5 2 DWELLING TIMES minutos emin 0,5 emax 2,8 Nº. TRENES DISPONIBLES RS 16 trenes CAPACIDAD DEL TREN C600 pasajeros
Programación del problema. 42 42 Figuras 7.A y 7.B. Interfaz Excel para velocidad de los trenes, longitudes entre estaciones y tiempos de viaje. A partir de la velocidad de los trenes que recorren la línea y las distancias entre plataformas (Figura 7.A), se determinan los tiempos de recorrido o tiempos de viajes entre estas, como se muestran en la Figura 7.B. Figura 8. Interfaz Excel para la demanda de pasajeros. Desde una matriz temporal O-D como la de la Figura 8, compuesta por conjunto de pares de estaciones, se extrae la ventana de demanda de pasajeros a lo largo del horizonte de planificación. Por ejemplo, el número de pasajeros que llega a la plataforma 0 para ir llegar al andén 3, a las 8:54, se contabiliza en 19. Para el manejo de todos estos datos expuestos y recogidos con la interfaz Excel, se emplea la librería openpyxl, para leer los datos procedentes de los ficheros en forma de listas, empleando la función Read_Excel_to_List. El número de estaciones se lee de una celda correspondiente de la hoja Excel, para posteriormente guardar en listas los índices de las plataformas para ambos sentidos, como se muestra a continuación: VELOCIDAD 60 km/h = 1000 m/min 0 1 2 3 01200 2500 4000 01300 2800 01500 4 5 6 7 01500 2800 4000 01300 2500 01200 Plataformas U LONGITUDES(m) Plataformas D LONGITUDES(m) 0 1 2 3 8:53 8:54 8:55 8:56 0,1 21 22 819 0,2 24 13 20 6 0,3 20 19 15 11 1,2 21 19 21 6 1,3 14 15 16 18 2,3 17 11 18 5 8:53 8:54 8:55 8:56 4,5 15 16 914 4,6 614 12 22 4,7 15 15 17 23 5,6 7 9 24 22 5,7 24 19 22 24 6,7 19 15 21 18 UP DW Instantes de tiempo MATRIZ OD(t) TIEMPO DE OPERACIÓN i-1 i minutos 1 2 1,2 1 3 2,5 1 4 4 2 3 1,3 2 4 2,8 3 4 1,5 5 6 1,2 5 7 2,5 5 8 4 6 7 1,3 6 8 2,8 7 8 1,5 S(U) S(D)
43 Figura 9. Lectura del número de estaciones: 𝑆𝑈,𝑆𝐷. Los valores mínimos y máximos para los dwell times se leen desde las celdas Excel correspondientes, en forma de listas de un solo valor. Figura 10. Lectura de los límites de los dwell times: 𝑒𝑚𝑖𝑛, 𝑒𝑚𝑎𝑥. Los valores mínimos y máximos para el headway, los límities de tiempos de giro entre servicios, el numero de trenes disponibles para realizar los servicios y el tamaño de los mismo se leen mediante listas de valor único, para cada uno de los términos mencionados. - Los valores límites de los headways: Figura 11. Lectura de los límites de los headways: ℎ𝑚𝑎𝑥,ℎ𝑚𝑖𝑛. - Los valores límites de los tiempos de giros de los trenes: Figura 12. Lectura de los límites de los tiempos de giro: 𝛿𝑚 𝑚𝑎𝑥, 𝛿𝑚 𝑚𝑖𝑛. estaciones = Read_Excel_to_List(sheet, 'E7', 'E7') estaciones = estaciones[0] estaciones_up = [] estaciones_down = [] for i in range(0,estaciones): estaciones_up.append(i) for i in range(estaciones,2*estaciones): estaciones_down.append(i) emin = Read_Excel_to_List(sheet, 'E22', 'E22') emin = emin[0] emax = Read_Excel_to_List(sheet, 'E23', 'E23') emax = emax[0] hmax = Read_Excel_to_List(sheet, 'E26', 'E26') hmax = float(hmax[0]) hmin = Read_Excel_to_List(sheet, 'E27', 'E27') hmin = float(hmin[0]) tgiromax = Read_Excel_to_List(sheet, 'E31', 'E31') tgiromax = tgiromax[0] tgiromin = Read_Excel_to_List(sheet, 'E32', 'E32') tgiromin = tgiromin[0]
Programación del problema. 44 44 - El número de trenes disponibles para realizar los servicios: Figura 13. Lectura del número de trenes disponibles: RS. - El tamaño de los trenes: Figura 14. Lectura del tamaño de los trenes: 𝐶. El número de servicios máximos a realizar en la línea, a lo largo del horizonte de planificación establecido, se lee con listas de un único valor y se guardan sus índices empleando un bucle, para cada dirección. Figura 15. Lectura del número de servicios: 𝐾𝑈,𝐾𝐷. Los tiempos de ejecución de los viajes entre las estaciones se leen mediante listas de valor único para cada par de plataformas de una misma dirección de la línea, creando un diccionario recorrido mediante bucles anidados por dos índices, plataforma origen y destino, como se muestra a continuación: RS = Read_Excel_to_List(sheet, 'E13', 'E13') RS = RS[0] C = Read_Excel_to_List(sheet, 'E16', 'E16') C = C[0] num_servicios_up = Read_Excel_to_List(sheet, 'N8', 'N8') num_servicios_up = num_servicios_up[0] num_servicios_down = Read_Excel_to_List(sheet, 'N9', 'N9') num_servicios_down = num_servicios_down[0] servicios_up = [] servicios_down = [] for k in range(0,num_servicios_up): servicios_up.append(k) for k in range(num_servicios_up, num_servicios_up+num_servicios_down): servicios_down.append(k)
45 Figura 16. Lectura de los tiempos de viajes: 𝑠𝑖−1,𝑖. Los instantes de tiempo se leen con una lista del tamaño correspondiente al horizonte temporal fragmentado por periodos previamente establecidos. Figura 17. Lectura de los instantes de tiempo: ∀ 𝑡∈𝑇. Los datos de la matriz de demanda de pasajeros entre plataformas para el horizonte de planificación establecido se cargan mediante listas que leen las filas de la matriz con dimensión el horizonte de planificación fragmentado. Se guardan en un diccionario en forma de matriz mediante bucles anidados y la creación de diccionarios auxiliares para controlar el espacio de la hoja Excel desde la que se opera. s = {} k = 0 for i in estaciones_up: for j in estaciones_up: if j > i: n_inicial = 17+k n_inicial = str(n_inicial) celda_s = str('G'+n_inicial) s[i, j] = Read_Excel_to_List(sheet, celda_s, celda_s) s[i, j] = float(s[i, j][0]) k = k+1 for i in estaciones_down: for j in estaciones_down: if j > i: n_inicial = 17+k n_inicial = str(n_inicial) celda_s = str('G'+n_inicial) s[i, j] = Read_Excel_to_List(sheet, celda_s, celda_s) s[i, j] = float(s[i, j][0]) k = k+1 tiempo = Read_Excel_to_List(sheet, 'N18', 'CR18')
Programación del problema. 46 46 Figura 18. Lectura de la matriz de demanda de pasajeros O-D: 𝑂𝐷𝑖,𝑗[𝜏]. Para facilitar y agilizar la programación de las restricciones, se crean conjuntos para agrupar las plataformas y los servicios para ambos sentidos. Figura 19. Lectura de los conjuntos servicio y origen: 𝑖,𝑘 (𝑈,𝐷). k = 0 numerocelda = {} celdainicial = {} celdafinal = {} demanda = {} for i in estaciones_up: for j in estaciones_up: if j > i: numerocelda[k] = str(20 + k) celdainicial[k] = str('N'+numerocelda[k]) celdafinal[k] = str('CR' + numerocelda[k]) #solo 1 hora cada min demanda[i, j] = Read_Excel_to_List(sheet, celdainicial[k], celdafinal[k]) k = k+1 k = 0 for i in estaciones_down: for j in estaciones_down: if j > i: numerocelda[k] = str(78 + k) celdainicial[k] = str('N'+numerocelda[k]) celdafinal[k] = str('CR' + numerocelda[k]) demanda[i, j] = Read_Excel_to_List(sheet, celdainicial[k], celdafinal[k]) k = k+1 conjunto_up = [(k, i) for k in servicios_up for i in estaciones_up] conjunto_down = [(k, i) for k in servicios_down for i in estaciones_down]
47 Figura 20. Lectura de los conjuntos servicio, origen y destino: 𝑖,𝑗,𝑘 (𝑈,𝐷). 5.3 Variables. La variable binaria 𝜏𝑘,𝑘∈𝐾𝑈∪𝐾𝐷, de activación de servicios se declara mediante la creación de un diccionario recorrido como una lista por un bucle para referenciar a los servicios. Figura 21. Declaración de las variables binarias 𝜏𝑘. La variable binaria λ𝑘,𝑖,𝑘∈𝐾𝑈,𝑖∈𝑆𝑈 𝑜 𝑘∈𝐾𝐷,𝑖∈𝑆𝐷, de servicios que satisface andenes se declara empleando un diccionario recorrido en forma de matriz, de dimensiones el número de servicios y de plataformas totales, mediante bucles anidados, como se muestra a continuación: Figura 22. Declaración de las variables binarias λ𝑘,𝑖. La variable continua ℎ𝑘−1,𝑘, 𝑘−1,𝑘∈𝐾𝑈∪𝐾𝐷, de headways entre servicios consecutivos, se declara empleando un diccionario recorrido en forma de matriz, al que se accede a sus elementos mediante bucles anidados que referencian al par de servicios consecutivos, como se muestra: setup=[(i,j,k) for i in estaciones_up for j in estaciones_up if j > i for k in servicios_up if k > 0] setdw=[(i,j,k) for i in estaciones_down for j in estaciones_down if j > i for k in servicios_down if k > len(servicios_up)] servactiv = {} for k in servicios_up: servactiv[k] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="servactiv_%s" % k) for k in servicios_down: servactiv[k] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="servactiv_%s" % k) landa = {} for k, i in conjunto_up: landa[k, i] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="Landa_%s_%s" % (k, i)) for k, i in conjunto_down: landa[k, i] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="Landa_%s_%s" % (k, i))
Programación del problema. 54 54 Figura 37. Declaración de las variables continuas 𝑐𝑘,𝑖 𝑎. La variable del modelo 𝑐𝑘,𝑖,𝑘∈𝐾𝑈,𝑖∈𝑆𝑈 𝑜 𝑘∈𝐾𝐷,𝑖∈𝑆𝐷, que cuantifica el número de pasajeros que viajan dentro de un servicio, cuando pasa por un andén concreto, se declara como se muestra: Figura 38. Declaración de las variables continuas 𝑐𝑘,𝑖. La cantidad de pasajeros que no pueden subir al metro en un andén para poder llegar a un destino, cuando pasa un servicio concreto, se cuantifica con la siguiente variable 𝑤𝑘,𝑖,𝑗 𝑟,𝑖,𝑗∈ 𝑆𝑈,𝑖<𝑗 ,𝑘∈𝐾𝑈 ∪ 𝑖,𝑗∈𝑆𝐷,𝑖<𝑗,𝑘∈𝐾𝐷, declarada mediante un diccionario recorrido con tres índices empleando bucles anidados: el servicio, la plataforma origen y la plataforma destino. bajan = {} for k, i in conjunto_up: bajan[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="ca_%s_%s" % (k, i)) for k, i in conjunto_down: bajan[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="ca_%s_%s" % (k, i)) dentro = {} for k, i in conjunto_up: dentro[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="c_%s_%s" % (k, i)) for k, i in conjunto_down: dentro[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="c_%s_%s" % (k, i))
55 Figura 39. Declaración de las variables 𝑤𝑘,𝑖,𝑗 𝑟. La variable binaria 𝑧𝑘,𝑖 𝑡,𝑘∈𝐾𝑈,𝑖∈𝑆𝑈,𝑡∈𝑇 𝑜 𝑘∈𝐾𝐷,𝑖∈𝑆𝐷,𝑡∈𝑇, que registra si un tren sale de un andén en un instante concreto, se declara mediante un diccionario recorrido por bucles anidados para referenciar al servicio, plataforma e instante de tiempo concreto que se declara. Figura 40. Declaración de las variables 𝑧𝑘,𝑖 𝑡. La declaración de la variable binaria que indica si un servicio sirve a dos andenes concretos de la línea, 𝜗𝑖,𝑗 𝑘 𝑖,𝑗∈𝑆𝑈,𝑖<𝑗 ∪ 𝑖,𝑗∈𝑆𝐷,𝑖<𝑗, se programa mediante un diccionario que, empleando bucles anidados, es recorrido con tres índices: servicio, plataforma origen y plataforma destino. residuo = {} for k, i in conjunto_up: for j in estaciones_up: if j > i: residuo[k, i, j] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="wr_%s_%s_%s" %(k, i, j)) for k, i in conjunto_down: for j in estaciones_down: if j > i: residuo[k, i, j] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="wr_%s_%s_%s" % (k, i, j)) z = {} for ind, t in enumerate(tiempo): for k, i in conjunto_up: z[k, i, ind] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="z_%s_%s_%s" % (k, i, t)) for k, i in conjunto_down: z[k, i, ind] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="z_%s_%s_%s" % (k, i, t))
Programación del problema. 56 56 Figura 41. Declaración de las variables continuas 𝜗𝑖,𝑗 𝑘. La variable continua 𝑏𝑘,𝑖 𝑡,𝑘∈𝐾𝑈,𝑖∈𝑆𝑈,𝑡∈𝑇 𝑜 𝑘∈𝐾𝐷,𝑖∈𝑆𝐷,𝑡∈𝑇, de activación del escalón de 𝑧𝑘,𝑖 𝑡 con respecto al servicio anterior, se programa mediante un diccionario con tres índices, recorrido mediante bucles anidados para referenciar al servicio, plataforma e instante de tiempo concreto. Figura 42. Declaración de las variables continuas 𝑏𝑘,𝑖 𝑡. Las declaraciones de las variables auxiliares continuas 𝑥𝑘,𝑖 𝑈, 𝑦𝑘,𝑖 𝑈 𝑝𝑎𝑟𝑎 𝑘∈𝐾𝑈,𝑖∈𝑆𝑈 , e 𝑦𝑘,𝑖 𝐷 ,𝑥𝑘,𝑖 𝐷 𝑝𝑎𝑟𝑎 𝑘∈𝐾𝐷,𝑖∈𝑆𝐷 se programan con un diccionario de dos índices recorridos por bucles anidados, para los servicios y plataformas de la línea, como se muestran: ji = {} for k, i in conjunto_up: for j in estaciones_up: if j > i: ji[k, i, j] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="ji_%s_%s_%s" % (k, i, j)) for k, i in conjunto_down: for j in estaciones_down: if j > i: ji[k, i, j] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="ji_%s_%s_%s" % (k, i, j)) b = {} for ind, t in enumerate(tiempo): for k, i in conjunto_up: b[k, i, ind] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.CONTINUOUS, name="b_%s_%s_%s" % (k, i, t)) for k, i in conjunto_down: b[k, i, ind] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.CONTINUOUS, name="b_%s_%s_%s" % (k, i, t))
57 Figura 43. Declaración de las variables continuas 𝑥𝑘,𝑖 𝑈,𝑦𝑘,𝑖 𝑈 Figura 44. Declaración de las variables continuas 𝑥𝑘,𝑖 𝐷, 𝑦𝑘,𝑖 𝐷. Las variables continuas 𝑝𝑜𝑟𝑐𝑘,𝑖,𝑗 𝑈,𝑖,𝑗∈𝑆𝑈,𝑖<𝑗 ,𝑘∈𝐾𝑈 y 𝑝𝑜𝑟𝑐𝑘,𝑖,𝑗 𝐷, 𝑖,𝑗∈𝑆𝐷,𝑖<𝑗, 𝑘∈𝐾𝐷, usadas para la estimación de pasajeros que embarcan en el modelo B, se programan como se muestran, mediante la creación de diccionarios recorridos, utilizando bucles anidados, con tres índices que indican el servicio, la plataforma origen y la plataforma destino, para ambas direcciones y variables. Sus límites superiores no sobrepasan la unidad. xu = {} yu = {} for k, i in conjunto_up: xu[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='x_%s_%s' % (k, i)) yu[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='y_%s_%s' % (k, i)) xd={} yd={} for k, i in conjunto_down: xd[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='x_%s_%s' % (k, i)) yd[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='y_%s_%s' % (k, i))
Programación del problema. 58 58 Figura 45. Declaración de las variables continuas 𝑝𝑜𝑟𝑐𝑘,𝑖,𝑗 𝑈, 𝑝𝑜𝑟𝑐𝑘,𝑖,𝑗 𝐷. El código completo de las declaraciones de cada una de las variables mostradas anteriormente se detalla en el ANEXO I. 5.4 Restricciones. Los pares de restricciones de zonas de operaciones (1.1), (1.2) y (1.3), (1.4) se programan en el modelo como se adjunta, controlando las variables λ𝑘,𝑖, 𝜏𝑘 para los conjuntos 𝑖∈𝑆𝑈,𝑘∈ 𝐾𝑈 y 𝑖∈𝑆𝐷,𝑘∈𝐾𝐷: Figura 46. Declaración de las restricciones (1.1) y (1.2) porcentaje_u={} porcentaje_down={} for i in estaciones_up[0:len(estaciones_up)-1]: for k in servicios_up: for j in estaciones_up: if j > i: porcentaje_u[k, i, j]=tr.addVar(lb=0.0, ub=1.0, vtype=GRB.CONTINUOUS, name="porcentaje_u_%s_%s_%s"%(k, i, j)) for i in estaciones_down[0:len(estaciones_down)-1]: for k in servicios_down: for j in estaciones_down: if j > i: porcentaje_down[k, i, j] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.CONTINUOUS, name="porcentaje_down_%s_%s_%s" % (k, i, j)) for k, i in conjunto_up: tr.addConstr(landa[k, i] <= servactiv[k], name="Restriccion_1_%s_%s_ZO" % (k, i)) for k, i in conjunto_down: tr.addConstr(landa[k, i] <= servactiv[k], name="Restriccion_1_%s_%s_ZO" % (k, i))
59 Figura 47. Declaración de las restricciones (2.1) y (2.2) Los pares de restricciones de llegadas y salidas que controlan las variables 𝑒𝑖,𝑑𝑘,𝑖 𝑦 𝑎𝑘,𝑖 para los conjuntos 𝑖∈𝑆𝑈,𝑘∈𝐾𝑈 y 𝑖∈𝑆𝐷,𝑘∈𝐾𝐷, empleando una acotación establecida para el dwell time, (3.1), (3.2), (3.3), (3,4) y (4.1), (4.2), se codifican como se muestra: Figura 48. Declaración de las restricciones (3.1) y (3.2). Figura 49. Declaración de las restricciones (3.3) y (3.4). for k, i in conjunto_up: if k < num_servicios_up-1: tr.addConstr(landa[k, i] + landa[k+1, i] >= 1, name="Restriccion_2_%s_%s_ZO" % (k, i)) for k, i in conjunto_down: if k < 2*num_servicios_up-1: tr.addConstr(landa[k, i] + landa[k+1, i] >= 1, name="Restriccion_2_%s_%s_ZO" % (k, i)) for k, i in conjunto_up: tr.addConstr(e[k, i] <= landa[k, i]*emax, name="Restriccion3_%s_%s_LyS" % (k, i)) for k, i in conjunto_down: tr.addConstr(e[k, i] <= landa[k, i]*emax, name="Restriccion3_%s_%s_LyS" % (k, i)) for k, i in conjunto_up: tr.addConstr(e[k, i] >= emin*landa[k, i], name="(2)Restriccion4_%s_%s_LyS" % (k, i)) for k, i in conjunto_down: tr.addConstr(e[k, i] >= emin * landa[k, i], name="(2)Restriccion4_%s_%s_LyS_acota_e" % (k, i))
Programación del problema. 60 60 Figura 50. Declaración de las restricciones (4.1) y (4.2) Los pares de restricciones (6.1), (6.2) y (7.1), (7.2) que permiten configurar la variable headway, ℎ𝑘−1,𝑘,𝑘−1,𝑘 ∈𝐾𝑈 y ℎ𝑘−1,𝑘,𝑘−1,𝑘 ∈𝐾𝐷 en el problema con sus valores mínimos y máximos permitidos para los pares de servicios consecutivos, se programan como se ilustra: Figura 51. Declaración de las restricciones (6.1) y (6.2) Figura 52. Declaración de las restricciones (7.1) y (7.2) for k, i in conjunto_up: tr.addConstr(departure[k, i]-arrive[k, i] == e[k, i], name="Restriccion4_%s_%s_LyS" % (k, i)) for k, i in conjunto_down: tr.addConstr(departure[k, i]-arrive[k, i] == e[k, i], name="Restriccion4_%s_%s_LyS_acota_e" % (k, i)) for k in servicios_up: if k > 0: tr.addConstr(hmin * servactiv[k] <= h[k-1, k], name="Restriccion6(1)_%s_H" % k) tr.addConstr(hmax * servactiv[k] >= h[k - 1, k], name="Restriccion6(2)_%s_H" % k) for k in servicios_down: if k > num_servicios_up: tr.addConstr(hmin * servactiv[k] <= h[k-1, k], name="Restriccion6(1)_%s_H" % k) tr.addConstr(hmax * servactiv[k] >= h[k - 1, k], name="Restriccion6(2)_%s_H" % k) for k, i in conjunto_up: if k > 0: tr.addConstr(departure[k, i] == departure[k-1, i]+h[k-1, k], name="Restriccion7_%s_%s_H" % (k, i)) for k, i in conjunto_down: if k > num_servicios_up: tr.addConstr(departure[k, i] == departure[k-1, i]+h[k-1, k], name="Restriccion7_%s_%s_H" % (k, i))
61 Las ecuaciones (8.1.1), (8.1.2), (8.2.1) y (8.2.2), que permiten y restringen los giros de los trenes en las estaciones terminales, al finalizar un servicio concreto, se modelan en el código como se ilustra: Figura 53. Declaración de las restricciones (8.1.1), (8.1.2), (8.2.1) y (8.2.2). El comportamiento asociado al material rodante, su salida y entrada de los depósitos, conservación en los mismos y su empleo para satisfacer los distintos servicios, se consigue mediante las restricciones (9.1), (9.2), (10.1), (10.2), (11.1), (11.2), (12.1), (12.2), (13), (14.1) y (14.2), que se programan como sigue: Figura 54. Declaración de las restricciones (9.1) y (9.2). for k in servicios_up: for l in servicios_down: tr.addConstr(tgiromin + M * (giroconfirmado[k, l] - 1) <= -departure[k, len(estaciones_up) - 1] + arrive[l, len(estaciones_up)], name="Restriccion8(min_1)_%s_%s_H" % (k, l)) tr.addConstr(tgiromax - M * (giroconfirmado[k, l] - 1) >= -departure[k, len(estaciones_up) - 1] + arrive[l, len(estaciones_up)], name="Restriccion8(max_1)_%s_%s_H" % (k, l)) for l in servicios_down: for k in servicios_up: tr.addConstr(tgiromin + M * (giroconfirmado[l, k] - 1) <= -departure[l, 2*len(estaciones_up) - 1] + arrive[k, 0], name="Restriccion8(min_2)_%s_%s_H" % (l, k)) tr.addConstr(tgiromax - M * (giroconfirmado[l, k] - 1) >= -departure[l, 2*len(estaciones_up) - 1] + arrive[k, 0], name="Restriccion8(max_2)_%s_%s_H" % (l, k)) for k in servicios_up: tr.addConstr(quicksum(giroconfirmado[l, k] for l in servicios_down) + tren_de_depot[k] == servactiv[k], name="Restriccion9_%s_MR" % k) for k in servicios_down: tr.addConstr(quicksum(giroconfirmado[l, k] for l in servicios_up) + tren_de_depot[k] == servactiv[k],name="Restriccion9_%s_MR" % k)
Programación del problema. 62 62 Figura 55. Declaración de las restricciones (10.1) y (10.2). Figura 56. Declaración de las restricciones (11.1) y (11.2) Figura 57. Declaración de las restricciones (12.1) y (12.2) Figura 58. Declaración de las restricciones (13), (14.1) y (14.2) Las restricciones (15.1) y (15.2) de demanda asociadas al número de pasajeros que esperan en un andén concreto se modelan como se indica: for k in servicios_up: tr.addConstr(quicksum(giroconfirmado[k, l] for l in servicios_down) + tren_a_depot[k] == servactiv[k], name="Restriccion10_%s_MR" % k) for k in servicios_down: tr.addConstr(quicksum(giroconfirmado[k, l] for l in servicios_up) + tren_a_depot[k] == servactiv[k], name="Restriccion10_%s_MR" % k) tr.addConstr(RS1_i >= quicksum(tren_de_depot[k] for k in servicios_up), name="Restriccion11(1)_MR") tr.addConstr(RS2_i >= quicksum(tren_de_depot[k] for k in servicios_down), name="Restriccion11(2)_MR") tr.addConstr(RS1_f == RS1_i + quicksum(tren_a_depot[k] for k in servicios_down) - quicksum(tren_de_depot[k] for k in servicios_up), name="Restriccion12(1)_MR") tr.addConstr(RS2_f == RS2_i + quicksum(tren_a_depot[k] for k in servicios_up) - quicksum(tren_de_depot[k] for k in servicios_down), name="Restriccion12(2)_MR") tr.addConstr(RS1_i+RS2_i <= RS, name="Restriccion13_MR") tr.addConstr(RS1_f == RS1_i, name="Restriccion14(1)_MR") tr.addConstr(RS2_f == RS2_i, name="Restriccion14(2)_MR")
63 Figura 59. Declaración de las restricciones (15.1) y (15.2) El número total de pasajeros potenciales para embarcar se modela mediante las restricciones (16.1) y (16.2) codificadas, como se muestra: Figura 60. Declaración de las restricciones (16.1) y (16.2) El número total de pasajeros que embarcan, definido mediante las restricciones (17.1) y (17.2), se formula como sigue: Figura 61. Declaración de las restricciones (17.1) y (17.2) Las restricciones lineales (18.1.1), (18.1.2), (18.2.1) y (18.2.2), que permiten establecer los momentos de salida de los servicios en los andenes se modelan como se muestra en las ilustraciones: for k, i in conjunto_up: tr.addConstr(total_esperando[k, i] == quicksum(esperando[k, i, j] for j in estaciones_up if j > i), name="Restriccion15_%s_%s_DE" % (k, i)) for k, i in conjunto_down: tr.addConstr(total_esperando[k, i] == quicksum(esperando[k, i, j] for j in estaciones_down if j > i), name="Restriccion15_%s_%s_DE" % (k, i) for k, i in conjunto_up: tr.addConstr(total_pot_embarcan[k, i] == quicksum(pot_embarcan[k, i, j] for j in estaciones_up if j > i), name="Restriccion16_%s_%s_DE" % (k, i)) for k, i in conjunto_down: tr.addConstr(total_pot_embarcan[k, i] == quicksum(pot_embarcan[k, i, j] for j in estaciones_down if j > i),name="Restriccion16_%s_%s_DE" % (k, i)) for k, i in conjunto_up: tr.addConstr(total_embarcan[k, i] == quicksum(embarcan[k, i, j] for j in estaciones_up if j > i), name="Restriccion17_%s_%s_DE" % (k, i)) for k, i in conjunto_down: tr.addConstr(total_embarcan[k, i] == quicksum(embarcan[k, i, j] for j in estaciones_down if j > i), name="Restriccion17_%s_%s_DE" % (k, i))
Programación del problema. 70 70 Figura 74. Declaración de las restricciones (23.A.1) (II). Figura 75. Declaración de las restricciones (23.A.2) (I). Figura 76. Declaración de las restricciones (23.A.2) (II) B) Las restricciones (23.B.1), (23.B.2), (23.B.3) y (23.B.4) se introducen en nuestro código como se muestran: for i in estaciones_up: for j in estaciones_up: if j > i: prop_dem[i, j] = float(numerador[i, j] / denom[i]) for k in servicios_up: tr.addConstr(embarcan[k, i, j] == prop_dem[i, j] * total_embarcan[k, i], name="Restriccion23_2_%s_%s_%s_DE" % (k, i, j)) for i in estaciones_down: denom[i] = 0.0 for j in estaciones_down: if j > i: numerador[i, j] = 0.00 prop_dem[i, j] = 0.00 for ind, t in enumerate(tiempo): denom[i] = denom[i]+(demanda[i, j][ind-1]) numerador[i, j] = numerador[i, j]+(demanda[i, j][ind-1]) for i in estaciones_down: for j in estaciones_down: if j > i: prop_dem[i, j] = float(numerador[i, j] / denom[i]) for k in servicios_down: tr.addConstr(embarcan[k, i, j] == prop_dem[i, j] * total_embarcan[k, i], name="Restriccion23_2_%s_%s_%s_DE" % (k, i, j))
71 Figura 77. Declaración de las restricciones (23.B.1) y (23.B.2) Figura 78. Declaración de las restricciones (23.B.3) y (23.B.4). Las ecuaciones (24.1.1) y (24.1.2) que controlan la cantidad de pasajeros que no pueden embarcar en los servicios y por ello permanecen en las plataformas, se modelan como se ilustra: for i in estaciones_up[0:len(estaciones_up)-1]: for k in servicios_up: tr.addConstr(quicksum(porcentaje_u[k, i,j] for j in estaciones_up if j> i)==1, name="Sumaporcentajes_u_%s_%s" %(k, i)) for i in estaciones_down[0:len(estaciones_down)-1]: for k in servicios_down: tr.addConstr(quicksum(porcentaje_down[k, i, j] for j in estaciones_down if j > i) == 1, name="Sumaporcentajes_down_%s_%s" % (k, i)) for i in estaciones_up[0:len(estaciones_up)-1]: for j in estaciones_up: if j > i: for k in servicios_up: tr.addConstr(embarcan[k, i, j] == porcentaje_u[k, i, j] * total_embarcan[k, i], name="(3)Restriccion23_2_%s_%s_%s_DE" % (k, i, j)) for i in estaciones_down[0:len(estaciones_down)-1]: for j in estaciones_down: if j > i: for k in servicios_down: tr.addConstr(embarcan[k, i, j] == porcentaje_down[k, i, j] * total_embarcan[k, i], name="(3)Restriccion23_2_%s_%s_%s_DE" % (k, i, j))
Programación del problema. 72 72 Figura 79. Declaración de las restricciones (24.1.1) y (24.1.2) El código completo de las declaraciones de cada una de las restricciones mostradas anteriormente se detalla en el ANEXO I. 5.5 Función objetivo. Para la integración de la función objetivo se definen una serie de conceptos que se emplean como son: los últimos servicios para cada dirección, el ultimo instante de tiempo y las ponderaciones que se agregaran a cada una de las ecuaciones que se integran. Figura 80. Definiciones y pesos para integrar la función objetivo. La codificación de la función objetivo (25.6) constituida por la integración de las ecuaciones (25.1), (25.2), (25.3), (25.4) y (25.5) se elabora como se muestra a continuación: for k, i in conjunto_up: for j in estaciones_up: if j > i: tr.addConstr(residuo[k, i, j] == esperando[k, i, j]-embarcan[k, i, j], name="Restriccion24_%s_%s_%s_DE" % (k, i, j)) for k, i in conjunto_down: for j in estaciones_down: if j > i: tr.addConstr(residuo[k, i, j] == esperando[k, i, j] - embarcan[k, i, j], name="Restriccion24_%s_%s_%s_DE" % (k, i, j)) aa=servicios_up[-1] bb=servicios_down[-1] cc=tiempo[-1] gamma=10.0 pesos_up = {i:(len(estaciones_up)-i)**3 for i in estaciones_up} pesos_down = {i:(len(estaciones_up)-o)**3 for o,i in enumerate(estaciones_down)}
73 Figura 81. Declaración de la función objetivo (25.6) mediante la integración de las ecuaciones (25.1) - (25.5). El código de la integración de la función objetivo se detalla en el ANEXO I. tr.setObjective(quicksum(((esperando[k, i, j])*(departure[k, i]-departure[k-1,i])/2 for (i, j, k) in setup) + quicksum(((esperando[k, i, j])*(departure[k, i]-departure[k-1, i])/2) for (i, j, k) in setdw)+ quicksum(esperando[0,i,j]*departure[0,i] for i in estaciones_up for j in estaciones_up if i<j)+ quicksum(esperando[len(servicios_up),i,j]*departure[len(servicios_up),i] for i in estaciones_down for j in estaciones_down if i<j)+ gamma*quicksum(residuo[aa,i,j]*(cc-departure[aa, i])/2 for i in estaciones_up for j in estaciones_up if j > i)+ gamma*quicksum(residuo[bb,i,j]*(cc-departure[bb, i])/2 for i in estaciones_down for j in estaciones_down if j > i)+ gamma*quicksum(demanda[i, j][ind - 1] * z[aa, i, ind] / 2 for i in estaciones_up for j in estaciones_up if j > i for ind, t in enumerate(tiempo)) + gamma*quicksum(demanda[i, j][ind - 1] * z[bb, i, ind] / 2 for i in estaciones_down for j in estaciones_down if j > i for ind, t in enumerate(tiempo)) -gamma*quicksum(pesos_up[i]*total_embarcan[k,i] for k in servicios_up for i in estaciones_up)- gamma*quicksum(pesos_down[i]*total_embarcan[k,i] for k in servicios_down for i in estaciones_down)+ gamma * (quicksum(tren_a_depot[k] for k in servicios_up) + quicksum(tren_a_depot[k] for k in servicios_down))+ gamma * (quicksum(tren_de_depot[k] for k in servicios_up) +quicksum(tren_de_depot[k] for k in servicios_down)))
Pruebas computacionales. 74 74 6 PRUEBAS COMPUTACIONALES. 6.1 Experimentos iniciales. Para analizar y visualizar el desempeño los modelos construidos, A y B, y evaluar los resultados que nos ofrecen sus resoluciones, se proponen distintos experimentos iniciales realizados con escenarios de datos que presentan variaciones en la recogida de la demanda de pasajeros, con el fin de realizar futuros experimentos más precisos con aquellas combinaciones de escenarios y modelos que presenten resultados más favorables. Figura 82. Datos escenarios iniciales I. Los datos respectivos a las características de la línea, número de servicios máximos a realizar para cada dirección a lo largo del horizonte de planificación del horario, la velocidad de los trenes, y las distancias entre plataformas se representan en la Figura 82, siendo comunes para todos los experimentos que se realizan en esta sección, mostrados con la interfaz que se muestra en el fichero Excel en el que se presenta el escenario de datos. Se establece una serie de datos comunes para las zonas de operaciones (número de estaciones), el horario (límites para dwell times, duración de los desplazamientos entre plataformas y límites para headways) y el material rodante (número de trenes disponibles para realizar los servicios y tamaño de los trenes), que se muestran a continuación: DATOS DE LA LÍNEA NÚMERO DE SERVICIOS PARA UPSTREAM 10 PARA DOWNSTREAM 10 VELOCIDAD 60 km/h = 1000 m/min 0 1 2 3 01200 2500 4000 01300 2800 01500 4 5 6 7 01500 2800 4000 01300 2500 01200 Plataformas U LONGITUDES(m) Plataformas D LONGITUDES(m)
75 Figura 83. Datos escenarios iniciales II. Los datos correspondientes a la demanda se reúnen en forma de matrices de plataformas de origenes y destinos, variable con el tiempo, con un horizonte temporal de una hora de servicio. Figura 84. Ejemplo matriz O-D ajustada fraccionada cada 1 minuto. Figuras 85.1 y 84.2. Ejemplo matriz O-D ajustada fraccionada cada 2 minutos y cada 4 minutos. DATOS DE ZONA DE OPERACIONES Numero de estaciones: 4 DATOS DEL HORARIO DWELLING TIMES minutos emin 0,5 emax 2,8 TIEMPO DE OPERACIÓN i-1 i minutos 1 2 1,2 1 3 2,5 1 4 4 2 3 1,3 2 4 2,8 3 4 1,5 5 6 1,2 5 7 2,5 5 8 4 6 7 1,3 6 8 2,8 7 8 1,5 HEADWAY minutos hmax 30 hmin 4 TIEMPOS DE GIRO minutos 3,5 2 DATOS DEL MATERIAL RODANTE Nº. TRENES DISPONIBLES RS 16 trenes CAPACIDAD DEL TREN C600 pasajeros S(U) S(D) 0 1 2 3 4 9:00 9:01 9:02 9:03 9:04 0,1 21 22 819 5 0,2 24 13 20 615 0,3 20 19 15 11 7 1,2 21 19 21 6 7 1,3 14 15 16 18 20 2,3 17 11 18 5 6 9:00 9:01 9:02 9:03 9:04 4,5 10 16 15 16 9 4,6 16 21 614 12 4,7 21 22 15 15 17 5,6 14 21 7 9 24 5,7 16 24 24 19 22 6,7 23 23 19 15 21 MATRIZ OD(t) UP DW Instantes de tiempo 0 1 2 9:00 9:02 9:04 0,1 21 30 24 0,2 24 33 21 0,3 20 34 18 1,2 21 40 13 1,3 14 31 38 2,3 17 29 11 9:00 9:02 9:04 4,5 10 31 25 4,6 16 27 26 4,7 21 37 32 5,6 14 28 33 5,7 16 48 41 6,7 23 42 36 MATRIZ OD(t) DW Instantes de tiempo UP 0 1 9:00 9:04 0,1 21 54 0,2 24 54 0,3 20 52 1,2 21 53 1,3 14 69 2,3 17 40 9:00 9:02 4,5 10 56 4,6 16 53 4,7 21 69 5,6 14 61 5,7 16 89 6,7 23 78 MATRIZ OD(t) UP DW Instantes de tiempo
Pruebas computacionales. 76 76 Originalmente, se propone una matriz de demanda fraccionada de minuto en minuto para cuantificar el número de pasajeros que llegan (Figura 84). Dado que este escenario de datos propuesto es muy preciso y su resolución más costosa, se proponen escenarios con matrices de demandas más reducidas fraccionadas en intervalos de 2 y 4 minutos, que agilicen la resolución del problema y el análisis de los primeros resultados, manteniendo las mismas proporciones temporales de pasajeros establecidas en la primera matriz, es decir, las matrices agregadas sumarían los datos de demanda para varios períodos. Por ejemplo, los pasajeros que a las 9:01 y 9:02 quieren ir desde la plataforma 0 a 3 se contabilizan en 19 y 15 (Figura 84); sin embargo, en la matriz fraccionada cada 2 minutos (Figura 85.1), se contabilizan 34 a las 9:02, sumándose los valores registrados a las 9:01 y 9:02 en la primera matriz. Lo mismo sucedería en la matriz fraccionada cada 4 minutos (Figura 85.2). Posteriormente, con el fin de ampliar el número de escenarios iniciales y evaluar la efectividad y adaptación de la línea a la demanda de viajeros, se propone ampliar las matrices anteriores con unos instantes iniciales y finales en los que no se contabilizan pasajeros, simulando la posible anticipación de los trenes a la apertura de los accesos a los servicios, al comienzo del horario de servicio, y al cierre de los accesos, al final del horizonte temporal de dicho horario. Siendo la duración del horario de servicio (82 minutos, contando con 7 minutos iniciales y 15 finales de recogida nula de pasajeros) mayor que el horizonte temporal de recogida de datos (1 hora). Figura 86. Ejemplo de ampliación de la matriz O-D fraccionada cada 1 minuto. Figura 87. Ejemplo de ampliación de la matriz O-D fraccionada cada 2 minutos. 012345678 8:53 8:54 8:55 8:56 8:57 8:58 8:59 9:00 9:01 0,1 000000021 22 0,2 000000024 13 0,3 000000020 19 1,2 000000021 19 1,3 000000014 15 2,3 000000017 11 8:53 8:54 8:55 8:56 8:57 8:58 8:59 9:00 9:01 4,5 000000010 16 4,6 000000016 21 4,7 000000021 22 5,6 000000014 21 5,7 000000016 24 6,7 000000023 23 Instantes de tiempo UP DW 01234 8:53 8:55 8:57 8:59 9:01 0,1 0 0 0 0 43 0,2 0 0 0 0 37 0,3 0 0 0 0 39 1,2 0 0 0 0 40 1,3 0 0 0 0 29 2,3 0 0 0 0 28 8:53 8:55 8:57 8:59 9:01 4,5 0 0 0 0 26 4,6 0 0 0 0 37 4,7 0 0 0 0 43 5,6 0 0 0 0 35 5,7 0 0 0 0 40 6,7 0 0 0 0 46 MATRIZ OD(t) Instantes de tiempo UP DW
77 Figura 88. Ejemplo de ampliación de la matriz O-D fraccionada cada 4 minutos. En las matrices agregadas, representadas en la la Figura 87 y en la Figura 88, se repite la suma de registros para varios periodos de la matriz original (Figura 86). 6.1.1 Experimentos iniciales con matrices O-D(t) de demanda fraccionada cada 4 minutos. 6.1.1.1 Escenarios con matrices demanda ajustada. La demanda de viajeros presenta las curvas para ambas direcciones de la línea que se ilustran a continuación, basadas en las matrices detalladas en el ANEXO II para los presentes escenarios que se analizan en la sección: Figura 89. Demanda de pasajeros O-D upstream ajustada y fraccionada cada 4 min. 0 1 2 8:53 8:57 9:01 0,1 0 0 43 0,2 0 0 37 0,3 0 0 39 1,2 0 0 40 1,3 0 0 29 2,3 0 0 28 8:53 8:57 9:01 4,5 0 0 26 4,6 0 0 37 4,7 0 0 43 5,6 0 0 35 5,7 0 0 40 6,7 0 0 46 MATRIZ OD(t) DW Instantes de tiempo UP
Pruebas computacionales. 78 78 Figura 90. Demanda de pasajeros O-D downstream ajustada y fraccionada cada 4 min. Figura 91. Demanda media de pasajeros O-D ajustada y fraccionada cada 4 min. Los datos de demanda representados en las Figuras 89 y 90 para cada par de plataformas origen y destino, ofrecen el comportamiento medio de la demanda de cada dirección, mostrado en la Figura 91. Resultados de experimento 1: Modelo A, escenario inicial con matriz de demanda ajustada fraccionada cada 4 minutos. Se propone agrupar los resultados de flujos de pasajeros en dos grupos para visualizar y analizarlos de una manera más clara y limpia: los flujos de viajeros en los volúmenes de control de los trenes y los flujos de viajeros en los volúmenes de control de las plataformas.
79 Figura 92. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (1) Figura 93. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (1) En las Figuras 92 y 93 se representan los resultados de los flujos de pasajeros en los volúmenes de control constituidos por los trenes, exponiendo los resultados de los viajeros que bajan de estos, los que embarcan y los que viajan dentro, en cada servicio y plataforma upstream y downstream.
Pruebas computacionales. 86 86 servicios. Tabla 6. Movimientos de los servicios downstream en su recorrido por la línea. (2) Figura 105. Abastecimiento espacio – temporal de la línea por los servicios. (2) Los movimientos de llegadas y salidas, y giros de los servicios upstream y downstream en las plataformas, expuestos en las Tablas 5 y 6, se representan gráficamente como se muestra en la Figura 105. Figura 106. Headways (minutos) entre servicios consecutivos. (2) Se representan los headways entre los pares de servicios consecutivos que recorren la línea en LONGITUD (M) 4000 3,5 11,5 18 21,2 27,5 29,2 35,5 39,5 42 47,5 4000 412 20 24 28 32 36 40 44 48 2500 5,2 13,2 21,2 25,2 29,2 33,2 37,2 41,2 45,2 49,2 2500 816 24 28 32 36 40 44 48 52 1200 9,3 17,3 25,3 29,3 33,3 37,3 41,3 45,3 49,3 53,3 1200 12 20 28 32 36 40 44 48 52 56 013,5 21,5 29,5 33,5 37,5 41,5 45,5 49,5 53,5 57,5 016 24 32 36 40 44 48 52 56 60 019,5 26 34 38 43,5 46 48 52 56 60 SERVICIOS 10 11 12 13 14 15 16 17 18 19 MOVIMIENTOS (MIN)
87 la Figura 106, predominando el paso de trenes cada 4 minutos. En cuanto al empleo de material rodante, se obtiene el mismo resultado que en el escenario anterior, un total de 12 giros mostrados con detalle en el ANEXO IV. 6.1.1.2 Escenarios con matrices de demanda ampliada. Ampliando los datos de demanda de pasajeros de los escenarios anteriores, para considerar la anticipación y el cierre de los accesos a los servicios, se obtienen los curvas de demanda que se muestran: Figura 107. Demanda de pasajeros entre plataformas O-D upstream, ampliada y fraccionada cada 4 min. Figura 108. Demanda de pasajeros entre plataformas O-D downstream, ampliada y fraccionada cada 4 min.
Pruebas computacionales. 88 88 Figura 109. Demanda media de pasajeros entre plataformas O-D, ampliada y fraccionada cada 4 min. En la Figura 107, se expone el comportamiento ofrecido por los datos recogidos en la matriz de origen y destino en la dirección upstream de la línea, mientras que, en la Figura 108, se muestra el comportamiento de la dirección downstream. Se aprecia la similitud entre ambas distribuciones, representada de manera más limpia mediante el resultado medio de cada dirección en la Figura 109. Las matrices de demanda de pasajeros en que se basan dichas distribuciones, mostradas gráficamente, se detallan en el ANEXO V. Resultados de experimento 3. Modelo A, escenario inicial con matriz de demanda ampliada fraccionada cada 4 minutos. Los resultados obtenidos correspondientes a los flujos de pasajeros en los volúmenes de control constituidos por los trenes, se visualizan mediante gráficos de barras, como se muestra:
89 Figura 110. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (3) Figura 111. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (3) En las Figuras 110 y 111 se exponen los resultados de los pasajeros que bajan del tren, los que embarcan y los que viajan dentro del tren para cada servicio y plataforma. La recogida de resultados correspondientes a los flujos de pasajeros en los volúmenes de control constituidos por las plataformas, se visualizan también mediante gráficos de barras,
Pruebas computacionales. 90 90 como se muestra: Figura 112. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (3) Figura 113. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (3) En las Figura 112 y 113 se representan los resultados correspondientes a los pasajeros que esperan en las plataformas, los que realmente pueden embarcar, los que embarcan y los que permanecen en las plataformas por la limitación de tamaño de los trenes. Todos los resultados mostrados gráficamente sobre los comportamientos de los pasajeros en la línea se detallan en el ANEXO VI.
91 Tabla 7. Movimientos de los servicios upstream en su recorrido por la línea. (3) Figura 114. Dwell times medios (minutos) de los servicios upstream. (3) En la Tabla 7 se exponen los movimientos realizados por los servicios upstream a lo largo de la línea, con el mismo criterio de colores que en el escenario anterior. Se adjuntan en la Figura 114 los dwell times medios que ofrecen estos servicios. Tabla 8. Movimientos de los servicios downstream en su recorrido por la línea. (3) Figura 115. Dwell times medios (minutos) de los servicios downstream. (3) Los movimientos de los servicios downstream que recorren la línea se recogen de igual manera que para la dirección contraria en la Tabla 8, adjuntando, además, los dwell times medios LONGITUD (M) 4000 23,5 34 43,5 48 55,5 59,5 60 66 72 80 4000 20 32 40 48 52 56 60 64 72 80 4000 17,5 29,5 37,5 45,5 49,5 53,5 57,5 61,5 69,5 77,5 2500 16 28 36 44 48 52 56 60 68 76 2500 13,3 25,3 33,3 41,3 45,3 49,3 53,3 57,3 65,3 73,3 1200 12 24 32 40 44 48 52 56 64 72 1200 9,2 21,2 29,2 37,2 41,2 45,2 49,2 53,2 61,2 69,2 0820 28 36 40 44 48 52 60 68 08 17,2 26 33,2 38 43,5 47,5 51,5 59,5 67,5 SERVICIOS 0 1 2 3 4 5 6 7 8 9 MOVIMIENTOS (MIN) LONGITUD (M) 4000 11,5 23,5 29,2 34 37,2 43,5 47,5 55,5 59,5 66 4000 12 24 32 36 40 44 48 56 60 68 2500 13,2 25,2 33,2 37,2 41,2 45,2 49,2 57,2 61,2 69,2 2500 16 28 36 40 44 48 52 60 64 72 1200 17,3 29,3 37,3 41,3 45,3 49,3 53,3 61,3 65,3 73,3 1200 20 32 40 44 48 52 56 64 68 76 021,5 33,5 41,5 45,5 49,5 53,5 57,5 65,5 69,5 77,5 024 36 44 48 52 56 60 68 72 80 026 38 47,5 51,5 52 59,5 60 68 72 80 SERVICIOS 10 11 12 13 14 15 16 17 18 19 MOVIMIENTOS (MIN)
Pruebas computacionales. 92 92 proporcionados por dichos servicios (Figura 115). Figura 116. Abastecimiento espacio – temporal de la línea por los servicios. (3) Figura 117. Headways (minutos) entre servicios consecutivos. (3) Se representa gráficamente los movimientos expuestos en las Tablas 7 y 8, en la Figura 116, destacando la variación de los headways entre los pares de servicios consecutivos, cuya distribución se muestra en la Figura 117. En cuanto al empleo de material rodante, se realizan 11 giros entre servicios en las plataformas terminales. Los giros obtenidos se exponen con detalle en el ANEXO VI. Resultados de experimento 4. Modelo B, escenario inicial con matriz de demanda ampliada fraccionada cada 4 minutos. La recogida de resultados correspondiente al flujo de pasajeros en el volumen de control del tren, para ambas direcciones de la línea, se representan mediante gráficos de barras:
93 Figura 118. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (4) Figura 119. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (4) En las Figuras 118 y 119 se exponen los resultados de los pasajeros que bajan, que embarcan y viajan dentro de los trenes en cada servicio y plataforma, para ambas direcciones de la línea.
Pruebas computacionales. 94 94 Figura 120. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (4) Figura 121. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (4) En las Figuras 120 y 121 se recogen los resultados de los pasajeros que esperan, los que pueden embarcar y los que no, y los que acaban embarcando, para ambas direcciones de la línea. Los gráficos expuestos sobre los comportamiento de los pasajeros se basan en los resultados detallados en el ANEXO VII. Los movimientos realizados por los servicios upstream en cada plataforma se muestran, con el mismo patron de colores que en experimentos anteriores: - Amarillo: llegadas a las plataformas. - Rosa: salidas de las plataformas. - Azul: posibles giros tras salir de las últimas plataformas.
95 Tabla 9. Movimientos de los servicios upstream en su recorrido por la línea. (4) Figura 122. Dwell times (minutos) de los servicios upstream. (4) Los dwell times medios de cada servicio upstream son representados en la Figura 122. Los movimientos realizados por los servicios downstream a lo largo de la línea y del horizonte temporal de planificación se representan de igual manera, apoyándose en la relación establecida de colores. Tabla 10. Movimientos de los servicios downstream en su recorrido por la línea. (4) LONGITUD (M) 4000 23,5 34 42 51,5 52 59,5 60 66 72 80 4000 20 32 40 48 52 56 60 64 72 80 4000 17,5 29,5 37,5 45,5 49,5 53,5 57,5 61,5 69,5 77,5 2500 16 28 36 44 48 52 56 60 68 76 2500 13,3 25,3 33,3 41,3 45,3 49,3 53,3 57,3 65,3 73,3 1200 12 24 32 40 44 48 52 56 64 72 1200 9,2 21,2 29,2 37,2 41,2 45,2 49,2 53,2 61,2 69,2 0820 28 36 40 44 48 52 60 68 07,5 19,5 27,5 35,5 39,5 43,5 46 51,5 58 66 SERVICIOS 0 1 2 3 4 5 6 7 8 9 MOVIMIENTOS (MIN) LONGITUD (M) 4000 9,2 23,5 29,2 34 37,2 42 47,5 51,5 59,5 66 4000 12 24 32 36 40 44 48 52 60 68 2500 13,2 25,2 33,2 37,2 41,2 45,2 49,2 53,2 61,2 69,2 2500 16 28 36 40 44 48 52 56 64 72 1200 17,3 29,3 37,3 41,3 45,3 49,3 53,3 57,3 65,3 73,3 1200 20 32 40 44 48 52 56 60 68 76 021,5 33,5 41,5 45,5 49,5 53,5 57,5 61,5 69,5 77,5 024 36 44 48 52 56 60 64 72 80 027,5 39,5 46 51,5 52 58 60 66 72 80 SERVICIOS 10 11 12 13 14 15 16 17 18 19 MOVIMIENTOS (MIN)
Pruebas computacionales. 102 102 Figura 131. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (5) Figura 132. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (5) En las Figuras 131 y 132 se visualizan los resultados de los pasajeros que esperan, que pueden embarcar y los que no, y los que finalmente embarcan para cada par servicio-plataforma upstream y downstream. Los resultados representados sobre los comportamientos de los pasajeros se basan en las soluciones detalladas en ANEXO IX. Los movimientos realizados por los servicios upstream en sus recorridos por la línea, pasando por las plataformas que abastecen, se muestran con la misma relación de colores que en los
103 experimentos con matrices fraccionadas cada 4 minutos, realizados anteriormente. Tabla 16. Movimientos de los servicios upstream en su recorrido por la línea. (5) Figura 133. Dwell times (minutos) de los servicios upstream. (5) Los dwell times medio de cada servicio upstream se muestran en la Figura 133. Los movimientos realizados por los servicios downstream en cada plataforma durante sus recorridos por la línea, a lo largo del horizonte temporal de planificación, se exponen de igual manera, como sigue: Tabla 17. Movimientos de los servicios downstream en su recorrido por la línea. (5) LONGITUD (M) 4000 20 31,2 39,2 45,5 49,5 50 57,2 60 71,5 80 4000 18 28 36 42 46 50 54 60 68 80 4000 15,5 25,5 33,5 39,5 43,5 47,5 51,5 57,5 65,5 77,5 2500 14 24 32 38 42 46 50 56 64 76 2500 13,3 23,3 31,3 37,3 41,3 45,3 49,3 55,3 63,3 75,3 1200 12 22 30 36 40 44 48 54 62 74 1200 11,2 21,2 29,2 35,2 39,2 43,2 47,2 53,2 61,2 73,2 010 20 28 34 38 42 46 52 60 72 07,2 19,5 27,5 33,5 37,5 41,5 45,5 49,2 57,2 71,5 SERVICIOS 0 1 2 3 4 5 6 7 8 9 MOVIMIENTOS (MIN) LONGITUD (M) 4000 9,2 20 29,5 31,2 37,5 39,2 45,5 49,5 57,2 71,5 4000 12 22 30 34 38 42 46 52 60 72 2500 13,2 23,2 31,2 35,2 39,2 43,2 47,2 53,2 61,2 73,2 2500 16 26 34 38 42 46 50 56 64 76 1200 17,3 27,3 35,3 39,3 43,3 47,3 51,3 57,3 65,3 77,3 1200 18 28 36 40 44 48 52 58 66 78 019,5 29,5 37,5 41,5 45,5 49,5 53,5 59,5 67,5 79,5 020 30 38 42 46 50 54 60 68 80 020 33,5 41,5 45,5 49,2 50 57,2 60 71,5 80 SERVICIOS 10 11 12 13 14 15 16 17 18 19 MOVIMIENTOS (MIN)
Pruebas computacionales. 104 104 Figura 134. Dwell times (minutos) de los servicios downstream. (5) Los dwell times medios de los servicios downstream que recorren la línea se representan en la Figura 134, mediante un gráfico de barras. Figura 135. Abastecimiento espacio – temporal de la línea por los servicios. (5) Los movimientos de los servicios recogidos en las Tablas 16 y 17 se representan gráficamente en la Figura 135, en la que se aprecia la adaptación de los servicios a la demanda de pasajeros, ofreciendo una serie de valores de headways variables para cada par de servicios consecutivos, cuya distribucion se expone a continuación:
105 Figura 136. Headways (minutos) entre servicios consecutivos. (5) Se realizan 13 giros entre servicios de direcciones opuestas, en las estaciones terminales de la línea. Los giros producidos se muestran en detalle en el ANEXO IX. Resultados del experimento 6: Modelo B, escenario inicial con matriz de demanda ampliada y fraccionada cada 2 minutos. Figura 137. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (6)
Pruebas computacionales. 106 106 Figura 138. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (6) En las Figuras 137 y 138 se recogen los resultados de pasajeros que bajan de los trenes, que embarcan y que viajan dentro de estos, para cada servicio y plataforma de las direcciones upstream y downstream. Figura 139. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (6)
107 Figura 140. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (6) En las Figuras 139 y 140 se representan los resultados de pasajeros que esperan en las plataformas, que pueden embarcar y que no, y que logran embarcar. Los comportamientos de los pasajeros mostrados gráficamente en las figuras anteriores se basan en los resultados detallados en el ANEXO X. Tabla 18. Movimientos de los servicios upstream en su recorrido por la línea. (6) LONGITUD (M) 4000 12 27,5 37,5 43,2 44 50 59,5 62 71,5 80 4000 12 24 34 40 44 50 56 62 68 80 4000 11,5 23,5 33,5 39,5 43,5 49,5 55,5 61,5 67,5 79,5 2500 10 22 32 38 42 48 54 60 66 78 2500 9,3 21,3 31,3 37,3 41,3 47,3 53,3 59,3 65,3 77,3 1200 820 30 36 40 46 52 58 64 76 1200 7,2 19,2 29,2 35,2 39,2 45,2 51,2 57,2 63,2 75,2 0618 28 34 38 44 50 56 62 74 05,5 17,5 25,2 33,5 37,5 43,5 47,5 55,5 61,5 71,2 SERVICIOS 0 1 2 3 4 5 6 7 8 9 MOVIMIENTOS (MIN)
Pruebas computacionales. 108 108 Figura 141. Dwell times (minutos) de los servicios upstream. (6) Los movimientos registrados y efectuados por los servicios upstream que recorren la línea se exponen en la Tabla 18, siguiendo el mismo criterio de colores que en los escenarios anteriores. También se adjuntan los dwell times medios de los servicios upstream en la Figura 141. Tabla 19. Movimientos de los servicios downstream en su recorrido por la línea. (6) Figura 142. Dwell times (minutos) de los servicios downstream. (6) Los movimientos registrados y efectuados por los servicios downstream que recorren la línea se exponen, de igual manera, en la Tabla 19. También se adjuntan los resultados de dwell times medios de dichos servicios en la Figura 142. LONGITUD (M) 4000 11,2 21,2 27,5 31,2 37,5 39,2 43,2 49,2 59,5 71,5 4000 14 24 28 34 38 42 46 52 60 72 2500 15,2 25,2 29,2 35,2 39,2 43,2 47,2 53,2 61,2 73,2 2500 16 26 30 36 40 44 48 54 62 74 1200 17,3 27,3 31,3 37,3 41,3 45,3 49,3 55,3 63,3 75,3 1200 18 28 32 38 42 46 50 56 64 76 019,5 29,5 33,5 39,5 43,5 47,5 51,5 57,5 65,5 77,5 020 30 34 40 44 48 52 58 66 78 020 33,5 37,5 43,5 47,5 48 55,5 61,5 66 78 SERVICIOS 10 11 12 13 14 15 16 17 18 19 MOVIMIENTOS (MIN)
109 Los movimientos de los servicios que recorren la línea, expuestos en las Tablas 18 y 19 se visualizan a continuación, acompañados de la distribución de los resultados obtenidos de headways entre servicios consecutivos: Figura 143. Abastecimiento espacio – temporal de la línea por los servicios. (6) Figura 144. Headways (minutos) entre servicios consecutivos. (6) En cuanto al empleo de material rodante, se efectúan 11 giros, detallados en el ANEXO X. 6.1.2.2 Resúmenes y conclusiones de los experimentos analizados (5-6). De las soluciones mostradas anteriormente para cada uno de los experimentos analizados, se extraen una serie de resultados relevantes basados en los objetivos del proyecto como son el empleo de material rodante, la eficacia de viajes para los pasajeros, minimizando el tiempo de viaje, y la adaptación de los servicios a la demanda.
Pruebas computacionales. 110 110 Tabla 20. Resultados de los escenarios analizados. (I) Tabla 21. Resultados de los escenarios analizados (II) En la Tabla 20 se recogen los resultados relevantes que nos proporcionan los experimentos 5 y 6. Se hace especial mención al criterio de “Defecto de residuo” por su novedad, correspondiendo este, al defecto anteriormente descrito en el proyecto que hace referencia a la diferencia entre los pasajeros que embarcan a un tren y los que pueden embarcar, no contabilizando todos los embarques que se podrían realizar y acumulando viajeros en forma de residuo en las plataformas. Se eliminan aquellos aquellos criterios que ofrecen mismos resultados en ambos experimentos (Tabla 21), para una mejor comparación y evaluación de los desempeños de los modelos analizados. Se propone la realización de una matriz de decisión ponderada de la que se adjuntan tanto el sentido favorable de los criterios, como sus ponderaciones. Para su elaboración, se rellena con un 1 en el experimento cuyo resultado de un criterio sea mejor, y un 0 en el peor. Tabla 22. Sentidos favorables y ponderaciones de cada criterio. Experimentos (5-6). Solución / Experimento EXPERIMENTO 5 EXPERIMENTO 6 Solución / Experimento Número de giros total 13 11 Total esperan (pasajeros) 17977,76 17975,41 Total embarcan (pasajeros) 16015,00 16015,00 Residuo total (pasajeros) 1962,76 1960,41 Residuo final (pasajeros) 0,00 0,00 Defecto de embarque (pasajeros) 1369,41 207,09 Headway medio (minutos) 6,25 6,47 Dwell time medio (minutos) 1,34 0,84 Mejor valor objetivo alcanzado -6,68E+06 -6,67E+06 -6678550 Solución / Experimento Solución / Experimento EXPERIMENTO 5 EXPERIMENTO 6 Número de giros total 13 11 Defecto de embarque (pasajeros) 1369,41 207,09 Headway medio (minutos) 6,25 6,47 Dwell time medio (minutos) 1,34 0,84 Mejor valor objetivo alcanzado -6,68E+06 -6,67E+06 CRITERIOS SENTIDO FAVORABLE PONDERACIONES Número de giros total ↑3 Defecto de embarque ↓2 Headway medio ↓4 Dwell time medio ↓5 Valor función objetivo ↓1
111 Tabla 23. Matriz de decisión de los experimentos 5 y 6. De la matriz de decisión realizada en la Tabla 23, se concluye que ambos modelos presentan resultados interesantes, siendo inapropiado descartar el modelo B debido la escasa diferencia obtenida en su puntuación final. Destacan además, la rapidez de resolución del modelo A en comparación con el modelo B y la precisión ofrecida por este último, con un defecto de residuo mínimo, en comparación con el primero. 6.2 Experimentos finales. 6.2.1 Escenarios finales con matrices O-D(t) de demanda fraccionada cada 1 minuto. 6.2.1.1 Escenario pequeño (4 estaciones) con matriz de demanda ampliada y distribuciones dispares. Se propone un experimento de dimension pequeña con unos registros de demanda más extremos, empleando el modelo B, aprovechando la precisión que ofrece en los flujos de pasajeros. Resultados del experimento 7: Modelo B, escenario inicial con matriz de demanda ampliada fraccionada cada 1 minuto. En el experimento analizado se emplea el mismo escenario de datos de zonas de operaciones, del horario, del material rodante y de datos de la línea empleado en los escenarios iniciales y mostrados en la Figura 83. Además se emplean unos registros de demanda, cuyas distribuciones para ambas direcciones son dispares a lo largo del horizonte de planificación. Figura 145. Demanda dispar de pasajeros entre plataformas O-D upstream. Solución / Experimento EXPERIMENTO 5 EXPERIMENTO 6 PONDERACIONES Número de giros total 1 0 3 Defecto de embarque 0 1 2 Headway medio 1 0 4 Dwell time medio 0 1 5 Mejor valor objetivo alcanzado 1 0 1 PUNTUACIÓN FINAL 8 7
Pruebas computacionales. 118 118 Figura 157. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas upstream. (8) Figura 158. Flujos de pasajeros en el tren para los conjuntos servicios-plataformas downstream. (8) En las Figuras 157 y 158 se muestran partes de los gráficos anteriormente mencionados, que pueden consultarse en ANEXO XII, acompañados de los resultados en que se basan. Los resultados correspondientes al comportamiento de los pasajeros en los volúmenes de control constituidos por las plataformas se muestran, en gráficos de barras:
119 Figura 159. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas upstream. (8) Figura 160. Flujos de pasajeros en las plataformas para los conjuntos servicios-platafromas downstream. (8) En las Figuras 159 y 160 se muestran parcialmente los gráficos anteriormente mencionados.
Pruebas computacionales. 120 120 Estos gráficos se adjuntan íntegros en el ANEXO XII, junto a los resultados en los que se basa, de los que se obtienen las soluciones destacadas que se muestran: Tabla 29. Resumen de los resultados destacados del flujo de pasajeros del experimento 8. Los movimientos realizados por los servicios upstream a lo largo de la línea y del horizonte de planificación, se exponen a continuación, siguiendo el patrón de colores de la Tabla 25: Tabla 30. Movimientos de los servicios upstream en su recorrido por la línea. (8) Figura 161. Dwell time (minutos) de los servicios upstream. (8) En la Figura 161 se muestran los dwell times medios, que ofrecen los servicios upstream mostrados en la Tabla 30. T.esperando 207359,55 T.embarques 142857,82 T.residuo 64501,74 Residuo final 651,18 Defecto residuo 19782,29 RESULTADOS DESTACADOS DE FLUJO DE PASAJEROS LONGITUD (M) 12100 28 34 48 54 59,2 61 65 69 78 82 12100 28 32 48 52 57 61 65 69 78 82 12100 27,1 31,1 47,1 51,1 56,1 60,1 64,1 68,1 77,1 81,1 11000 26 30 46 50 55 59 63 67 76 80 11000 25,4 29,4 45,4 49,4 54,4 58,4 62,4 66,4 75,4 79,4 9600 24 28 44 48 53 57 61 65 74 78 9600 23,3 27,3 43,3 47,3 52,3 56,3 60,3 64,3 73,3 77,3 8300 22 26 42 46 51 55 59 63 72 76 8300 21,2 25,2 41,2 45,2 50,2 54,2 58,2 62,2 71,2 75,2 7100 20 24 40 44 49 53 57 61 70 74 7100 19,1 23,1 39,1 43,1 48,1 52,1 56,1 60,1 69,1 73,1 6000 18 22 38 42 47 51 55 59 68 72 6000 17 21 37 41 46 50 54 58 67 71 5000 16 20 36 40 45 49 53 57 66 70 5000 15,1 19,1 35,1 39,1 44,1 48,1 52,1 56,1 65,1 69,1 3900 14 18 34 38 43 47 51 55 64 68 3900 13,4 17,4 33,4 37,4 42,4 46,4 50,4 54,4 63,4 67,4 2500 12 16 32 36 41 45 49 53 62 66 2500 11,3 15,3 31,3 35,3 40,3 44,3 48,3 52,3 61,3 65,3 1200 10 14 30 34 39 43 47 51 60 64 1200 9,2 13,2 29,2 33,2 38,2 42,2 46,2 50,2 59,2 63,2 0812 28 32 37 41 45 49 58 62 08 9,2 28 29,2 34,2 41 42,2 46,2 57 61 SERVICIOS 0 1 2 3 4 5 6 7 8 9 MOVIMIENTOS (MIN)
121 Los movimientos realizados por los servicios downstream a lo largo de la línea y del horizonte de planificación se muestran a continuación, siguiendo el mismo patrón de colores establecido en los experimentos iniciales y mostrado en la Tabla 23: Tabla 31. Movimientos de los servicios downstream en su recorrido por la línea. (8) Figura 162. Dwell time (minutos) de los servicios downstream. (8) En la Figura 162 se muestran los resultados obtenidos de dwell times medios que ofrecen los servicios downstream mostrados en la Tabla 31. LONGITUD (M) 12100 15 16,2 20,2 27 28,2 34 36,2 54 55,2 59,2 12100 15 19 23 27 31 35 39 54 58 62 11000 16,1 20,1 24,1 28,1 32,1 36,1 40,1 55,1 59,1 63,1 11000 17 21 25 29 33 37 41 56 60 64 9600 18,1 22,1 26,1 30,1 34,1 38,1 42,1 57,1 61,1 65,1 9600 19 23 27 31 35 39 43 58 62 66 8300 20,1 24,1 28,1 32,1 36,1 40,1 44,1 59,1 63,1 67,1 8300 21 25 29 33 37 41 45 60 64 68 7100 22,1 26,1 30,1 34,1 38,1 42,1 46,1 61,1 65,1 69,1 7100 23 27 31 35 39 43 47 62 66 70 6000 24,1 28,1 32,1 36,1 40,1 44,1 48,1 63,1 67,1 71,1 6000 25 29 33 37 41 45 49 64 68 72 5000 26,1 30,1 34,1 38,1 42,1 46,1 50,1 65,1 69,1 73,1 5000 27 31 35 39 43 47 51 66 70 74 3900 28,1 32,1 36,1 40,1 44,1 48,1 52,1 67,1 71,1 75,1 3900 29 33 37 41 45 49 53 68 72 76 2500 30,1 34,1 38,1 42,1 46,1 50,1 54,1 69,1 73,1 77,1 2500 31 35 39 43 47 51 55 70 74 78 1200 32,1 36,1 40,1 44,1 48,1 52,1 56,1 71,1 75,1 79,1 1200 33 37 41 45 49 53 57 72 76 80 034,1 38,1 42,1 46,1 50,1 54,1 58,1 73,1 77,1 81,1 035 39 43 47 51 55 59 74 78 82 035 41 46,2 47 51 57 61 74 78 82 SERVICIOS 10 11 12 13 14 15 16 17 18 19 MOVIMIENTOS (MIN)
Pruebas computacionales. 122 122 Figura 163. Abastecimiento espacio – temporal de la línea por los servicios. (8) Figura 164. Headways (minutos) entre servicios consecutivos. (8) Los movimientos registrados en la Tablas 30 y 31, se representan gráficamente en la Figura 163, adjuntándose además los headways medios de los servicios que recorren la línea (Figura 164) De los resultados mostrados sobre el comportamiento de los trenes detallados en el ANEXO XII, se obtienen las soluciones destacadas mostradas a continuación: Tabla 32. Resultados destacados del comportamiento de los trenes del experimento 8. Total de giros realizados 7 Headway medio (min) 4,92 Dw. Time medio (min) 0,91 RESULTADOS DESTACADOS DE LOS SERVICIOS
123 7 CONCLUSIONES. La determinación del horario óptimo de una línea de sistema ferroviario urbano proporciona una herramienta robusta capaz de agilizar la planificación ferroviaria, posibilitando a los trenes saltar aquellas paradas que resulten convenientes. Esta herramienta aporta un mecanismo de mejora de los servicios ferroviarios en núcleos urbanos abastecidos por estos sistemas de transporte. El propósito de este proyecto ha sido la construcción de un modelo matemático capaz de atender de manera eficaz una demanda de pasajeros y optimizar la circulación de material rodante, con el fin de obtener un sistema de transporte eficaz. Para la construcción del modelo se procedió a la declaración de variables y restricciones, formulándose dos métodos distintos para controlar los embarques producidos, basados en una formulación exacta y una aproximación del porcentaje de embarques a partir de la demanda de la línea durante todo el horizonte temporal de planificación. Por último, se integró la función objetivo con la que se ha pretendido la consecución de los objetivos descritos en el problema. Para agilizar la formulación y resolución de los modelos resultantes A y B, diferenciados en el aspecto mencionado de las restricciones de embarque, se propuso la integración de dicho modelo en herramientas informáticas empleando una codificación Python y la implementación de la librería del solver Gurobi. Se han realizado experimentos iniciales en los que se han probado cada uno de los dos modelos en diferentes escenarios, empleando una misma demanda expresada en diferentes niveles de precisión de recogida de datos, con el fin de evaluarlos en escenarios de distintos tamaños. De dichos experimentos, se concluyó la conveniencia de utilizar datos de demanda con unas matrices que contemplen instantes previos al comienzo de los servicios e instantes posteriores al cierre de los accesos, para que el modelo emplee, si cree conveniente, la anticipación del movimiento de los trenes al movimiento de los viajeros entre plataformas, y tratar en los últimos instantes del horizonte de planificación del horario, solamente aquellos pasajeros que permanecieron en las plataformas desde instantes anteriores al cierre de los accesos. Tras la obtención de las primeras conclusiones, se prosiguió realizando experimentos iniciales de los que se obtuvieron circulaciones mínimas de material rodante, así como la minimización de tiempos de viaje, además de una regularidad entre paso de servicios adaptada a la variabilidad de la demanda. Las resoluciones de dichos modelos presentaron velocidades muy distintas al haber tratado escenarios cada vez más amplios. Sin embargo, se decidió no descartar ninguno de dichos modelos para realizar los experimentos finales, debido a los buenos resultados visualizados. El objetivo de los experimentos finales era el de probar cada uno de los modelos en escenarios diferentes según los comportamientos que estos ofrecían en el análisis de los experimentos iniciales. Así, se propuso resolver el modelo B, cuya velocidad resolutiva es más lenta, obteniendo resultados más precisos y exactos en los flujos de pasajeros, con un escenario de datos cuya demanda de pasajeros ofrecían distribuciones muy diferentes para cada dirección de la línea, con el fin de evaluar el rendimiento con una demanda de viajeros más extrema; el modelo A se ha experimentado con un escenario de datos cuya distribución de demanda no presentaba curvas tan dispares para ambas direcciones, pero si un mayor número de pasajeros
ANEXOS. 124 124 al considerarse una línea de transporte más amplia con más paradas. Tras el análisis de ambos experimentos finales se concluye, por lo general, la obtención y consecución de los objetivos propuestos en el proyecto, en diferentes medidas, dependiendo del modelo que se emplee. Así, se recomienda trabajar con el modelo A para la obtención más rápida de un horario de líneas de transporte a gran escala con un desempeño próspero en cuanto al empleo de material rodante, tiempos de duración de los viajes y adaptación a la demanda. En cuanto al modelo B, se recomienda su utilización para el análisis más preciso de los movimientos de pasajeros en líneas de metro más pequeñas, desenvolviéndose favorablemente en todos los aspectos mencionados anteriormente, pero con una velocidad de resolución lenta en el Solver. 8 ANEXOS.
125 8.1 ANEXO I. #Obviando la lectura de datos. """VARIABLES""" landa = {} # Si servicio k pasa por estacion i for k, i in conjunto_up: landa[k, i] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="Landa_%s_%s" % (k, i)) for k, i in conjunto_down: landa[k, i] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="Landa_%s_%s" % (k, i)) servactiv = {} # Si el servicio k se activa (se usa) for k in servicios_up: servactiv[k] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="servactiv_%s" % k) for k in servicios_down: servactiv[k] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="servactiv_%s" % k) e = {} # Dwell time en la estacion for i in estaciones_up: for k in servicios_up: e[k, i] = tr.addVar(lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="e_%s_%s" % (k,i)) for i in estaciones_down: for k in servicios_down: e[k, i] = tr.addVar(lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="e_%s_%s" % (k,i)) arrive = {} # Llegada de servicio k a estacion i for k, i in conjunto_up: arrive[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="a_%s_%s" % (k, i)) for k, i in conjunto_down: arrive[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="a_%s_%s" % (k, i)) departure = {} # salida de servicio k de estacion i for k, i in conjunto_up: departure[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="d_%s_%s" % (k, i))
ANEXOS. 126 126 for k, i in conjunto_down: departure[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="d_%s_%s" % (k, i)) h = {} # Headway entre dos servicios consecutivos for k in servicios_up: if k > 0: h[k-1, k] = tr.addVar(lb=0.0, ub=hmax, vtype=GRB.CONTINUOUS, name="h_%s_%s" % (k-1, k)) for k in servicios_down: if k > len(servicios_up): h[k-1, k] = tr.addVar(lb=0.0, ub=hmax, vtype=GRB.CONTINUOUS, name="h_%s_%s" % (k-1, k)) #Tiempos de giro tgirominimo = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="delta_min") tgiromaximo = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="delta_max") giroconfirmado = {} # Ligando servicios en sentido contrario for k in servicios_down: for l in servicios_up: giroconfirmado[k, l] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="gammaU_%s_%s" % (k, l)) for k in servicios_up: for l in servicios_down: giroconfirmado[k, l] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="gammaD_%s_%s" % (k, l)) tren_de_depot = {} # Ligando llegada desde depot a servicio for k in servicios_up: tren_de_depot[k] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="alfaU_%s" % k) for k in servicios_down: tren_de_depot[k] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="alfaD_%s" % k) tren_a_depot = {} # Ligando desde fin servicio a depot for k in servicios_up: tren_a_depot[k] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="betaU_%s" % k) for k in servicios_down: tren_a_depot[k] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY, name="betaD_%s" % k)
127 # Flotas iniciales y finales en depots RS1_i = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.INTEGER, name="RS1_inicial") RS2_i = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.INTEGER, name="RS2_inicial") RS1_f = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.INTEGER, name="RS1_final") RS2_f = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.INTEGER, name="RS2_final") # Variables de demanda esperando = {} total_esperando = {} pot_embarcan = {} total_pot_embarcan = {} embarcan = {} total_embarcan = {} bajan = {} dentro = {} residuo = {} for k, i in conjunto_up: total_esperando[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="w_%s_%s" % (k, i)) total_pot_embarcan[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="wb_%s_%s" % (k, i)) total_embarcan[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="cb_%s_%s" % (k, i)) bajan[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="ca_%s_%s" % (k, i)) dentro[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="c_%s_%s" % (k, i)) for j in estaciones_up: if j > i: esperando[k, i, j] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="w_%s_%s_%s" % (k, i, j)) pot_embarcan[k, i, j] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="wb_%s_%s_%s" % (k, i, j))
ANEXOS. 134 134 else: tr.addConstr(esperando[k, i, j] == residuo[k-1, i, j] + quicksum(b[k, i, ind] * demanda[i, j][ind-1] for ind, t in enumerate(tiempo) if demanda[i,j][ind-1]>0), name="Restriccion18(4)_%s_%s_%s_DE" % (k, i, j)) for k, i in conjunto_down: for j in estaciones_down: if j > i: if k == num_servicios_up: # Primer servicio. Creo que no es cierto que esperando sea cero para el primero tr.addConstr(esperando[k, i, j] == quicksum(b[k, i, ind] * demanda[i, j][ind-1] for ind, t in enumerate(tiempo)if demanda[i,j][ind-1]>0), name="Restriccion18(4)_%s_%s_%s_DE" % (k, i, j)) else: # Resto tr.addConstr(esperando[k, i, j] == residuo[k-1, i, j]+quicksum(b[k, i, ind] * demanda[i, j][ind-1] for ind, t in enumerate(tiempo)if demanda[i,j][ind-1]>0), name="Restriccion18(4)_%s_%s_%s_DE" % (k, i, j)) # (19.1.1) - (19.5.2) M = 999999 for k, i in conjunto_up: for j in estaciones_up: if j > i: tr.addConstr(landa[k, i]+landa[k, j] <= 1 + ji[k, i, j], name="Restriccion19(1)_%s_%s_%s_DE" % (k, i, j)) tr.addConstr(2 * ji[k, i, j] <= landa[k, i] + landa[k, j], name="Restriccion19(2)_%s_%s_%s_DE" % (k, i, j)) tr.addConstr(pot_embarcan[k, i, j] <= M * ji[k, i, j], name="Restriccion19(3)_%s_%s_%s_DE" % (k, i, j)) tr.addConstr(pot_embarcan[k, i, j] <= esperando[k, i, j], name="Restriccion19(4)_%s_%s_%s_DE" % (k, i, j)) tr.addConstr(pot_embarcan[k, i, j] >= esperando[k, i, j] - M * (1-ji[k, i, j]), name="Restriccion19(5)_%s_%s_%s_DE" % (k, i, j)) for k, i in conjunto_down: for j in estaciones_down: if j > i: tr.addConstr(landa[k, i] + landa[k, j] <= 1 + ji[k, i, j], name="Restriccion19(1)_%s_%s_%s_DE" % (k, i, j)) tr.addConstr(2 * ji[k, i, j] <= landa[k, i] + landa[k, j], name="Restriccion19(2)_%s_%s_%s_DE" % (k, i, j)) tr.addConstr(pot_embarcan[k, i, j] <= M * ji[k, i, j], name="Restriccion19(3)_%s_%s_%s_DE" % (k, i, j)) tr.addConstr(pot_embarcan[k, i, j] <= esperando[k, i, j], name="Restriccion19(4)_%s_%s_%s_DE" % (k, i, j))
135 tr.addConstr(pot_embarcan[k, i, j] >= esperando[k, i, j] - M * (1 - ji[k, i, j]), name="Restriccion19(5)_%s_%s_%s_DE" % (k, i, j)) # (20.1) (20.2) for k, i in conjunto_up: if i > 0: tr.addConstr(dentro[k, i] == dentro[k, i-1] - bajan[k,i] + total_embarcan[k, i], name="Restriccion20_%s_%s_DE" % (k, i)) else: tr.addConstr(dentro[k, i] == total_embarcan[k, i], name="Restriccion20_%s_%s_DE(2)" % (k, i)) for k, i in conjunto_down: if i > len(estaciones_up): tr.addConstr(dentro[k, i] == dentro[k, i-1] - bajan[k, i] + total_embarcan[k, i],name="Restriccion20_%s_%s_DE" % (k, i)) else: tr.addConstr(dentro[k, i] == total_embarcan[k, i], name="Restriccion20_%s_%s_DE(2)" % (k, i)) # (21.1.1) - (21.2.4) xu = {} yu = {} xd={} yd={} for k, i in conjunto_up: xu[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='x_%s_%s' % (k, i)) yu[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='y_%s_%s' % (k, i)) if i > 0: tr.addConstr(xu[k, i] == C - dentro[k, i-1] + bajan[k, i], name="Restriccion21(1)_%s_%s_DE" % (k, i)) else: tr.addConstr(xu[k, i] == C, name="Restriccion21(1)_%s_%s_DE" % (k, i)) tr.addConstr(yu[k, i] == total_pot_embarcan[k, i], name="Restriccion21(2)_%s_%s_DE" % (k, i)) tr.addConstr(quicksum(embarcan[k, i, j] for j in estaciones_up if j > i) <= xu[k, i], name="Restriccion21(3a)_%s_%s_DE" % (k, i)) tr.addConstr(quicksum(embarcan[k, i, j] for j in estaciones_up if j > i) <= yu[k, i], name="Restriccion21(3b)_%s_%s_DE" % (k, i)) for k, i in conjunto_down: xd[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='x_%s_%s' % (k, i)) yd[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name='y_%s_%s' % (k, i)) if i > len(estaciones_up): tr.addConstr(xd[k, i] == C - dentro[k, i - 1] + bajan[k, i], name="Restriccion21(1)_%s_%s_DE" % (k, i)) else:
ANEXOS. 136 136 tr.addConstr(xd[k, i] == C, name="Restriccion21(1)_%s_%s_DE" % (k, i)) tr.addConstr(yd[k, i] == total_pot_embarcan[k, i], name="Restriccion21(2)_%s_%s_DE" % (k, i)) tr.addConstr(quicksum(embarcan[k, i, j] for j in estaciones_down if j > i) <= xd[k, i], name="Restriccion21(3a)_%s_%s_DE" % (k, i)) tr.addConstr(quicksum(embarcan[k, i, j] for j in estaciones_down if j > i) <= yd[k, i], name="Restriccion21(3b)_%s_%s_DE" % (k, i)) # (22.1) (22.2) for k, i in conjunto_up: if i > 0: tr.addConstr(bajan[k, i] == quicksum(embarcan[k, j, i] for j in range(0, i)), name="Restriccion22_%s_%s_DE" % (k, i)) else: tr.addConstr(bajan[k, i] == 0, name="Restriccion22_%s_%s_DE(2)" % (k, i)) for k, i in conjunto_down: if i > len(estaciones_up): tr.addConstr(bajan[k, i] == quicksum(embarcan[k, j, i] for j in range(len(estaciones_up), i)), name="Restriccion22_%s_%s_DE" % (k, i)) else: tr.addConstr(bajan[k, i] == 0, name="Restriccion22_%s_%s_DE(2)" % (k, i)) # DIFERENCIACIÓN MODELO A #(23.A.1) - (23. A.2) """A""" prop_dem = {} denom = {} numerador = {} for i in estaciones_up: denom[i] = 0.0 for j in estaciones_up: if j > i: numerador[i, j] = 0.00 prop_dem[i, j] = 0.00 for ind,t in enumerate(tiempo): denom[i] = denom[i]+(demanda[i, j][ind-1])
137 numerador[i, j] = numerador[i, j]+(demanda[i, j][ind-1]) for i in estaciones_up: for j in estaciones_up: if j > i: prop_dem[i, j] = float(numerador[i, j] / denom[i]) for k in servicios_up: tr.addConstr(embarcan[k, i, j] == prop_dem[i, j] * total_embarcan[k, i], name="Restriccion23_2_%s_%s_%s_DE" % (k, i, j)) for i in estaciones_down: denom[i] = 0.0 for j in estaciones_down: if j > i: numerador[i, j] = 0.00 prop_dem[i, j] = 0.00 for ind, t in enumerate(tiempo): denom[i] = denom[i]+(demanda[i, j][ind-1]) numerador[i, j] = numerador[i, j]+(demanda[i, j][ind-1]) for i in estaciones_down: for j in estaciones_down: if j > i: prop_dem[i, j] = float(numerador[i, j] / denom[i]) for k in servicios_down: tr.addConstr(embarcan[k, i, j] == prop_dem[i, j] * total_embarcan[k, i], name="Restriccion23_2_%s_%s_%s_DE" % (k, i, j)) #DIFERENCIACION MODELO B #SE PRESENTA COMENTADO PARA CAMBIAR AL MODELO B QUITAR COMENTARIO, #Y COMENTAR MODELO A # (23.B.1)-(23.B.4) """B""" """ porcentaje_u={} porcentaje_down={} for i in estaciones_up[0:len(estaciones_up)-1]: for k in servicios_up: for j in estaciones_up:
ANEXOS. 138 138 if j > i: porcentaje_u[k, i, j]=tr.addVar(lb=0.0, ub=1.0, vtype=GRB.CONTINUOUS, name="porcentaje_u_%s_%s_%s" %(k, i, j) ) tr.addConstr(quicksum(porcentaje_u[k, i, j] for j in estaciones_up if j > i) == 1, name="Sumaporcentajes_u_%s_%s" %(k, i)) for i in estaciones_down[0:len(estaciones_down)-1]: for k in servicios_down: for j in estaciones_down: if j > i: porcentaje_down[k, i, j] = tr.addVar(lb=0.0, ub=1.0, vtype=GRB.CONTINUOUS, name="porcentaje_down_%s_%s_%s" % (k, i, j)) tr.addConstr(quicksum(porcentaje_down[k, i, j] for j in estaciones_down if j > i) == 1, name="Sumaporcentajes_down_%s_%s" % (k, i)) for i in estaciones_up[0:len(estaciones_up)-1]: for j in estaciones_up: if j > i: for k in servicios_up: if k>0: tr.addConstr(pot_embarcan[k, i, j] == porcentaje_u[k, i, j] * total_pot_embarcan[k, i], name="(2)Restriccion23_2_%s_%s_%s_DE" % (k, i, j)) for i in estaciones_down[0:len(estaciones_down)-1]: for j in estaciones_down: if j > i: for k in servicios_down: if k > len(servicios_up): tr.addConstr(pot_embarcan[k, i, j] == porcentaje_down[k, i, j] * total_pot_embarcan[k, i], name="(2)Restriccion23_2_%s_%s_%s_DE" % (k, i, j)) for i in estaciones_up[0:len(estaciones_up)-1]: for j in estaciones_up: if j > i: for k in servicios_up: # Abajo con < funciona tr.addConstr(embarcan[k, i, j] == porcentaje_u[k, i, j] * total_embarcan[k, i], name="(3)Restriccion23_2_%s_%s_%s_DE" % (k, i, j)) for i in estaciones_down[0:len(estaciones_down)-1]:
139 for j in estaciones_down: if j > i: for k in servicios_down: tr.addConstr(embarcan[k, i, j] == porcentaje_down[k, i, j] * total_embarcan[k, i], name="(3)Restriccion23_2_%s_%s_%s_DE" % (k, i, j)) """ # (24.1) #(24.2) for k, i in conjunto_up: for j in estaciones_up: if j > i: tr.addConstr(residuo[k, i, j] == esperando[k, i, j]-embarcan[k, i, j], name="Restriccion24_%s_%s_%s_DE" % (k, i, j)) for k, i in conjunto_down: for j in estaciones_down: if j > i: tr.addConstr(residuo[k, i, j] == esperando[k, i, j] - embarcan[k, i, j], name="Restriccion24_%s_%s_%s_DE" % (k, i, j)) #LA VARIABLE Y RESTRICCIONES SIGUIENTES SON EXTRAS Y SE EMPLEAN #PARA FACILITAR VISUALIZACION DE DATOS total_residuo = {} for k,i in conjunto_up: total_residuo[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="Total_residuo_%s_%s" % (k, i)) tr.addConstr(total_residuo[k, i]==quicksum(residuo[k,i,j] for j in estaciones_up if j>i)) for k,i in conjunto_down: total_residuo[k, i] = tr.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="Total_residuo_%s_%s" % (k, i)) tr.addConstr(total_residuo[k, i]==quicksum(residuo[k,i,j] for j in estaciones_down if j>i)) """FUNCION OBJETIVO""" setup=[(i,j,k) for i in estaciones_up for j in estaciones_up if j > i for k in servicios_up if k > 0] setdw=[(i,j,k) for i in estaciones_down for j in estaciones_down if j > i for k in servicios_down if k > len(servicios_up)] aa=servicios_up[-1] bb=servicios_down[-1] cc=tiempo[-1]
ANEXOS. 140 140 gamma=10.0 pesos_up = {i:(len(estaciones_up)-i)**3 for i in estaciones_up} pesos_down = {i:(len(estaciones_up)-o)**3 for o,i in enumerate(estaciones_down)} tr.setObjective(quicksum(((esperando[k, i, j])*(departure[k, i]-departure[k-1, i])/2) for (i, j, k) in setup) + quicksum(((esperando[k, i, j])*(departure[k, i]-departure[k-1, i])/2) for (i, j, k) in setdw)+ quicksum(esperando[0,i,j]*departure[0,i] for i in estaciones_up for j in estaciones_up if i<j)+ quicksum(esperando[len(servicios_up),i,j]*departure[len(servicios_up),i] for i in estaciones_down for j in estaciones_down if i<j)+ gamma*quicksum(residuo[aa,i,j]*(cc-departure[aa, i])/2 for i in estaciones_up for j in estaciones_up if j > i)+ gamma*quicksum(residuo[bb,i,j]*(cc-departure[bb, i])/2 for i in estaciones_down for j in estaciones_down if j > i)+ gamma*quicksum(demanda[i, j][ind - 1] * z[aa, i, ind] / 2 for i in estaciones_up for j in estaciones_up if j > i for ind, t in enumerate(tiempo)) + gamma*quicksum(demanda[i, j][ind - 1] * z[bb, i, ind] / 2 for i in estaciones_down for j in estaciones_down if j > i for ind, t in enumerate(tiempo)) - gamma*quicksum(pesos_up[i]*total_embarcan[k,i] for k in servicios_up for i in estaciones_up)- gamma*quicksum(pesos_down[i]*total_embarcan[k,i] for k in servicios_down for i in estaciones_down)+ gamma * (quicksum(tren_a_depot[k] for k in servicios_up) + quicksum(tren_a_depot[k] for k in servicios_down))+ gamma * (quicksum(tren_de_depot[k] for k in servicios_up) +quicksum(tren_de_depot[k] for k in servicios_down))) setParam ('NonConvex', 2) setParam ('Timelimit', 14400) setParam('MIPGap',0.003) tr.modelSense = GRB.MINIMIZE tr.optimize() tr.write('Problema.lp') 8.2 ANEXO II.
141 8.3 ANEXO III. Instantes de tiempo 0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 9:01 9:05 9:09 9:13 9:17 9:21 9:25 9:29 9:33 9:37 9:41 9:45 9:49 9:53 9:57 10:01 0,1 43 48 68 40 76 112 102 136 160 135 102 102 41 50 44 34 0,2 37 51 64 69 90 62 118 168 174 122 103 78 57 35 34 34 0,3 39 39 70 66 80 92 88 156 151 116 96 100 67 51 40 31 1,2 40 44 69 62 79 94 96 143 164 137 80 102 48 58 53 46 1,3 29 76 59 56 87 85 122 145 181 124 77 83 37 53 55 36 2,3 28 37 59 58 87 101 107 148 159 123 108 86 50 72 34 35 9:01 9:05 9:09 9:13 9:17 9:21 9:25 9:29 9:33 9:37 9:41 9:45 9:49 9:53 9:57 10:57 4,5 26 54 53 65 71 91 105 172 163 107 91 108 77 68 57 25 4,6 37 54 55 68 116 116 95 167 156 117 78 91 34 51 55 31 4,7 43 70 76 50 93 77 105 169 157 132 109 91 66 64 41 32 5,6 35 62 51 73 83 106 112 164 167 142 90 106 48 82 47 37 5,7 40 89 63 71 80 110 108 170 158 128 99 103 55 71 64 23 6,7 46 73 56 66 99 122 122 147 127 129 91 90 73 62 27 36 UP DW MATRIZ OD(t) SENTIDO SERVICIO PLATAFORMA TOTAL ESPERANDO BAJAN TOTAL POTENCIALES EMBARCAN PUEDEN EMBARCAR TOTAL EMBARCAN DENTRO RESIDUO INDICE U 0 0 99 099 99 93,60452418 93,60452418 5,395475819 0,0 U 0 1 151 31,26599064 151 151 130,4980843 192,8366178 20,50191571 0,1 U 0 2 100 96,83661783 100 100 100 196 -1,42109E-14 0,2 U 0 3 0 196 0 0 0 0 0 0,3 U 1 0 361,3954758 0 361,3954758 361,3954758 329,125585 329,125585 32,2698908 1,0 U 1 1 350,5019157 109,9352574 350,5019157 350,5019157 343,3103448 562,5006724 7,191570881 1,1 U 1 2 152 282,5006724 152 152 152 432 0 1,2 U 1 3 0 432 0 0 0 -5,68434E-14 0 1,3 U 2 0 508,2698908 0 508,2698908 508,2698908 478,4075551 478,4075551 29,86233565 2,0 U 2 1 373,1915709 159,798752 373,1915709 281,3911968 281,3911968 600 91,80037407 2,1 U 2 2 223 301,4021192 223 223 223 521,5978808 0 2,2 U 2 3 0 521,5978808 0 0 0 0 0 2,3 U 3 0 374,8623357 0 374,8623357 374,8623357 329,3194122 329,3194122 45,54292343 3,0 U 3 1 352,8003741 110 352,8003741 352,8003741 320,9076538 540,227066 31,89272031 3,1 U 3 2 142 271,3214665 142 142 142 410,9055995 0 3,2 U 3 3 0 410,9055995 0 0 0 0 0 3,3 U 4 0 410,5429234 0 410,5429234 410,5429234 391,4202382 391,4202382 19,12268519 4,0 U 4 1 331,8927203 130,7430556 331,8927203 331,8927203 317,210728 577,8879107 14,68199234 4,1 U 4 2 183 290,2571317 183 183 183 470,630779 0 4,2 U 4 3 0 470,630779 0 0 0 -5,68434E-14 0 4,3 U 5 0 426,1226852 0 426,1226852 426,1226852 370,9932 370,9932 55,12948518 5,0 U 5 1 372,8144537 123,919971 372,8144537 352,926771 352,926771 600 19,88768279 5,1 U 5 2 194 301,3443982 194 194 194 492,6556018 0 5,2 U 5 3 0 492,6556018 0 0 0 0 0 5,3 U 6 0 614,1294852 0 614,1294852 600 564,6466459 564,6466459 49,48283931 6,0 U 6 1 364,8876828 188,6045242 364,8876828 223,9578783 223,9578783 600 140,9298045 6,1 U 6 2 158 301,4484614 158 158 158 456,5515386 0 6,2 U 6 3 0 456,5515386 0 0 0 0 0 6,3 U 7 0 633,4828393 0 633,4828393 600 549,549142 549,549142 83,93369735 7,0 U 7 1 434,6763355 183,5616225 434,6763355 234,0124805 234,0124805 600 200,663855 7,1 U 7 2 143 301,4403485 143 143 143 441,5596515 0 7,2 U 7 3 0 441,5596515 0 0 0 0 0 7,3 U 8 0 555,9336973 0 555,9336973 555,9336973 443,8666147 443,8666147 112,0670827 8,0 U 8 1 439,663855 148,2613105 439,663855 304,3946958 304,3946958 600 135,2691592 8,1 U 8 2 121 301,383558 121 121 121 419,616442 0 8,2 U 8 3 0 419,616442 0 0 0 0 0 8,3 U 9 0 512,0670827 0 512,0670827 512,0670827 383,4765991 383,4765991 128,5904836 9,0 U 9 1 402,2691592 128,0897036 402,2691592 344,6131045 344,6131045 600 57,65605471 9,1 U 9 2 85 301,3511063 85 85 85 383,6488937 0 9,2 U 9 3 0 383,6488937 0 0 0 0 0 9,3 D10 488 088 88 75,56264066 75,56264066 12,43735934 10,4 D10 5135 25 135 135 124,8121508 175,3747915 10,18784916 10,5 D10 6155 86,58709457 155 155 155 243,7876969 0 10,6 D10 7 0 243,7876969 0 0 0 0 0 10,7 D11 4 384,4373593 0 384,4373593 384,4373593 317,3630908 317,3630908 67,07426857 11,4 D11 5 335,1878492 105 335,1878492 335,1878492 323,4540413 535,8171321 11,73380783 11,5 D11 6158 264,2426129 158 158 158 429,5745193 -5,68434E-14 11,6 D11 7 0 429,5745193 0 0 0 0 0 11,7 D12 4 522,0742686 0 522,0742686 522,0742686 432,2183046 432,2183046 89,85596399 12,4 D12 5 378,7338078 143 378,7338078 310,7816954 310,7816954 600 67,95211241 12,5 D12 6257 295,6246563 257 257 257 561,3753437 0 12,6 D12 7 0 561,3753437 0 0 0 1,13687E-13 0 12,7 D13 4 457,855964 0 457,855964 457,855964 290,1605401 290,1605401 167,6954239 13,4 D13 5 343,9521124 96 343,9521124 343,9521124 320,6762744 514,8368146 23,27583799 13,5 D13 6158 253,9479678 158 158 158 418,8888468 0 13,6 D13 7 0 418,8888468 0 0 0 5,68434E-14 0 13,7 D14 4 539,6954239 0 539,6954239 539,6954239 350,6106527 350,6106527 189,0847712 14,4 D14 5 303,275838 116 303,275838 303,275838 259,5300279 494,1406806 43,74581006 14,5 D14 6183 243,4857669 183 183 183 433,6549137 0 14,6 D14 7 0 433,6549137 0 0 0 0 0 14,7 D15 4 582,0847712 0 582,0847712 582,0847712 392,9257314 392,9257314 189,1590398 15,4 D15 5 378,1139447 130 378,1139447 337,0742686 337,0742686 600 41,03967616 15,5 D15 6163 295,7628577 163 163 163 467,2371423 0 15,6 D15 7 0 467,2371423 0 0 0 0 0 15,7 D16 4 785,1590398 0 785,1590398 600 595,4336084 595,4336084 189,7254314 16,4 D16 5 387,444994 197 387,444994 201,5663916 201,5663916 600 185,8786024 16,5 D16 6165 295,0505891 165 165 165 469,9494109 0 16,6 D16 7 0 469,9494109 0 0 0 0 0 16,7 D17 4 753,7254314 0 753,7254314 600 568,2310578 568,2310578 185,4943736 17,4 D17 5 515,8786024 188 515,8786024 219,7689422 219,7689422 600 296,1096602 17,5 D17 6127 295,146267 127 127 127 431,853733 0 17,6 D17 7 0 431,853733 0 0 0 5,68434E-14 0 17,7 D18 4 629,4943736 0 629,4943736 600 398,9707427 398,9707427 230,5236309 18,4 D18 5 545,1096602 132 545,1096602 333,0292573 333,0292573 600 212,0804029 18,5 D18 6126 295,741596 126 126 126 430,258404 0 18,6 D18 7 0 430,258404 0 0 0 0 0 18,7 D19 4 596,5236309 0 596,5236309 596,5236309 350,6106527 350,6106527 245,9129782 19,4 D19 5 481,0804029 116 481,0804029 365,3893473 365,3893473 600 115,6910555 19,5 D19 6109 295,9116899 109 109 109 413,0883101 0 19,6 D19 7 0 413,0883101 0 0 0 0 0 19,7 PASAJEROS
ANEXOS. 142 142 SERVICIO U SERVICIO D GIRO CONFIRMADO U-D 010 0 011 0 012 1 013 0 014 0 015 0 016 0 017 0 018 0 019 0 110 0 111 0 112 0 113 0 114 1 115 0 116 0 117 0 118 0 119 0 210 0 211 0 212 0 213 0 214 0 215 0 216 1 217 0 218 0 219 0 310 0 311 0 312 0 313 0 314 0 315 0 316 0 317 1 318 0 319 0 410 0 411 0 412 0 413 0 414 0 415 0 416 0 417 0 418 1 419 0 510 0 511 0 512 0 513 0 514 0 515 0 516 0 517 0 518 0 519 1 610 0 611 0 612 0 613 0 614 0 615 0 616 0 617 0 618 0 619 0 710 0 711 0 712 0 713 0 714 0 715 0 716 0 717 0 718 0 719 0 810 0 811 0 812 0 813 0 814 0 815 0 816 0 817 0 818 0 819 0 910 0 911 0 912 0 913 0 914 0 915 0 916 0 917 0 918 0 919 0 SERVICIO D SERVICIO U GIRO CONFIRMADO D-U 10 0 0 10 1 0 10 21 10 3 0 10 4 0 10 5 0 10 6 0 10 7 0 10 8 0 10 9 0 11 0 0 11 1 0 11 2 0 11 3 0 11 41 11 5 0 11 6 0 11 7 0 11 8 0 11 9 0 12 0 0 12 1 0 12 2 0 12 3 0 12 4 0 12 5 0 12 61 12 7 0 12 8 0 12 9 0 13 0 0 13 1 0 13 2 0 13 3 0 13 4 0 13 5 0 13 6 0 13 71 13 8 0 13 9 0 14 0 0 14 1 0 14 2 0 14 3 0 14 4 0 14 5 0 14 6 0 14 7 0 14 81 14 9 0 15 0 0 15 1 0 15 2 0 15 3 0 15 4 0 15 5 0 15 6 0 15 7 0 15 8 0 15 91 16 0 0 16 1 0 16 2 0 16 3 0 16 4 0 16 5 0 16 6 0 16 7 0 16 8 0 16 9 0 17 0 0 17 1 0 17 2 0 17 3 0 17 4 0 17 5 0 17 6 0 17 7 0 17 8 0 17 9 0 18 0 0 18 1 0 18 2 0 18 3 0 18 4 0 18 5 0 18 6 0 18 7 0 18 8 0 18 9 0 19 0 0 19 1 0 19 2 0 19 3 0 19 4 0 19 5 0 19 6 0 19 7 0 19 8 0 19 9 0
143 8.4 ANEXO IV. SENTIDO SERVICIO PLATAFORMA TOTAL ESPERANDO BAJAN TOTAL POTENCIALES EMBARCAN PUEDEN EMBARCAR TOTAL EMBARCAN DENTRO RESIDUO INDICE U 0 0 99 099 99 99 99 0 0,0 U 0 1 151 34 151 151 151 216 0 0,1 U 0 2 100 120 100 100 100 196 0 0,2 U 0 3 0 196 0 0 0 0 0 0,3 U 1 0 356 0356 356 356 356 0 1,0 U 1 1 330 125 330 330 330 561 0 1,1 U 1 2 152 281 152 152 152 432 0 1,2 U 1 3 0 432 0 0 0 0 0 1,3 U 2 0 476 0476 476 475,9999976 475,9999976 2,44513E-06 2,0 U 2 1 366 142 366 266,0000024 266,0000024 600 99,99999755 2,1 U 2 2 223 302,9071033 223 223 223 520,0928967 0 2,2 U 2 3 0 520,0928967 0 0 0 0 0 2,3 U 3 0 345,0000024 0 345,0000024 345,0000024 345,0000024 345,0000024 0 3,0 U 3 1 360,9999976 110 360,9999976 360,9999976 360,9999976 596 -1,25056E-12 3,1 U 3 2 142 315,0928967 142 142 142 422,9071033 0 3,2 U 3 3 0 422,9071033 0 0 0 0 0 3,3 U 4 0 365 0365 365 365 365 0 4,0 U 4 1 300 146 300 300 300 519 0 4,1 U 4 2 183 238 183 183 183 464 0 4,2 U 4 3 0 464 0 0 0 0 0 4,3 U 5 0 407 0407 407 407 407 0 5,0 U 5 1 329 136 329 329 329 600 0 5,1 U 5 2 194 318 194 194 194 476 0 5,2 U 5 3 0 476 0 0 0 0 0 5,3 U 6 0 558,9362836 0 558,9362836 558,9362836 545,2959853 545,2959853 13,6402983 6,0 U 6 1 345 165,8299665 345 220,5339811 220,5339811 600 124,4660189 6,1 U 6 2 158 301,882582 158 158 158 456,117418 0 6,2 U 6 3 0 456,117418 0 0 0 0 0 6,3 U 7 0 596,7509111 0 596,7509111 596,7509111 587,1017262 587,1017262 9,649184842 7,0 U 7 1 385,4660189 194,6436805 385,4660189 207,5419542 207,5419542 600 177,9240646 7,1 U 7 2 143 314,805216 143 143 143 428,194784 0 7,2 U 7 3 0 428,194784 0 0 0 0 0 7,3 U 8 0 481,6491848 0 481,6491848 481,6491848 481,6057826 481,6057826 0,043402248 8,0 U 8 1 359,5498397 172,1835076 359,5498397 290,577725 290,577725 600 68,97211475 8,1 U 8 2 121 308,4191061 121 121 121 412,5808939 0 8,2 U 8 3 0 412,5808939 0 0 0 0 0 8,3 U 9 0 400,0434022 0 400,0434022 400,0434022 400,0434022 400,0434022 0 9,0 U 9 1 335,9721147 136,015517 335,9721147 335,9721147 335,9721147 600 0 9,1 U 9 2 85 320,3802266 85 85 85 364,6197734 0 9,2 U 9 3 0 364,6197734 0 0 0 5,68434E-14 0 9,3 D10 488 088 88 88 88 0 10,4 D10 5135 25 135 135 135 198 0 10,5 D10 6155 103 155 155 155 250 0 10,6 D10 7 0 250 0 0 0 0 0 10,7 D11 4372 0372 372 372 372 0 11,4 D11 5325 105 325 325 325 592 0 11,5 D11 6158 272 158 158 158 478 0 11,6 D11 7 0 478 0 0 0 5,68434E-14 0 11,7 D12 4455 0455 455 449,7364091 449,7364091 5,263590898 12,4 D12 5367 141,3457293 367 291,6093202 291,6093202 600 75,39067978 12,5 D12 6257 305,571607 257 257 257 551,428393 0 12,6 D12 7 0 551,428393 0 0 0 0 0 12,7 D13 4 373,2635909 0 373,2635909 373,2635909 354,5551411 354,5551411 18,70844984 13,4 D13 5 351,3906798 92,75971361 351,3906798 338,2045726 338,2045726 600 13,18610722 13,5 D13 6158 317,117359 158 158 158 440,882641 0 13,6 D13 7 0 440,882641 0 0 0 0 0 13,7 D14 4 390,7084498 0 390,7084498 390,7084498 390,7084498 390,7084498 0 14,4 D14 5 293,1861072 120,8945571 293,1861072 293,1861072 293,1861072 563 0 14,5 D14 6183 310,311034 183 183 183 435,688966 0 14,6 D14 7 0 435,688966 0 0 0 5,68434E-14 0 14,7 D15 4393 0393 393 393 393 0 15,4 D15 5337 130 337 337 337 600 0 15,5 D15 6163 291,85 163 163 163 471,15 0 15,6 D15 7 0 471,15 0 0 0 0 0 15,7 D16 4596 0596 596 571,0303575 571,0303575 24,96964251 16,4 D16 5325 188,7466115 325 217,716254 217,716254 600 107,283746 16,5 D16 6165 301,577376 165 165 165 463,422624 0 16,6 D16 7 0 463,422624 0 0 0 -5,68434E-14 0 16,7 D17 4 588,9696425 0 588,9696425 588,9696425 504,4659423 504,4659423 84,50370022 17,4 D17 5 377,283746 168,0955069 377,283746 263,6295646 263,6295646 600 113,6541815 17,5 D17 6127 305,0189281 127 127 127 421,9810719 0 17,6 D17 7 0 421,9810719 0 0 0 1,13687E-13 0 17,7 D18 4 528,5037002 0 528,5037002 528,5037002 518,6392608 518,6392608 9,864439457 18,4 D18 5 312,4164603 157,1685596 312,4164603 238,5292989 238,2915778 599,7622789 74,1248826 18,5 D18 6126 291,2669008 126 126 126 434,4953781 0 18,6 D18 7 0 434,4953781 0 0 0 -5,68434E-14 0 18,7 D19 4 375,8644395 0 375,8644395 375,8644395 375,8644395 375,8644395 0 19,4 D19 5 343,1248826 118,9893221 343,1248826 343,1248826 343,1248826 600 0 19,5 D19 6109 292,1568672 109 109 109 416,8431328 0 19,6 D19 7 0 416,8431328 0 0 0 0 0 19,7 PASAJEROS