Metodología de estimacion de paradero de bajada en Zonas Pagas

Esta sección de la documentación se centra en describir la metodología y detalles de implementación de la estimación de bajada de las etapas realizadas en zonas pagas.

Flujo Estimación de bajada : Zonas Pagas

Estimación de subida

Se consideran etapas en zonas pagas todas aquellas transacciones de pago realizadas en un sitio o validador cuya patente comience con “RM-”, como por ejemplo “RM-2312”. Cualquier otra etapa que inicie en el mismo paradero de la zona paga pero no esté asociada al validador especificado no será considerada como una validación en zona paga.

El primer paso consiste en identificar el paradero de subida. Para ello, se utiliza el código del validador para buscar el paradero correspondiente en el archivo Diccionario-DetalleServicioZP. Al realizar este cruce, se obtienen los siguientes datos de la zona paga:

  1. La lista de servicios que operan en la zona paga, codificados en formato Sonda, lo que permite identificar distintas variantes.
  2. La información sobre si la zona paga es mixta, es decir, si operan más de una unidad de negocio.
  3. La lista de unidades de negocio asociadas.
  4. Las coordenadas del paradero.
  5. El nombre del paradero.
  6. El código de la zona paga.

Obtención de bajada

Con la subida determinada el siguiente paso corresponde a estimar la bajada de la etapa, este proceso es el más complejo respecto a los otros modos y se descompone en las siguientes etapas. Por cada etapa se realizan estas etapas en forma independiente:

1. Identificación de Zona Paga

Utilizando el codigo del validador se identifica la zona paga asociada y se almacenan todos sus datos:

  1. Lista de servicios
  2. Lista de unidades de negocio
  3. Coordenadas del paradero
  4. Nombre del paradero

2. Obtención de líneas factibles

Con la lista de servicios se realiza la verificación de que líneas pueden ser factibles para la bajada de esta etapa, para esto se realiza un ciclo sobre la lista de servicios y deben cumplir las siguientes condiciones:

  1. El servicio debe existir en el diccionario de servicios (diccionario de servicios)
  2. El servicio debe tener un trazado en el archivo de shapes
  3. El servicio debe tener una secuencia de paradas en el archivo de consolidado de paradas
  4. El servicio debe contar con expediciones para ese dia
  5. El servicio debe contar con expediciones en la ventana temporal entre 3 horas antes de la validación y una hora después de la validación
  6. La posición de la siguiente transacción de la tarjeta debe estar a menos de 1.000 metros del trazado del punto más cercano.
  7. La posición de la siguiente transacción de la tarjeta debe estar a menos de 1.000 del paradero más cercano

3. Obtención de frecuencias

Para todas las líneas factibles, se lleva a cabo un proceso de obtención y almacenamiento de sus frecuencias. Estos datos se extraen del archivo de frecuencias, el cual contiene información detallada para cada servicio y período del sistema Transantiago, según el tipo de día laboral.

Si no se encuentra el dato correspondiente, el servicio será descartado para las etapas posteriores del proceso, y su frecuencia se registrará con un valor de -1

4. Obtención de velocidades

Para todas las líneas factibles, se realiza un proceso de obtención y almacenamiento de su velocidad, para esto se utilizan los datos de velocidades obtenidos del proceso de cálculo de velocidades por servicio tramificados cada 500 metros y media hora.

Utilizando el tiempo de la validación se ubica la media hora correspondiente y se determinan los tramos desde la distancia en ruta del paradero de subida y la distancia en ruta de la proyección de la siguiente transacción. Con estos datos se establece la velocidad media entre ambos puntos y se almacena para los procesos posteriores.

En caso de no existir el dato se utiliza una velocidad fija de 15 km/h.

5. Obtención de tiempos de viaje

El tiempo de viaje se calcula como la suma de dos componentes:

  1. El tiempo en vehículo, determinado utilizando la velocidad obtenida en la sección 4, y la distancia recorrida desde el paradero de subida al paradero de bajada.
  2. El tiempo de caminata, estimado a partir de la distancia entre la posición de la siguiente transacción de la tarjeta y el paradero de bajada.

El tiempo final corresponde al valor mínimo entre todos los tiempos de viaje calculados para cada paradero ubicado aguas abajo del paradero de la zona paga. Expresado en pseudo codigo:


// Inicializar variables
min_valor ← ∞                            // Mínimo valor encontrado
paradero_optimo ← NULL                  // Paradero asociado al mínimo
lista_paraderos ← [lista de paraderos]  // Paraderos aguas abajo
velocidad_caminata ← 1.5 m/s (5.4 km/h)

// Iterar sobre los paraderos
para cada paradero_bajada en lista_paraderos:
    // Calcular tiempo en vehículo
    tiempo_vehiculo ← distancia(paradero_bajada - paradero_subida) / velocidad

    // Calcular tiempo de caminata
    tiempo_caminata ← distancia_caminata(paradero_bajada) / velocidad_caminata

    // Calcular tiempo total
    tiempo_total ← tiempo_vehiculo + tiempo_caminata

    // Actualizar el mínimo si es necesario
    si tiempo_total < min_valor:
        min_valor ← tiempo_total
        paradero_optimo ← paradero_bajada

