pgr_dijkstraCost

pgr_dijkstraCost

Usando el algoritmo Dijkstra implementado por Boost.Graph, extraiga solo el costo agregado de la(s) rutas más cortas encontradas, para la combinación de vértices dada.

_images/boost-inside.jpeg

Adentro: Boost Graph

Disponibilidad

  • Versión 3.1.0

    • Nuevas funciones Propuestas:

      • pgr_dijkstraCost(combinaciones)

  • Version 2.2.0

    • Nueva función Oficial

Descripción

El algoritmo pgr_dijkstraCost es una buena opción para calcular la suma de los costos de la ruta más corta para un subconjunto de pares de nodos del grafo. Hacemos uso de la implementación de dijkstra del Boost cuyo tiempo de ejecución es \(O(V \log V + E)\)

Las principales características son:
  • No devuelve una ruta.

  • Devuelve la suma de los costos de la ruta más corta para la combinación de pares de nodos en el grafo.

  • El proceso se realiza sólo en las aristas con costos positivos.

  • Valores son regresados cuando hay un camino.

    • Los valores devueltos tienen la forma de un conjunto de (start_vid, end_vid, agg_cost).

    • Cuando el vértice inicial y el vértice final son iguales, no hay camino.

      • El agg_cost en los valores no incluidos (v, v) es 0

    • Cuando el vértice inicial y el vértice final son diferentes y no hay ninguna ruta.

      • El agg_cost en los valores no incluidos (u, v) es \(\infty\)

  • Sea el caso, los valores devueltos se almacenan en una tabla, por lo que el índice único sería el par: “(start_vid, end_vid)”.

  • Para grafos no dirigidos, los resultados son simétricos.

    • El agg_cost de (u, v) es el mismo que para (v, u).

  • Se omite cualquier valor duplicado en start_vids o end_vids.

  • Los valores regresados se ordenan:

    • start_vid ascendente

    • end_vid ascendente

  • Tiempo de ejecución: \(O(| start\_vids | * (V \log V + E))\)

Firmas

Resumen

pgr_dijkstraCost(edges_sql, from_vid,  to_vid  [, directed])
pgr_dijkstraCost(edges_sql, from_vid,  to_vids [, directed])
pgr_dijkstraCost(edges_sql, from_vids, to_vid  [, directed])
pgr_dijkstraCost(edges_sql, from_vids, to_vids [, directed])
pgr_dijkstraCost(edges_sql, combinations_sql   [, directed]) -- Proposed on v3.1
RETURNS SET OF (start_vid, end_vid, agg_cost)
OR EMPTY SET

Uso de valores predeterminados

pgr_dijkstraCost(edges_sql, from_vid,  to_vid)
RETURNS SET OF (start_vid, end_vid, agg_cost)
OR EMPTY SET
Ejemplo

Del vértice \(2\) al vértice \(3\) en un grafo dirigido

SELECT * FROM pgr_dijkstraCost(
    'select id, source, target, cost, reverse_cost from edge_table',
    2, 3);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         2 |       3 |        5
(1 row)

Uno a Uno

pgr_dijkstraCost(edges_sql, from_vid,  to_vid  [, directed])
RETURNS SET OF (start_vid, end_vid, agg_cost)
OR EMPTY SET
Ejemplo

Del vértice \(2\) al vértice \(3\) en un grafo no dirigido

SELECT * FROM pgr_dijkstraCost(
    'select id, source, target, cost, reverse_cost from edge_table',
    2, 3, false);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         2 |       3 |        1
(1 row)

Uno a Muchos

pgr_dijkstraCost(edges_sql, from_vid,  to_vids [, directed])
RETURNS SET OF (start_vid, end_vid, agg_cost)
OR EMPTY SET
Ejemplo

Del vértice \(2\) a los vértices \(\{3, 11\}\) en un grafo dirigido

SELECT * FROM pgr_dijkstraCost(
    'select id, source, target, cost, reverse_cost from edge_table',
    2, ARRAY[3, 11]);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         2 |       3 |        5
         2 |      11 |        3
(2 rows)

Muchos a Uno

pgr_dijkstraCost(edges_sql, from_vids, to_vid  [, directed])
RETURNS SET OF (start_vid, end_vid, agg_cost)
OR EMPTY SET
Ejemplo

De los vértices \(\{2, 7\}\) al vértice \(3\) en un grafo dirigido

SELECT * FROM pgr_dijkstraCost(
    'select id, source, target, cost, reverse_cost from edge_table',
    ARRAY[2, 7], 3);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         2 |       3 |        5
         7 |       3 |        6
(2 rows)

Muchos a Muchos

pgr_dijkstraCost(edges_sql, from_vids, to_vids [, directed])
RETURNS SET OF (start_vid, end_vid, agg_cost)
OR EMPTY SET
Ejemplo

