pgr_bdDijkstraCost
¶
pgr_bdDijkstraCost
— Devuelve la ruta(s) más corta utilizando el algoritmo de Dijkstra Bidireccional.
Disponibilidad
Versión 3.2.0
Nueva firma propuesta:
pgr_bdDijkstraCost
(Combinaciones)
Versión 3.0.0
Función oficial
Versión 2.5.0
Nueva función propuesta
Descripción¶
La función pgr_bdDijkstraCost
sumarisa el costo de la ruta más corta utilizando el algoritmo de bidirecional de Dijkstra.
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 (peor de los casos): \(O((V \log V + E))\)
Para grandes gráficos donde hay un camino entre el vértice inicial y el vértice final:
Se espera que termine más rápido que pgr_dijkstra
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¶
directed
])(start_vid, end_vid, agg_cost)
- Ejemplo:
Del vértice \(6\) al vértice \(10\) en un grafo dirigido
SELECT * FROM pgr_bdDijkstraCost(
'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¶
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_bdDijkstraCost(
'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¶
directed
])(start_vid, end_vid, agg_cost)
- Ejemplo:
De los vértices \(\{6, 1\}\) al vertice \(17\) en un grafo dirigido
SELECT * FROM pgr_bdDijkstraCost(
'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¶
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_bdDijkstraCost(
'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¶
(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_bdDijkstraCost(
'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 salida. |
|
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 destino. |
|
|
Costo afregado desde |
Ejemplos Adicionales¶
- Ejemplo 1:
Demostración de ignorar los valores repertidos, y resultado ordenado.
SELECT * FROM pgr_bdDijkstraCost(
'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 vids iniciales los mismos que vids destinos.
SELECT * FROM pgr_bdDijkstraCost(
'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_bdDijkstraCost(
'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