pgr_edmondsKarp - pgRouting Manual (3.2)
pgr_edmondsKarp
pgr_edmondsKarp
- Calculates the flow on the graph edges that maximizes the flow from the sources to the targets using Push Relabel Algorithm.
Availability
-
Version 3.2.0
-
New proposed function:
-
pgr_edmondsKarp(Combinations)
-
-
-
Version 3.0.0
-
Official function
-
-
Version 2.5.0
-
Renamed from
pgr_maxFlowEdmondsKarp
-
Proposed function
-
-
Version 2.3.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
-
-
Running time: \(O( V * E ^ 2)\)
Signatures
Summary
pgr_edmondsKarp(Edges SQL, source, target)
pgr_edmondsKarp(Edges SQL, sources, target)
pgr_edmondsKarp(Edges SQL, source, targets)
pgr_edmondsKarp(Edges SQL, sources, targets)
pgr_edmondsKarp(Edges SQL, Combinations SQL) -- Proposed on v3.2
RETURNS SET OF (seq, edge, start_vid, end_vid, flow, residual_capacity)
OR EMPTY SET
One to One
pgr_edmondsKarp(Edges SQL, source, target)
RETURNS SET OF (seq, edge, start_vid, end_vid, flow, residual_capacity)
OR EMPTY SET
- Example :
-
From vertex \(6\) to vertex \(11\)
SELECT * FROM pgr_edmondsKarp(
'SELECT id,
source,
target,
capacity,
reverse_capacity
FROM edge_table'
, 6, 11
);
seq edge start_vid end_vid flow residual_capacity
-----+------+-----------+---------+------+-------------------
1 10 5 10 100 30
2 8 6 5 100 30
3 11 6 11 130 0
4 12 10 11 100 0
(4 rows)
One to Many
pgr_edmondsKarp(Edges SQL, source, targets)
RETURNS SET OF (seq, edge, start_vid, end_vid, flow, residual_capacity)
OR EMPTY SET
- Example :
-
From vertex \(6\) to vertices \(\{1, 3, 11\}\)
SELECT * FROM pgr_edmondsKarp(
'SELECT id,
source,
target,
capacity,
reverse_capacity
FROM edge_table'
, 6, ARRAY[1, 3, 11]
);
seq edge start_vid end_vid flow residual_capacity
-----+------+-----------+---------+------+-------------------
1 1 2 1 50 80
2 3 4 3 80 50
3 4 5 2 50 0
4 10 5 10 80 50
5 8 6 5 130 0
6 9 6 9 80 50
7 11 6 11 130 0
8 16 9 4 80 0
9 12 10 11 80 20
(9 rows)
Many to One
pgr_edmondsKarp(Edges SQL, sources, target)
RETURNS SET OF (seq, edge, start_vid, end_vid, flow, residual_capacity)
OR EMPTY SET
- Example :
-
From vertices \(\{6, 8, 12\}\) to vertex \(11\)
SELECT * FROM pgr_edmondsKarp(
'SELECT id,
source,
target,
capacity,
reverse_capacity
FROM edge_table'
, ARRAY[6, 8, 12], 11
);
seq edge start_vid end_vid flow residual_capacity
-----+------+-----------+---------+------+-------------------
1 10 5 10 100 30
2 8 6 5 100 30
3 11 6 11 130 0
4 12 10 11 100 0
(4 rows)
Many to Many
pgr_edmondsKarp(Edges SQL, sources, targets)
RETURNS SET OF (seq, edge, start_vid, end_vid, flow, residual_capacity)
OR EMPTY SET
- Example :
-
From vertices \(\{6, 8, 12\}\) to vertices \(\{1, 3, 11\}\)
SELECT * FROM pgr_edmondsKarp(
'SELECT id,
source,
target,
capacity,
reverse_capacity
FROM edge_table'
, ARRAY[6, 8, 12], ARRAY[1, 3, 11]
);
seq edge start_vid end_vid flow residual_capacity
-----+------+-----------+---------+------+-------------------
1 1 2 1 50 80
2 3 4 3 80 50
3 4 5 2 50 0
4 10 5 10 100 30
5 8 6 5 130 0
6 9 6 9 80 50
7 11 6 11 130 0
8 7 8 5 20 30
9 16 9 4 80 0
10 12 10 11 100 0
(10 rows)
Combinations
pgr_edmondsKarp(Edges SQL, Combinations SQL)
RETURNS SET OF (seq, edge, start_vid, end_vid, flow, residual_capacity)
OR EMPTY SET
- Example :
-
Using a combinations table, equivalent to calculating result from vertices \(\{6, 8, 12\}\) to vertices \(\{1, 3, 11\}\) .
SELECT * FROM pgr_edmondsKarp(
'SELECT id,
source,
target,
capacity,
reverse_capacity
FROM edge_table',
'SELECT * FROM ( VALUES (6, 1), (8, 3), (12, 11), (8, 1) ) AS t(source, target)'
);
seq edge start_vid end_vid flow residual_capacity
-----+------+-----------+---------+------+-------------------
1 1 2 1 50 80
2 3 4 3 80 50
3 4 5 2 50 0
4 10 5 10 100 30
5 8 6 5 130 0
6 9 6 9 80 50
7 11 6 11 130 0
8 7 8 5 20 30
9 16 9 4 80 0
10 12 10 11 100 0
(10 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 |
|
Weight of the edge (source, target)
|
|
reverse_capacity |
|
-1 |
Weight of the edge (target, source) ,
|
Where:
- ANY-INTEGER :
-
SMALLINT, INTEGER, BIGINT
- 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). |
start_vid |
|
Identifier of the first end point vertex of the edge. |
end_vid |
|
Identifier of the second end point vertex of the edge. |
flow |
|
Flow through the edge in the direction (
|
residual_capacity |
|
Residual capacity of the edge in the direction (
|
See Also
-
Flow - Family of functions , pgr_boykovKolmogorov , pgr_pushRelabel
-
https://www.boost.org/libs/graph/doc/edmonds_karp_max_flow.html
-
https://en.wikipedia.org/wiki/Edmonds%E2%80%93Karp_algorithm
Indices and tables