¿Por qué pgRouting no devuelve el mejor camino?


9

Deje la siguiente parte de un gráfico:

ingrese la descripción de la imagen aquí Cuando uso la función shortest_path entre los puntos A y B, obtuve la ruta azul. ¿Por qué pasó esto?


En la explicación, cometí un error, es rojo azul no rojo, ¡lo siento!
José Alejandro

Respuestas:


7

Así es como se comporta shortest_path (algoritmo de Dijkstra) en pgRouting. Si hay dos bordes con el mismo origen y destino, se utiliza uno aleatorio (para ser precisos: el primero, que sale de la base de datos). No conozco ninguna solución para eso, pero hay algunas soluciones.

Si es posible, debe dividir uno de esos bordes en dos. No lo he probado, pero debería corregir ese comportamiento.

Otra solución para el caso, cuando no puede modificar su conjunto de datos. Agregue el campo 'short_alternative' a su tabla. Consulta de muestra, modifíquela según sus necesidades. Espero que explique la idea:

UPDATE roads t1
SET shorter_alternative = t2.id
FROM roads t2
WHERE 
((t2.source = t1.source AND t2.target = t1.target) OR
(t2.source = t1.target AND t2.target = t1.source)) AND
(t2.length < t1.length)

Ahora, el borde '0.098' contendrá la identificación del borde '0.011'. Todos los demás bordes tendrán un valor nulo en el campo más corto_alternativo. Después de haber realizado la consulta shortest_path, verifique el conjunto de datos devuelto; si alguna de las filas tiene un campo más corto_alternativo, cámbielo.


2

El problema ya se ha descrito en la respuesta anterior. Es un problema de algoritmos de ruta más corta "basados ​​en vértices", que solo se preocupan por el origen y el destino.

Hay un ticket en el rastreador de problemas y una posible solución para cambiar la implementación del algoritmo: https://github.com/pgRouting/pgrouting/issues/34 (Sería bueno si alguien pudiera probar esto y enviar una solicitud de extracción; - )

Otra posibilidad es dividir los "enlaces de carreteras paralelas" como se mencionó anteriormente. O puede utilizar el algoritmo Shooting Star, que se enruta de borde a borde para que "sepa" sobre ambos enlaces de carretera.

O puede intentar ordenar la red de carreteras por costo y luego seleccionar solo combinaciones distintas de origen y destino:

SELECT * FROM shortest_path(
  'SELECT DISTINCT ON (source, target)
      gid as id,
      source::integer,
      target::integer,
      cost::double precision
    FROM ways ORDER BY source, target, cost',
  true,false
);

Esto supone que busca la ruta menos costosa. De lo contrario, debes hacerlo ORDER BY ... DESC.

Debe probar si esto afecta el rendimiento.


Ayer construí la función trsp y parece que no tengo este problema. De todos modos, gracias por la explicación !!!.
José Alejandro

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.