pgr_aStar - pgRouting Manual (3.3)
pgr_aStar
pgr_aStar
- Shortest path using the A* algorithm.
Availability
-
Version 3.2.0
-
New proposed signature:
-
pgr_aStar
( Combinations )
-
-
-
Version 3.0.0
-
Official function
-
-
Version 2.4.0
-
New Proposed signatures:
-
pgr_aStar
( One to Many ) -
pgr_aStar
( Many to One ) -
pgr_aStar
( Many to Many )
-
-
-
Version 2.3.0
-
Signature change on
pgr_astar
( One to One )-
Old signature no longer supported
-
-
-
Version 2.0.0
-
Official
pgr_aStar
( One to One )
-
Description
The main characteristics are:
-
Process works for directed and undirected graphs.
-
Ordering is:
-
first by
start_vid
(if exists) -
then by
end_vid
-
-
Values are returned when there is a path.
-
Let \(v\) and \(u\) be nodes on the graph:
-
If there is no path from \(v\) to \(u\) :
-
no corresponding row is returned
-
agg_cost
from \(v\) to \(u\) is \(\infty\)
-
-
There is no path when \(v = u\) therefore
-
no corresponding row is returned
-
agg_cost
from v to u is \(0\)
-
-
-
When \((x,y)\) coordinates for the same vertex identifier differ:
-
A random selection of the vertex’s \((x,y)\) coordinates is used.
-
-
Running time: \(O((E + V) * \log V)\)
-
The results are equivalent to the union of the results of the pgr_aStar( One to One ) on the:
-
pgr_aStar( One to Many )
-
pgr_aStar( Many to One )
-
pgr_aStar( Many to Many )
-
-
start_vid
andend_vid
in the result is used to distinguish to which path it belongs.
Signatures
Summary
[directed,
heuristic,
factor,
epsilon]
(seq,
path_seq,
[start_vid],
[end_vid],
node,
edge,
cost,
agg_cost)
Optional parameters are named parameters and have a default value.
One to One
[directed,
heuristic,
factor,
epsilon]
(seq,
path_seq,
node,
edge,
cost,
agg_cost)
- Example :
-
From vertex \(6\) to vertex \(12\) on a directed graph with heuristic \(2\)
SELECT * FROM pgr_aStar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2
FROM edges',
6, 12,
directed => true, heuristic => 2);
seq path_seq node edge cost agg_cost
-----+----------+------+------+------+----------
1 1 6 4 1 0
2 2 7 10 1 1
3 3 8 12 1 2
4 4 12 -1 0 3
(4 rows)
One to Many
[directed,
heuristic,
factor,
epsilon]
(seq,
path_seq,
end_vid,
node,
edge,
cost,
agg_cost)
- Example :
-
From vertex \(6\) to vertices \(\{10, 12\}\) on a directed graph with heuristic \(3\) and factor \(3.5\)
SELECT * FROM pgr_aStar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2
FROM edges',
6, ARRAY[10, 12],
heuristic => 3, factor := 3.5);
seq path_seq end_vid node edge cost agg_cost
-----+----------+---------+------+------+------+----------
1 1 10 6 4 1 0
2 2 10 7 8 1 1
3 3 10 11 9 1 2
4 4 10 16 16 1 3
5 5 10 15 3 1 4
6 6 10 10 -1 0 5
7 1 12 6 4 1 0
8 2 12 7 8 1 1
9 3 12 11 11 1 2
10 4 12 12 -1 0 3
(10 rows)
Many to One
[directed,
heuristic,
factor,
epsilon]
(seq,
path_seq,
start_vid,
node,
edge,
cost,
agg_cost)
- Example :
-
From vertices \(\{6, 8\}\) to vertex \(10\) on an undirected graph with heuristic \(4\)
SELECT * FROM pgr_aStar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2
FROM edges',
ARRAY[6, 8], 10,
false, heuristic => 4);
seq path_seq start_vid node edge cost agg_cost
-----+----------+-----------+------+------+------+----------
1 1 6 6 2 1 0
2 2 6 10 -1 0 1
3 1 8 8 12 1 0
4 2 8 12 11 1 1
5 3 8 11 5 1 2
6 4 8 10 -1 0 3
(6 rows)
Many to Many
[directed,
heuristic,
factor,
epsilon]
(seq,
path_seq,
start_vid,
end_vid,
node,
edge,
cost,
agg_cost)
- Example :
-
From vertices \(\{6, 8\}\) to vertices \(\{10, 12\}\) on a directed graph with factor \(0.5\)
SELECT * FROM pgr_aStar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2
FROM edges',
ARRAY[6, 8], ARRAY[10, 12],
factor => 0.5);
seq path_seq start_vid end_vid node edge cost agg_cost
-----+----------+-----------+---------+------+------+------+----------
1 1 6 10 6 4 1 0
2 2 6 10 7 8 1 1
3 3 6 10 11 9 1 2
4 4 6 10 16 16 1 3
5 5 6 10 15 3 1 4
6 6 6 10 10 -1 0 5
7 1 6 12 6 4 1 0
8 2 6 12 7 10 1 1
9 3 6 12 8 12 1 2
10 4 6 12 12 -1 0 3
11 1 8 10 8 10 1 0
12 2 8 10 7 8 1 1
13 3 8 10 11 9 1 2
14 4 8 10 16 16 1 3
15 5 8 10 15 3 1 4
16 6 8 10 10 -1 0 5
17 1 8 12 8 12 1 0
18 2 8 12 12 -1 0 1
(18 rows)
Combinations
[directed,
heuristic,
factor,
epsilon]
(seq,
path_seq,
start_vid,
end_vid,
node,
edge,
cost,
agg_cost)
- Example :
-
Using a combinations table on a directed graph with factor \(0.5\) .
The combinations table:
SELECT * FROM combinations;
source target
--------+--------
5 6
5 10
6 5
6 15
6 14
(5 rows)
The query:
SELECT * FROM pgr_aStar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2
FROM edges',
'SELECT * FROM combinations',
factor => 0.5);
seq path_seq start_vid end_vid node edge cost agg_cost
-----+----------+-----------+---------+------+------+------+----------
1 1 5 6 5 1 1 0
2 2 5 6 6 -1 0 1
3 1 5 10 5 1 1 0
4 2 5 10 6 4 1 1
5 3 5 10 7 8 1 2
6 4 5 10 11 9 1 3
7 5 5 10 16 16 1 4
8 6 5 10 15 3 1 5
9 7 5 10 10 -1 0 6
10 1 6 5 6 1 1 0
11 2 6 5 5 -1 0 1
12 1 6 15 6 4 1 0
13 2 6 15 7 8 1 1
14 3 6 15 11 9 1 2
15 4 6 15 16 16 1 3
16 5 6 15 15 -1 0 4
(16 rows)
Parameters
Column |
Type |
Description |
---|---|---|
|
Edges SQL as described below |
|
|
Combinations SQL as described below |
|
start vid |
|
Identifier of the starting vertex of the path. |
start vids |
|
Array of identifiers of starting vertices. |
end vid |
|
Identifier of the ending vertex of the path. |
end vids |
|
Array of identifiers of ending vertices. |
Optional parameters
Column |
Type |
Default |
Description |
---|---|---|---|
|
|
|
|
aStar optional Parameters
Parameter |
Type |
Default |
Description |
---|---|---|---|
|
|
5 |
Heuristic number. Current valid values 0~5.
|
|
|
|
For units manipulation. \(factor > 0\) . |
|
|
|
For less restricted results. \(epsilon >= 1\) . |
See heuristics available and factor handling.
Inner Queries
Edges SQL
Parameter |
Type |
Default |
Description |
---|---|---|---|
|
ANY-INTEGER |
Identifier of the edge. |
|
|
ANY-INTEGER |
Identifier of the first end point vertex of the edge. |
|
|
ANY-INTEGER |
Identifier of the second end point vertex of the edge. |
|
|
ANY-NUMERICAL |
Weight of the edge (
|
|
|
ANY-NUMERICAL |
-1 |
Weight of the edge (
|
|
ANY-NUMERICAL |
X coordinate of
|
|
|
ANY-NUMERICAL |
Y coordinate of
|
|
|
ANY-NUMERICAL |
X coordinate of
|
|
|
ANY-NUMERICAL |
Y coordinate of
|
Where:
- ANY-INTEGER :
-
SMALLINT
,INTEGER
,BIGINT
- ANY-NUMERICAL :
-
SMALLINT
,INTEGER
,BIGINT
,REAL
,FLOAT
Combinations SQL
Parameter |
Type |
Description |
---|---|---|
|
ANY-INTEGER |
Identifier of the departure vertex. |
|
ANY-INTEGER |
Identifier of the arrival vertex. |
Where:
- ANY-INTEGER :
-
SMALLINT
,INTEGER
,BIGINT
Result Columns
Returns set of
(seq,
path_seq
[,
start_vid]
[,
end_vid],
node,
edge,
cost,
agg_cost)
Column |
Type |
Description |
---|---|---|
|
|
Sequential value starting from 1 . |
|
|
Relative position in the path. Has value 1 for the beginning of a path. |
|
|
Identifier of the starting vertex. Returned when multiple starting vetrices are in the query. |
|
|
Identifier of the ending vertex. Returned when multiple ending vertices are in the query. |
|
|
Identifier of the node in the path from
|
|
|
Identifier of the edge used to go from
|
|
|
Cost to traverse from
|
|
|
Aggregate cost from
|
Additional Examples
- Example 1 :
-
Demonstration of repeated values are ignored, and result is sorted.
SELECT * FROM pgr_aStar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2
FROM edges',
ARRAY[7, 10, 15, 10, 10, 15], ARRAY[10, 7, 10, 15]);
seq path_seq start_vid end_vid node edge cost agg_cost
-----+----------+-----------+---------+------+------+------+----------
1 1 7 10 7 8 1 0
2 2 7 10 11 9 1 1
3 3 7 10 16 16 1 2
4 4 7 10 15 3 1 3
5 5 7 10 10 -1 0 4
6 1 7 15 7 8 1 0
7 2 7 15 11 9 1 1
8 3 7 15 16 16 1 2
9 4 7 15 15 -1 0 3
10 1 10 7 10 5 1 0
11 2 10 7 11 8 1 1
12 3 10 7 7 -1 0 2
13 1 10 15 10 5 1 0
14 2 10 15 11 9 1 1
15 3 10 15 16 16 1 2
16 4 10 15 15 -1 0 3
17 1 15 7 15 3 1 0
18 2 15 7 10 2 1 1
19 3 15 7 6 4 1 2
20 4 15 7 7 -1 0 3
21 1 15 10 15 3 1 0
22 2 15 10 10 -1 0 1
(22 rows)
- Example 2 :
-
Making start vids the same as end vids .
SELECT * FROM pgr_aStar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2
FROM edges',
ARRAY[7, 10, 15], ARRAY[7, 10, 15]);
seq path_seq start_vid end_vid node edge cost agg_cost
-----+----------+-----------+---------+------+------+------+----------
1 1 7 10 7 8 1 0
2 2 7 10 11 9 1 1
3 3 7 10 16 16 1 2
4 4 7 10 15 3 1 3
5 5 7 10 10 -1 0 4
6 1 7 15 7 8 1 0
7 2 7 15 11 9 1 1
8 3 7 15 16 16 1 2
9 4 7 15 15 -1 0 3
10 1 10 7 10 5 1 0
11 2 10 7 11 8 1 1
12 3 10 7 7 -1 0 2
13 1 10 15 10 5 1 0
14 2 10 15 11 9 1 1
15 3 10 15 16 16 1 2
16 4 10 15 15 -1 0 3
17 1 15 7 15 3 1 0
18 2 15 7 10 2 1 1
19 3 15 7 6 4 1 2
20 4 15 7 7 -1 0 3
21 1 15 10 15 3 1 0
22 2 15 10 10 -1 0 1
(22 rows)
- Example 3 :
-
Manually assigned vertex combinations.
SELECT * FROM pgr_aStar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2
FROM edges',
'SELECT * FROM (VALUES (6, 10), (6, 7), (12, 10)) AS combinations (source, target)');
seq path_seq start_vid end_vid node edge cost agg_cost
-----+----------+-----------+---------+------+------+------+----------
1 1 6 7 6 4 1 0
2 2 6 7 7 -1 0 1
3 1 6 10 6 4 1 0
4 2 6 10 7 8 1 1
5 3 6 10 11 9 1 2
6 4 6 10 16 16 1 3
7 5 6 10 15 3 1 4
8 6 6 10 10 -1 0 5
9 1 12 10 12 13 1 0
10 2 12 10 17 15 1 1
11 3 12 10 16 16 1 2
12 4 12 10 15 3 1 3
13 5 12 10 10 -1 0 4
(13 rows)
See Also
Indices and tables