Subsecciones

Prototipo 3: Cálculo de rutas

Análisis

Descripción

Calcula la ruta mas corta en base a la cantidad de tráfico vial, el sistema calculará la ruta teniendo un origen y un destino, dicha ruta debe mostrarse en el mapa.

Objetivo

Utilizar un algoritmo para estimar rutas mas cortas tomando en cuenta el modelo de tráfico vial.

Características

Restricciones

Estudio de Factibilidad

Para el cálculo de rutas en los mapas, se requiere un módulo de PostgreSQL y una extensión, PostGIS y PgRouting respectivamente. Después de tener los datos recopilados, se requiere de la biblioteca, OpenLayers.

PostGis es un módulo que añade soporte de objetos geográficos a la base de datos, convirtiéndola en una base de datos espacial para la utilización de un GIS.

PgRouting es una extensión para bases de datos geográficas que proporciona herramientas para servicios basados en la localización.

OpenLayers es una biblioteca de javascript de código abierto para mostrar mapas en un navegador web.

Cálculo de rutas mediante PgRouting

PgRouting se utilizará mediante diferentes consultas a la base de PostGIS el cual tiene la estructura para formar el grafo de las calles y pueda realizar un cálculo.

Se creará una serie de consultas a partir de una localización origen a una localización destino con los diferentes algoritmos que contiene el módulo de PgRouting.

Algoritmo de Dijkstra

Algoritmo de Shortest Path de Dijktra hace honor a su creador, Edsger Dijktra, quien diseño el algoritmo en 1959. Este algoritmo de camino mínimo, tiene como finalidad la determinación del camino más corto dado un vértice origen y destino, cada arista tiene un costo.

-Shortest_path

PgRouting proporciona el algoritmo de Dijkstra en la forma de la función shortest_path, cuya especificación es:

CREATE OR REPLACE FUNCTION shortest_path(
  sql text,
  source_id integer
  target_id integer
  directed boolean,
  has_reverse_cost boolean
  ) RETURNS SET OF path_result;

Un ejemplo para este caso sería el siguiente.

SELECT * FROM shortest_path(
  'SELECT the_geom, gid as id, source, target, x1, y1, x2, y2, length as cost, reverse_cost
   FROM ways',
405, 225, false, false);

-Dijkstra_sp

Dijkstra_sp son funciones contenedoras para el cálculo de rutas, es reducir el tiempo de respuesta de PgRouting. Dicho tiempo de respuesta se divide en dos partes: la primera de carga de datos, la segunda de cálculo de resultados. El tiempo de la primera parte depende del tamaño o la cantidad de datos existentes Para reducir este tiempo, el algoritmo debe reducir la cantidad de datos a cargar. Para conseguirlo, se reducen los datos de la carga a la información contenida en un cuadro delimitador, tomando como referencia las posiciones de nodo inicio y fin cuyo camino se pretende calcular. De esta manera, en la primera fase del algoritmo se cargan menos datos, reduciendo así el tiempo total de ejecución del algoritmo.

Es por eso que en pgRouting se concluye que las funciones contenedoras suelen ser siempre más rápidas a comparación del Algoritmo de Dijkstra.

La función dijkstra_sp es una función contenedora de shortest_path, tomando como cuadro delimitador los datos contenidos desde el origen hasta el destino. Esta función tiene mayor eficiencia que la función original shortest_path, aunque los resultados devueltos serán siempre los mismos.

CREATE OR REPLACE FUNCTION dijkstra_sp(
  geom_table character varying,
  source integer,
  target integer
) RETURNS SETOF geoms;

Un ejemplo para este caso sería el siguiente.

SELECT rt.gid, AsText(rt.the_geom) AS wkt, length(rt.the_geom) AS length, 
    ways.gid, ways.source, ways.target
  FROM ways, 
    (SELECT gid, the_geom
      FROM dijkstra_sp('ways',405,225)) as rt
  WHERE ways.gid=rt.gid;

-Dijkstra_sp_delta

La función dijkstra_sp_delta consiste en una versión delta de la función dijkstra_sp. Las funciones delta son análogas a sus predecesoras, con la peculiaridad de que aceptan un parámetro más, llamado precisamente delta, que indica el margen a añadir un cuadro delimitador utilizado por la función. En resumidas cuentas consiste en un margen de error sobre los datos, para no descartar en el proceso alguna vía que de otro modo formaría parte del camino más corto entre los dos puntos. Si no se estableciera un margen correcto, los dos algoritmos podrían retornar resultados diferentes. La especificación de esta función es la siguiente.

