pgr_maxFlowMinCost - Experimental - pgRouting Manual (3.2)
pgr_maxFlowMinCost - Experimental
pgr_maxFlowMinCost
- Calculates the flow on the graph edges that maximizes
the flow and minimizes the cost from the sources to the targets.
Warning
Possible server crash
-
These functions might create a server crash
Warning
Experimental functions
-
They are not officially of the current release.
-
They likely will not be officially be part of the next release:
-
The functions might not make use of ANY-INTEGER and ANY-NUMERICAL
-
Name might change.
-
Signature might change.
-
Functionality might change.
-
pgTap tests might be missing.
-
Might need c/c++ coding.
-
May lack documentation.
-
Documentation if any might need to be rewritten.
-
Documentation examples might need to be automatically generated.
-
Might need a lot of feedback from the comunity.
-
Might depend on a proposed function of pgRouting
-
Might depend on a deprecated function of pgRouting
-
Availability
-
Version 3.2.0
-
New experimental function:
-
pgr_maxFlowMinCost(Combinations)
-
-
-
Version 3.0.0
-
New experimental function
Description
The main characteristics are:
-
The graph is directed .
-
Process is done only on edges with positive capacities.
-
When the maximum flow is 0 then there is no flow and EMPTY SET is returned.
-
There is no flow when a source is the same as a target .
-
-
Any duplicated value in the source(s) or target(s) are ignored.
-
Calculates the flow/residual capacity for each edge. In the output
-
Edges with zero flow are omitted.
-
-
Creates a super source and edges to all the source(s), and a super target and the edges from all the targets(s).
-
The maximum flow through the graph is guaranteed to be the value returned by pgr_maxFlow when executed with the same parameters and can be calculated:
-
By aggregation of the outgoing flow from the sources
-
By aggregation of the incoming flow to the targets
-
-
TODO check which statement is true:
-
The cost value of all input edges must be nonnegative.
-
Process is done when the cost value of all input edges is nonnegative.
-
Process is done on edges with nonnegative cost.
-
-
Running time: \(O(U * (E + V * logV))\)
-
where \(U\) is the value of the max flow.
-
\(U\) is upper bound on number of iterations. In many real world cases number of iterations is much smaller than \(U\) .
-
Signatures
Summary
pgr_maxFlowMinCost(Edges SQL, source, target)
pgr_maxFlowMinCost(Edges SQL, sources, target)
pgr_maxFlowMinCost(Edges SQL, source, targets)
pgr_maxFlowMinCost(Edges SQL, sources, targets)
pgr_maxFlowMinCost(Edges SQL, Combinations SQL) -- Experimental on v3.2
RETURNS SET OF (seq, edge, source, target, flow, residual_capacity, cost, agg_cost)
OR EMPTY SET
One to One
pgr_maxFlowMinCost(Edges SQL, source, target)
RETURNS SET OF (seq, edge, source, target, flow, residual_capacity, cost, agg_cost)
OR EMPTY SET
- Example :
-
From vertex \(2\) to vertex \(3\)
SELECT * FROM pgr_MaxFlowMinCost(
'SELECT id,
source, target,
capacity, reverse_capacity,
cost, reverse_cost FROM edge_table',
2, 3
);
seq edge source target flow residual_capacity cost agg_cost
-----+------+--------+--------+------+-------------------+------+----------
1 4 2 5 80 20 80 80
2 3 4 3 80 50 80 160
3 8 5 6 80 20 80 240
4 9 6 9 80 50 80 320
5 16 9 4 80 0 80 400
(5 rows)
One to Many
pgr_maxFlowMinCost(Edges SQL, source, targets)
RETURNS SET OF (seq, edge, source, target, flow, residual_capacity, cost, agg_cost)
OR EMPTY SET
- Example :
-
From vertex \(13\) to vertices \(\{7, 1, 4\}\)
SELECT * FROM pgr_MaxFlowMinCost(
'SELECT id,
source, target,
capacity, reverse_capacity,
cost, reverse_cost FROM edge_table',
13, ARRAY[7, 1, 4]
);
seq edge source target flow residual_capacity cost agg_cost
-----+------+--------+--------+------+-------------------+------+----------
1 1 2 1 50 80 50 50
2 4 5 2 50 0 50 100
3 16 9 4 50 30 50 150
4 10 10 5 50 0 50 200
5 12 10 11 50 50 50 250
6 13 11 12 50 50 50 300
7 15 12 9 50 0 50 350
8 14 13 10 100 30 100 450
(8 rows)
Many to One
pgr_maxFlowMinCost(Edges SQL, sources, target)
RETURNS SET OF (seq, edge, source, target, flow, residual_capacity, cost, agg_cost)
OR EMPTY SET
- Example :
-
From vertices \(\{1, 7, 14\}\) to vertex \(12\)
SELECT * FROM pgr_MaxFlowMinCost(
'SELECT id,
source, target,
capacity, reverse_capacity,
cost, reverse_cost FROM edge_table',
ARRAY[1, 7, 14], 12
);
seq edge source target flow residual_capacity cost agg_cost
-----+------+--------+--------+------+-------------------+------+----------
1 1 1 2 80 0 80 80
2 4 2 5 80 20 80 160
3 8 5 6 100 0 100 260
4 10 5 10 30 100 30 290
5 9 6 9 50 80 50 340
6 11 6 11 50 80 50 390
7 6 7 8 50 0 50 440
8 7 8 5 50 0 50 490
9 15 9 12 50 30 50 540
10 12 10 11 30 70 30 570
11 13 11 12 80 20 80 650
(11 rows)
Many to Many
pgr_maxFlowMinCost(Edges SQL, sources, targets)
RETURNS SET OF (seq, edge, source, target, flow, residual_capacity, cost, agg_cost)
OR EMPTY SET
- Example :
-
From vertices \(\{7, 13\}\) to vertices \(\{3, 9\}\)
SELECT * FROM pgr_MaxFlowMinCost(
'SELECT id,
source, target,
capacity, reverse_capacity,
cost, reverse_cost FROM edge_table',
ARRAY[7, 13], ARRAY[3, 9]
);
seq edge source target flow residual_capacity cost agg_cost
-----+------+--------+--------+------+-------------------+------+----------
1 8 5 6 100 0 100 100
2 9 6 9 100 30 100 200
3 6 7 8 50 0 50 250
4 7 8 5 50 0 50 300
5 10 10 5 50 0 50 350
6 12 10 11 50 50 50 400
7 13 11 12 50 50 50 450
8 15 12 9 50 0 50 500
9 14 13 10 100 30 100 600
(9 rows)
Combinations
pgr_maxFlowMinCost(Edges SQL, Combinations SQL)
RETURNS SET OF (seq, edge, source, target, flow, residual_capacity, cost, agg_cost)
OR EMPTY SET
- Example :
-
Using a combinations table, equivalent to calculating result from vertices \(\{7, 13\}\) to vertices \(\{3, 9\}\) .
SELECT * FROM pgr_MaxFlowMinCost(
'SELECT id,
source, target,
capacity, reverse_capacity,
cost, reverse_cost FROM edge_table',
'SELECT * FROM ( VALUES (7, 3), (13, 9) ) AS t(source, target)'
);
seq edge source target flow residual_capacity cost agg_cost
-----+------+--------+--------+------+-------------------+------+----------
1 8 5 6 100 0 100 100
2 9 6 9 100 30 100 200
3 6 7 8 50 0 50 250
4 7 8 5 50 0 50 300
5 10 10 5 50 0 50 350
6 12 10 11 50 50 50 400
7 13 11 12 50 50 50 450
8 15 12 9 50 0 50 500
9 14 13 10 100 30 100 600
(9 rows)
Parameters
Column |
Type |
Default |
Description |
---|---|---|---|
Edges SQL |
|
Edges query as described in Inner Queries . |
|
Combinations SQL |
|
Combinations query as described in Inner Queries . |
|
source |
|
Identifier of the starting vertex of the flow. |
|
sources |
|
Array of identifiers of the starting vertices of the flow. |
|
target |
|
Identifier of the ending vertex of the flow. |
|
targets |
|
Array of identifiers of the ending vertices of the flow. |
Inner queries
- Edges SQL :
-
an SQL query of a directed graph of capacities, which should return a set of rows with the following columns:
Column |
Type |
Default |
Description |
---|---|---|---|
id |
|
Identifier of the edge. |
|
source |
|
Identifier of the first end point vertex of the edge. |
|
target |
|
Identifier of the second end point vertex of the edge. |
|
capacity |
|
Capacity of the edge (source, target)
|
|
reverse_capacity |
|
-1 |
Capacity of the edge (target, source) ,
|
cost |
|
Weight of the edge (source, target) if it exists. |
|
reverse_cost |
|
0 |
Weight of the edge (target, source) if it exists. |
Where:
- ANY-INTEGER :
-
SMALLINT, INTEGER, BIGINT
- ANY-NUMERICAL :
-
smallint, int, bigint, real, float
- Combinations SQL :
-
an SQL query which should return a set of rows with the following columns:
Column |
Type |
Default |
Description |
---|---|---|---|
source |
|
Identifier of the first end point vertex of the edge. |
|
target |
|
Identifier of the second end point vertex of the edge. |
Where:
- ANY-INTEGER :
-
SMALLINT, INTEGER, BIGINT
The function aggregates the sources and the targets, removes the duplicates, and then it calculates the result from the resultant source vertices to the target vertices.
Result Columns
Column |
Type |
Description |
---|---|---|
seq |
|
Sequential value starting from 1 . |
edge |
|
Identifier of the edge in the original query(edges_sql). |
source |
|
Identifier of the first end point vertex of the edge. |
target |
|
Identifier of the second end point vertex of the edge. |
flow |
|
Flow through the edge in the direction (source, target). |
residual_capacity |
|
Residual capacity of the edge in the direction (source, target). |
cost |
|
The cost of sending this flow through the edge in the direction (source, target). |
agg_cost |
|
The aggregate cost. |
See Also
Indices and tables