pgr_bdDijkstraCostMatrix

pgr_bdDijkstraCostMatrix - Calculates the a cost matrix using pgr_bdDijkstra.

_images/boost-inside.jpeg

Boost Graph Inside

Availability:

  • Version 3.0.0
    • Official function
  • Version 2.5.0
    • New proposed function

Description

The main characteristics are:

  • Process is done only on edges with positive costs.
  • Values are returned when there is a path.
  • When the starting vertex and ending vertex are the same, there is no path.
    • The agg_cost the non included values (v, v) is 0
  • When the starting vertex and ending vertex are the different and there is no path:
    • The agg_cost the non included values (u, v) is \(\infty\)
  • Running time (worse case scenario): \(O((V \log V + E))\)
  • For large graphs where there is a path bewtween the starting vertex and ending vertex:
    • It is expected to terminate faster than pgr_dijkstra
  • Returns a cost matrix.

Signatures

Summary

pgr_bdDijkstraCostMatrix(edges_sql, start_vids [, directed])
RETURNS SET OF (start_vid, end_vid, agg_cost)

Using default

pgr_bdDijkstraCostMatrix(edges_sql, start_vid)
RETURNS SET OF (start_vid, end_vid, agg_cost)
Example:Cost matrix for vertices \(\{1, 2, 3, 4\}\) on a directed graph
SELECT * FROM pgr_bdDijkstraCostMatrix(
    'SELECT id, source, target, cost, reverse_cost FROM edge_table',
    (SELECT array_agg(id) FROM edge_table_vertices_pgr WHERE id < 5)
);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         1 |       2 |        1
         1 |       3 |        6
         1 |       4 |        5
         2 |       1 |        1
         2 |       3 |        5
         2 |       4 |        4
         3 |       1 |        2
         3 |       2 |        1
         3 |       4 |        3
         4 |       1 |        3
         4 |       2 |        2
         4 |       3 |        1
(12 rows)

Complete Signature

pgr_bdDijkstraCostMatrix(edges_sql, start_vids [, directed])
RETURNS SET OF (start_vid, end_vid, agg_cost)
Example:Symmetric cost matrix for vertices \(\{1, 2, 3, 4\}\) on an undirected graph
SELECT * FROM pgr_bdDijkstraCostMatrix(
    'SELECT id, source, target, cost, reverse_cost FROM edge_table',
    (SELECT array_agg(id) FROM edge_table_vertices_pgr WHERE id < 5),
    false
);
 start_vid | end_vid | agg_cost
-----------+---------+----------
         1 |       2 |        1
         1 |       3 |        2
         1 |       4 |        3
         2 |       1 |        1
         2 |       3 |        1
         2 |       4 |        2
         3 |       1 |        2
         3 |       2 |        1
         3 |       4 |        1
         4 |       1 |        3
         4 |       2 |        2
         4 |       3 |        1
(12 rows)

Parameters

Parameter Type Description
edges_sql TEXT Edges SQL query as described above.
start_vids ARRAY[ANY-INTEGER] Array of identifiers of the vertices.
directed BOOLEAN (optional). When false the graph is considered as Undirected. Default is true which considers the graph as Directed.

Inner query

Column Type Default Description
id ANY-INTEGER   Identifier of the edge.
source ANY-INTEGER   Identifier of the first end point vertex of the edge.
target ANY-INTEGER   Identifier of the second end point vertex of the edge.
cost ANY-NUMERICAL  

Weight of the edge (source, target)

  • When negative: edge (source, target) does not exist, therefore it’s not part of the graph.
reverse_cost ANY-NUMERICAL -1

Weight of the edge (target, source),

  • When negative: edge (target, source) does not exist, therefore it’s not part of the graph.

Where:

ANY-INTEGER:SMALLINT, INTEGER, BIGINT
ANY-NUMERICAL:SMALLINT, INTEGER, BIGINT, REAL, FLOAT

Result Columns

Returns SET OF (start_vid, end_vid, agg_cost)

Column Type Description
start_vid BIGINT Identifier of the starting vertex.
end_vid BIGINT Identifier of the ending vertex.
agg_cost FLOAT Aggregate cost from start_vid to end_vid.

Additional Examples

Example:Use with tsp
SELECT * FROM pgr_TSP(
    $$
    SELECT * FROM pgr_bdDijkstraCostMatrix(
        'SELECT id, source, target, cost, reverse_cost FROM edge_table',
        (SELECT array_agg(id) FROM edge_table_vertices_pgr WHERE id < 5),
        false
    )
    $$,
    randomize := false
);
 seq | node | cost | agg_cost
-----+------+------+----------
   1 |    1 |    1 |        0
   2 |    2 |    1 |        1
   3 |    3 |    1 |        2
   4 |    4 |    3 |        3
   5 |    1 |    0 |        6
(5 rows)

See Also

Indices and tables