De los vértice​s \(\{2, 7\}\) a los vértice​s \(\{3, 11\}\) en un grafo dirigido

SELECT * FROM pgr_dijkstraCost(
    'select id, source, target, cost, reverse_cost from edge_table',
    ARRAY[2, 7], ARRAY[3, 11]);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         2 |       3 |        5
         2 |      11 |        3
         7 |       3 |        6
         7 |      11 |        4
(4 rows)

Combinaciones

pgr_dijkstraCost(TEXT edges_sql, TEXT combination_sql, BOOLEAN directed:=true);
RETURNS SET OF (start_vid, end_vid, agg_cost)
OR EMPTY SET
Ejemplo

Uso de una tabla de combinaciones en un grafo no direccionado

SELECT * FROM pgr_dijkstraCost(
    'SELECT id, source, target, cost, reverse_cost FROM edge_table',
    'SELECT source, target FROM combinations_table',
    FALSE
);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         1 |       2 |        1
         1 |       4 |        3
         2 |       1 |        1
         2 |       4 |        2
(4 rows)

Parámetros

Parámetro

Tipo

Valores predeterminados

Descripción

Edges SQL

TEXT

Edges query como se describe a continuación

Combinaciones SQL

TEXT

Combinations query como se describe a continuación

start_vid

BIGINT

Identificador del vértice inicial de la ruta.

start_vids

ARRAY[BIGINT]

Arreglo de identificadores de vértices iniciales.

end_vid

BIGINT

Identificador del vértice final de la ruta.

end_vids

ARRAY[BIGINT]

Arreglo de identificadores de vértices finales.

dirigido

BOOLEAN

true

  • Cuando true el gráfo se considera Dirigido

  • Cuando false el gráfo se considera No Dirigido

Consulta interna

Consulta de aristas

Columna

Tipo

Valores predeterminados

Descripción

id

ANY-INTEGER

Identificador de la arista.

origen

ANY-INTEGER

Identificador del primer punto final en el vértice de la arista.

objetivo

ANY-INTEGER

Identificador del segundo punto final en el vértice de la arista.

cost

ANY-NUMERICAL

Peso de la arista (source, target)

  • Cuando es negativo: la arista (source, target) no existe, por lo tanto no es parte del grafo.

reverse_cost

ANY-NUMERICAL

-1

Peso de la arista (target, source),

  • En caso negativo: la arista (target, source) no existe, por lo tanto no es parte del grafo.

Donde:

ANY-INTEGER

SMALLINT, INTEGER, BIGINT

ANY-NUMERICAL

SMALLINT, INTEGER, BIGINT, REAL, FLOAT

Consulta de combinaciones

Columna

Tipo

Valores predeterminados

Descripción

origen

ANY-INTEGER

Identificador del primer punto final en el vértice de la arista.

objetivo

ANY-INTEGER

Identificador del segundo punto final en el vértice de la arista.

Donde:

ANY-INTEGER

SMALLINT, INTEGER, BIGINT

Columnas de Devoluciones

Devuelve SET OF (start_vid, end_vid, agg_cost)

Columna

Tipo

Descripción

start_vid

BIGINT

Identificador del vértice inicial.

end_vid

BIGINT

Identificador del vértice final.

agg_cost

FLOAT

Coste agregado de start_vid a end_vid.

Ejemplos Adicionales

Ejemplo 1

La demostración de valores repetidos se omite y el resultado se ordena.

SELECT * FROM pgr_dijkstraCost(
        'select id, source, target, cost, reverse_cost from edge_table',
            ARRAY[5, 3, 4, 3, 3, 4], ARRAY[3, 5, 3, 4]);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         3 |       4 |        3
         3 |       5 |        2
         4 |       3 |        1
         4 |       5 |        3
         5 |       3 |        4
         5 |       4 |        3
(6 rows)

Ejemplo 2

Haciendo start_vids igual que end_vids

SELECT * FROM pgr_dijkstraCost(
        'select id, source, target, cost, reverse_cost from edge_table',
            ARRAY[5, 3, 4], ARRAY[5, 3, 4]);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         3 |       4 |        3
         3 |       5 |        2
         4 |       3 |        1
         4 |       5 |        3
         5 |       3 |        4
         5 |       4 |        3
(6 rows)

Ejemplo 3

Cuatro combinaciones de vértices asignados manualmente (origen, destino)

SELECT * FROM pgr_dijkstraCost(
    'SELECT id, source, target, cost FROM edge_table',
    'SELECT * FROM (VALUES (2, 3), (2, 5), (11, 3), (11, 5)) AS combinations (source, target)',
    FALSE
);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         2 |       3 |        3
         2 |       5 |        1
        11 |       3 |        2
        11 |       5 |        2
(4 rows)

Ver también

Índices y tablas