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.
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értices \(\{2, 7\}\) a los vértices \(\{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 |
|
Edges query como se describe a continuación |
|
Combinaciones SQL |
|
Combinations query como se describe a continuación |
|
start_vid |
|
Identificador del vértice inicial de la ruta. |
|
start_vids |
|
Arreglo de identificadores de vértices iniciales. |
|
end_vid |
|
Identificador del vértice final de la ruta. |
|
end_vids |
|
Arreglo de identificadores de vértices finales. |
|
dirigido |
|
|
|
Consulta interna¶
Consulta de aristas¶
Columna |
Tipo |
Valores predeterminados |
Descripción |
---|---|---|---|
id |
|
Identificador de la arista. |
|
origen |
|
Identificador del primer punto final en el vértice de la arista. |
|
objetivo |
|
Identificador del segundo punto final en el vértice de la arista. |
|
cost |
|
Peso de la arista (source, target)
|
|
reverse_cost |
|
-1 |
Peso de la arista (target, source),
|
Donde:
- ANY-INTEGER
SMALLINT, INTEGER, BIGINT
- ANY-NUMERICAL
SMALLINT, INTEGER, BIGINT, REAL, FLOAT
Consulta de combinaciones¶
Columna |
Tipo |
Valores predeterminados |
Descripción |
---|---|---|---|
origen |
|
Identificador del primer punto final en el vértice de la arista. |
|
objetivo |
|
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 |
|
Identificador del vértice inicial. |
end_vid |
|
Identificador del vértice final. |
agg_cost |
|
Coste agregado de |
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