pgr_dijkstraCost

pgr_dijkstraCost - Costo total de los caminos más cortos usando el algoritmo de Dijkstra.

_images/boost-inside.jpeg

Adentro: Boost Graph

Disponibilidad

  • Versión 3.1.0

  • Version 2.2.0

    • Nueva función Oficial

Descripción

La función pgr_dijkstraCost function sumarizes el costo de los caminos más cortos usando el algoritmo de Dijkstra.

Algoritmo de Dijkstra, concebido por el informático holandés Edsger Dijkstra en 1956. Es un algoritmo de búsqueda en grafos que resuelve el problema de ruta más corta para un grafo con costos de aristas no negativos, produciendo la ruta más corta desde un vértice inicial a un vértice final . Esta implementación se puede utilizar con un grafos dirigidos y no dirigidos.

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

    • Valor no negativo en una columna de costo se interpreta como la arista no exite.

  • Los valores se devuelven cuando hay una ruta.

  • Cuando no hay ruta:

    • Cuando el vértice de salida y el vértice destino son iguales.

      • El costo agregado de los valores no incluídos \((v, v)\) es \(0\)

    • Cuando el vértice de salida y el vértice destino son diferentes y no hay ninguna ruta:

      • El costo agregado de los valores no incluídos \((u, v)\) es :math: infty

  • Para fines de optimización, se ignora cualquier valor duplicado en los vertices de salida o destino.

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

  • No devuelve una ruta.

  • Devuelve la suma de los costos de la ruta más corta para cada par de combinación de nodos requeridos.

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

  • Dependiendo de la función y sus parámetros, los resultados pueden ser simétricos.

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

  • Se omite cualquier valor duplicado en los identificadores de vertices de inicio y destino.

  • Los valores regresados se ordenan:

    • start_vid ascendente

    • end_vid ascendente

Firmas

Resumen

pgr_dijkstraCost(SQL de aristas, salida, destino, [directed])
pgr_dijkstraCost(SQL de aristas, salida, destinos, [directed])
pgr_dijkstraCost(SQL de aristas, salidas, destino, [directed])
pgr_dijkstraCost(SQL de aristas, salidas, destinos, [directed])
pgr_dijkstraCost(SQL de aristas, SQL de combinaciones, [directed])
Regresa conjunto de (start_vid, end_vid, agg_cost)
OR EMPTY SET

Uno a Uno

pgr_dijkstraCost(SQL de aristas, salida, destino, [directed])

Regresa conjunto de (start_vid, end_vid, agg_cost)
OR EMPTY SET
Ejemplo:

Del vértice \(6\) al vértice \(10\) en un grafo dirigido

SELECT * FROM pgr_dijkstraCost(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  6, 10, true);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         6 |      10 |        5
(1 row)

Uno a Muchos

pgr_dijkstraCost(SQL de aristas, salida, destinos, [directed])

Regresa conjunto de (start_vid, end_vid, agg_cost)
OR EMPTY SET
Ejemplo:

Del vértice \(6\) a los vértices \(\{10, 17\}\) en un grafo dirigido

SELECT * FROM pgr_dijkstraCost(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  6, ARRAY[10, 17]);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         6 |      10 |        5
         6 |      17 |        4
(2 rows)

Muchos a Uno

pgr_dijkstraCost(SQL de aristas, salidas, destino, [directed])

Regresa conjunto de (start_vid, end_vid, agg_cost)
OR EMPTY SET
Ejemplo:

De los vértices \(\{6, 1\}\) al vertice \(17\) en un grafo dirigido

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

Muchos a Muchos

pgr_dijkstraCost(SQL de aristas, salidas, destinos, [directed])

Regresa conjunto de (start_vid, end_vid, agg_cost)
OR EMPTY SET
Ejemplo:

De los vértices \(\{6, 1\}\) a los vértices \(\{10, 17\}\) en un grafo no dirigido

SELECT * FROM pgr_dijkstraCost(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  ARRAY[6, 1], ARRAY[10, 17],
  directed => false);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         1 |      10 |        4
         1 |      17 |        5
         6 |      10 |        1
         6 |      17 |        4
