pgr_dijkstraCost
¶
pgr_dijkstraCost
- Coste total del camino más corto utilizando el algoritmo de Dijkstra.
Disponibilidad
Versión 3.1.0
Nueva firma propuesta:
pgr_dijkstraCost
(Combinaciones)
Version 2.2.0
Nueva función Oficial
Descripción¶
La función pgr_dijkstraCost
suma el coste del camino más corto utilizando 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
ascendenteend_vid
ascendente
Firmas¶
Resumen
directed
])directed
])directed
])directed
])(start_vid, end_vid, agg_cost)
Uno a Uno¶
pgr_dijkstraCost(SQL de aristas, salida, destino, [directed
])
(start_vid, end_vid, agg_cost)
- 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
])
(start_vid, end_vid, agg_cost)
- 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
])
(start_vid, end_vid, agg_cost)
- 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
])
(start_vid, end_vid, agg_cost)
- 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
])
(start_vid, end_vid, agg_cost)
- 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 como se describe a continuación |
|
|
SQL de combinaciones como se describe a abajo |
|
salida |
|
Identificador del vértice inicial de la ruta. |
salidas |
|
Arreglo de identificadores de vértices iniciales. |
destino |
|
Identificador del vértice final de la ruta. |
destinos |
|
Arreglo de identificadores de vértices finales. |
Parámetros opcionales¶
Columna |
Tipo |
x Defecto |
Descripción |
---|---|---|---|
|
|
|
|
Consultas Internas¶
SQL aristas¶
Columna |
Tipo |
x Defecto |
Descripción |
---|---|---|---|
|
ENTEROS |
Identificador de la arista. |
|
|
ENTEROS |
Identificador del primer vértice de la arista. |
|
|
ENTEROS |
Identificador del segundo vértice de la arista. |
|
|
FLOTANTES |
Peso de la arista ( |
|
|
FLOTANTES |
-1 |
Peso de la arista (
|
Donde:
- ENTEROS:
SMALLINT
,INTEGER
,BIGINT
- FLOTANTES:
SMALLINT
,INTEGER
,BIGINT
,REAL
,FLOAT
SQL Combinaciones¶
Parámetro |
Tipo |
Descripción |
---|---|---|
|
ENTEROS |
Identificador del vértice de partida. |
|
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 |
---|---|---|
|
|
Identificador del vértice de salida. |
|
|
Identificador del vértice final. |
|
|
Costo afregado desde |
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