CREATE OR REPLACE FUNCTION dijkstra_sp_delta(
  geom_table character varying,
  source integer,
  target integer,
  delta double precision
) RETURNS SETOF geoms;

Un ejemplo para este caso sería el siguiente.

SELECT rt.id, rt.gid, AsText(rt.the_geom) AS wkt, length(rt.the_geom) AS length, ways.gid, 
    ways.source, ways.target
  FROM ways,
  (SELECT id, gid, the_geom 
    FROM dijkstra_sp_delta('ways',405,225,3000)) AS rt
  WHERE ways.gid=rt.gid;

Algoritmo A*

El algoritmo Shortest Path A* es una extensión del algoritmo de Dijkstra usando heurística, con la ventaja de que consigue mejorar la velocidad de cálculo. Una heurística es una función matemática 42#42 que sirve como estimación del coste del camino más económico de un nodo origen hasta el nodo destino. La búsqueda escogerá el nodo que tiene el valor más bajo en la función heurística. La función 42#42 es admisible cuando no supera nunca los costes de encontrar el destino.

-Shortest_path_astar

PgRouting proporciona el algoritmo A* en la forma de la función shortest_path_astar, cuya especificación es la siguiente.

CREATE OR REPLACE FUNCTION shortest_path_astar(
  sql text,
  source_id integer,
  target_id integer,
  directed boolean,
  has_reverse_cost boolean
) RETURNS SETOF path_result;

Un ejemplo para este caso sería el siguiente.