(4 rows)

Combinaciones

pgr_dijkstraCost(SQL de aristas, SQL de combinaciones, [directed])

Regresa conjunto de (start_vid, end_vid, agg_cost)
OR EMPTY SET
Ejemplo:

Usando una tabla de combinaciones en un grafo no dirigido

La tabla de combinaciones:

SELECT source, target FROM combinations;
 source | target
--------+--------
      5 |      6
      5 |     10
      6 |      5
      6 |     15
      6 |     14
(5 rows)

La consulta:

SELECT * FROM pgr_dijkstraCost(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  'SELECT source, target FROM combinations',
  false);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         5 |       6 |        1
         5 |      10 |        2
         6 |       5 |        1
         6 |      15 |        2
(4 rows)

Parámetros

Columna

Tipo

Descripción

SQL de aristas

TEXT

SQL de aristas como se describe a continuación

SQL de combinaciones

TEXT

SQL de combinaciones como se describe a abajo

salida

BIGINT

Identificador del vértice inicial de la ruta.

salidas

ARRAY[BIGINT]

Arreglo de identificadores de vértices iniciales.

destino

BIGINT

Identificador del vértice final de la ruta.

destinos

ARRAY[BIGINT]

Arreglo de identificadores de vértices finales.

Parámetros opcionales

Columna

Tipo

x Defecto

Descripción

directed

BOOLEAN

true

  • Cuando true el gráfo se considera Dirigido

  • Cuando false el gráfo se considera No Dirigido.

Consultas Internas

SQL aristas

Columna

Tipo

x Defecto

Descripción

id

ENTEROS

Identificador de la arista.

source

ENTEROS

Identificador del primer vértice de la arista.

target

ENTEROS

Identificador del segundo vértice de la arista.

cost

FLOTANTES

Peso de la arista (source, target)

reverse_cost

FLOTANTES

-1

Peso de la arista (target, source)

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

Donde:

ENTEROS:

SMALLINT, INTEGER, BIGINT

FLOTANTES:

SMALLINT, INTEGER, BIGINT, REAL, FLOAT

SQL Combinaciones

Parámetro

Tipo

Descripción

source

ENTEROS

Identificador del vértice de salida.

target

ENTEROS

Identificador del vértice de llegada.

Donde:

ENTEROS:

SMALLINT, INTEGER, BIGINT

Columnas de Resultados

Conjunto de (start_vid, end_vid, agg_cost)

Columna

Tipo

Descripción

start_vid

BIGINT

Identificador del vértice de salida.

end_vid

BIGINT

Identificador del vértice destino.

agg_cost

FLOAT

Costo afregado desde start_vid hasta end_vid.

Ejemplos Adicionales

Ejemplo 1:

Demostración de ignorar los valores repertidos, y resultado ordenado.

SELECT * FROM pgr_dijkstraCost(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  ARRAY[7, 10, 15, 10, 10, 15], ARRAY[10, 7, 10, 15]);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         7 |      10 |        4
         7 |      15 |        3
        10 |       7 |        2
        10 |      15 |        3
        15 |       7 |        3
        15 |      10 |        1
(6 rows)

Ejemplo 2:

Haciendo vértices de salida igual que vértices destino

SELECT * FROM pgr_dijkstraCost(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  ARRAY[7, 10, 15], ARRAY[7, 10, 15]);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         7 |      10 |        4
         7 |      15 |        3
        10 |       7 |        2
        10 |      15 |        3
        15 |       7 |        3
        15 |      10 |        1
(6 rows)

Ejemplo 3:

Manualmente asignar combinaciones de vértices.

SELECT * FROM pgr_dijkstraCost(
  'SELECT id, source, target, cost, reverse_cost FROM edges',
  'SELECT * FROM (VALUES (6, 10), (6, 7), (12, 10)) AS combinations (source, target)');
 start_vid | end_vid | agg_cost
-----------+---------+----------
         6 |       7 |        1
         6 |      10 |        5
        12 |      10 |        4
(3 rows)

Ver también

Índices y tablas