// Retornar resultados
retornar min_valor, paradero_optimo

6. Limpieza de líneas

En base a los procesos 3, 4 y 5, se realiza una limpieza de los servicios que por algún motivo no pudieron ser obtenidos o calculados sus datos de frecuencia, velocidad y tiempo de viaje.Generando una nueva lista de servicios factibles para bajada.

7. Cálculo de líneas comunes

Con la nueva lista de servicios factibles se da paso al cálculo de líneas comunes, para esto se realiza un ordenamiento ascendente de las líneas en base a su tiempo de viaje, y luego un procedimiento descrito con el siguiente pseudo código:

// Ordenar la lista de líneas usando el tiempo de viaje
ordenar(lineas, criterio: myobject)

// Inicializar variables
numerador ← 0.0
denominador ← 0.0
ultimo_TVE ← infinito  // Representa el máximo valor de float
umbral_espera_humana ← 0.2

// Iterar sobre las líneas
para cada linea en lineas:
    // Calcular el tiempo de viaje (tv) en horas
    tv ← linea.tv / 3600.0

    // Actualizar numerador y denominador con los valores actuales
    numerador ← numerador + (tv * linea.frecuencia)
    denominador ← denominador + linea.frecuencia

    // Calcular el tiempo promedio esperado (TVE)
    TVE ← (numerador + 0.5) / denominador

    // Calcular la variación relativa respecto al último TVE
    variacion ← (tv - ultimo_TVE) / ultimo_TVE

    si es la primera línea (linea == primera_linea):
        // Actualizar último TVE y añadir la línea a la lista de líneas comunes
        ultimo_TVE ← TVE
        añadir(lineas_comunes, linea)

    sino:
        si tv > ultimo_TVE:
            si variacion ≤ umbral_espera_humana:
                // Actualizar último TVE y añadir la línea a la lista de líneas comunes
                ultimo_TVE ← TVE
                añadir(lineas_comunes, linea)
            sino:
                // Detener la iteración si el umbral se supera
                romper
        sino:
            // Actualizar último TVE y añadir la línea a la lista de líneas comunes
            ultimo_TVE ← TVE
            añadir(lineas_comunes, linea)

8. Obtener bus más probable

Para poder asignar el bus de subida, o el mas probable se realizan los siguientes pasos:


// Inicializar variables
bus_optimo ← 0.0
tiempo_minimo ← ∞

// Iterar sobre las líneas
para cada linea de lineas_comunes:
    para cada expedicion de la linea:
    // Se obtiene capacidad máxima del bus, si no existe se asigna 200
    capacidad_maxima ← bus.capacidad
    si tiempo validacion - 3 horas < inicio de la expedicion Y inicio de la expedicion < tiempo validaciones + 1 hora:
        // Para la pasada por la parada de subida de esa expedicion
        si el tiempo de pasada >= tiempo de validacion Y tiempo_minimo > tiempo de pasada Y subidas_temporal < capacidad_maxima:
            tiempo_minimo ← tiempo de pasada
            bus_optimo ← patente del bus

Si se encuentra un bus optimo:
    subidas_temporal ← subidas_temporal + 1
Si no:
    // Etapa queda sin estimacion de bajada

9. Estimación de pulso GPS de bajada

Una vez estimado el bus de subida, se procede a estimar la bajada de la etapa. Para ello, se emplea el mismo procedimiento utilizado para la estimación de bajada en el modo bus. Se realiza un recorrido a lo largo de la trayectoria del bus, desde el tiempo de subida hasta dos horas después. Para cada pulso GPS, se calcula el tiempo generalizado, seleccionando finalmente el pulso con el valor más bajo.

Este cálculo se realiza de la siguiente manera:


// Inicializar variables
tiempo_generalizado_minimo ← ∞
gps_bajada = NULO

// Iterar sobre los pulsos gps
// Para los casos de ultima etapa del dia, no se considera ni el calculo ni las condiciones con tiempo_trasbordo
para cada pulso gps:
    distancia_caminata ← distancia entre la posición de la siguiente transacción y la posición del pulso gps
    tiempo_generalizado = (distancia_caminata / 1.5) * 2.5 + pulso_gps.tiempo
    tiempo_caminata = distancia_caminata / 1.5
    tiempo_trasbordo = tiempo siguiente transacción - pulso_gps.tiempo


    si tiempo_generalizado < tiempo_generalizado_minimo y distancia_caminata <= 1.000 metros && tiempo_trasbordo - tiempo_caminata > 0:
        indice_minimo = indice
        gps_bajada = pulso_gps

    si  pulso_gps.tiempo - tiempo_subida > 2 horas o tiempo_trasbordo < 0)
        break

Si se encuentra tiempo_trasbordo:
    retorna gps_bajada
Si no:
    // Etapa queda sin estimacion de bajada

10. Estimación de paradero de bajada

Con el GPS de bajada estimado, se procede al cálculo de la estimación del paradero de bajada. Para ello, se busca el paradero más cercano a la posición del pulso GPS de bajada. Si no se encuentra ningún paradero a menos de 500 metros, se considera que el paradero de bajada no tiene estimación.