SELECT * from shortest_path_astar(
  'SELECT the_geom, gid AS id, source, target, x1, y1, x2, y2, length AS cost, reverse_cost
  FROM ways', 405, 225, false, false);

-Astar_sp_delta

La función astar_sp_delta es la equivalente a la función shortest_path_astar, en su versión contenedora y con parámetro delta. Su especificación es la siguiente.

CREATE OR REPLACE FUNCTION astar_sp_delta(
  geom_table character varying,
  source integer,
  target integer,
  delta double precision
) RETURNS SETOF geoms;

Un ejemplo para este caso sería el siguiente.

SELECT rt.id, rt.gid, AsText(rt.the_geom) AS wkt, length(rt.the_geom) AS length, 
    ways.gid, ways.source, ways.target
  FROM ways,
  (select id, gid, the_geom from astar_sp_delta('ways',405,225,3000)) AS rt
  WHERE ways.gid=rt.gid;

Algoritmo Shooting Star

El algoritmo Shooting Star calcula entre dos aristas, a diferencia de los dos algoritmos anteriores que realizan los cálculos de vértice a vértice. La ruta calculada mediante este algoritmo devuelve como punto de partida el nodo de inicio de la línea (origen). La particularidad de este algoritmo es que permite añadir restricciones a nivel de vía. Hasta ahora se calculaba el coste de una vía (cost) en función de su longitud (length), sin que por ello consten otras dificultades en el camino, como por ejemplo, semáforos, restricciones de giros prohibidos, etc. Shooting Star pretende tener en cuenta todos estos detalles para calcular las rutas teniendo en cuenta estos impedimentos presentes.

En la base de datos de PgRouting, no existe información alguna en los campos de ways.to_cost y ways.rule, por lo que el cálculo de ruta se está realizando sin tomar ninguna restricción.

-Shortest_path_shooting_star

PgRouting proporciona el algoritmo Shooting Star en la forma de la función

shortest_path_shooting_star, cuya especificación es la siguiente.
CREATE OR REPLACE FUNCTION shortest_path_shooting_star(
  sql text,
  source_id integer,
  target_id integer,
  directed boolean,
  has_reverse_cost boolean
) RETURNS SETOF path_result;

La función devuelve un conjunto de filas, cada una de las cuales corresponde a una línea cruzada, además de una fila adicional que contiene el vértice terminal. La información devuelta por cada fila está formado de:

Un ejemplo para este caso sería el siguiente.

SELECT * from shortest_path_shooting_star(
  'SELECT the_geom, gid AS id, source, target, x1, y1, x2, y2, length AS cost, rule, to_cost
  FROM ways',
  405,225,false,false
);

-Shootingstar_sp

La función shootingstar_sp es la equivalente a la función shortest_path_shooting_star, en su versión contenedora y con parámetro delta. Su especificación es la siguiente.

CREATE OR REPLACE FUNCTION shootingstar_sp(
  geom_table character varying,
  source integer,
  target integer,
  delta double precision,
  cost_field character varying,
  directed boolean,
  has_reverse_cost boolean
) RETURNS SETOF geoms;

Un ejemplo para este caso sería el siguiente.

SELECT rt.id, rt.gid, AsText(rt.the_geom) AS wkt, length(rt.the_geom) AS length, 
    ways.gid, ways.source, ways.target
  FROM ways,
    (SELECT id, gid, the_geom 
      FROM shootingstar_sp('ways',405,225,3000, 'length', false, false)) AS rt
  WHERE ways.gid=rt.gid;

Comparativa y elección

El algoritmo de Shooting Star, que cambia totalmente el concepto de búsqueda, ya que realiza el cálculo sobre las caras o aristas de la topología, y no sobre los vértices. Además, tiene en cuenta las restricciones e impedancias presentes en el sistema. Las restricciones serán cuando existan calles bloqueadas. En base a esto, se elige el algoritmo Shooting Start, el cual tiene las restricciones a diferencia de los demás que no se toman en cuenta las restricciones.

Descripción del cálculo

El algoritmo Shooting Start (electo en base al estudio de factibilidad), el cual requiere una restricción, se utilizará la velocidad promedio de cada segmento de calle que está almacenado en la base de datos. Esta restricción se utliza para calcular el costo de un segmento de la vía o calle. Una calle (primaria, secundaria, terciaria) esta compuesta por segmentos de calles, cada segmento de calle va de una esquina o cruce de otra calle hacia la siguiente esquina o cruce de calle y así pueda formar un grafo. La dirección de cada calle depende del orden del punto origen-destino

El Algoritmo Shooting Start, ocupa un costo y una heurística. Para el costo, será la longitud del segmento de calle y la heurística será el tiempo de trasladarse o cruzar dicho segmento de calle. Para obtener el tiempo de trasladarse (43#43) se requiere la longitud del segmento de la calle (44#44) y la velocidad promedio (45#45) que tiene registrado la base de datos. Quedando como fórmula:


46#46

Para el caso de las calles que sean bloqueados, el valor de la velocidad promedio de la calle, tendrá un valor negativo, entonces el tiempo promedio será un valor negativo.

Sí se requiere bloquear un segmento de calle, es decir, que esté transitable, el valor de la velocidad promedio deberá ser un valor negativo para obtener un tiempo promedio negativo. Cuando se calcule una ruta, y encuentre una calle con costo negativo, no se tomará la calle para formar el grafo con calles transitables.

Diseño

En la figura 6.1 se muestra la arquitectura del prototipo, se agregó el módulo para la obtención de rutas.

Figura 6.1: Arquitectura del Sistema del prototipo 3: Rutas
Image Arquitectura

El diagrama Entidad Relación de la figura 6.2 se modela en base a la documentación de PgRouting, extensión de PostgreSQL, para el cálculo de rutas.

Figura: Diagrama de Entidad Relación del prototipo 3: Rutas
Image P3Modelo_V02_ER

En la figura 6.3 se muestra el diagrama de actividades que representa el procesamiento dinámico del cálculo de las rutas.

Figura 6.3: Diagrama de Actividades del prototipo 3: Rutas
Image P3Ruta_A

Resultados

Capturas

La figura 6.4 es una captura del desarrollo del prototipo cálculo de rutas.

Figura 6.4: Captura del prototipo 3: rutas
Image P3Android_Cap_General_Destino

Pruebas

En esta sección se muestran las gráficas de los resultados al aplicar los protocolos de pruebas que se encuentran en el anexo de este documento. Estos son los resultados de las iteraciones de cada título de prueba hasta cumplir con el 100% de aprobados (OK). Se suma el total OK y NOK de todas las iteraciones.

Figura: Prueba del prototipo 3: Ver usuario y tráfico en el mapa
Image P3_C1.

Figura: Prueba del prototipo 3: Visualización de una ruta con punto de origen y destino
Image P3_C2.
IPN - ESCOM