PDF version (NAG web site
, 64-bit version, 64-bit version)
NAG Toolbox: nag_mip_shortestpath (h03ad)
Purpose
nag_mip_shortestpath (h03ad) finds the shortest path through a directed or undirected acyclic network using Dijkstra's algorithm.
Syntax
[
splen,
path,
ifail] = h03ad(
n,
ns,
ne,
direct,
d,
irow,
icol, 'nz',
nz)
[
splen,
path,
ifail] = nag_mip_shortestpath(
n,
ns,
ne,
direct,
d,
irow,
icol, 'nz',
nz)
Description
nag_mip_shortestpath (h03ad) attempts to find the shortest path through a directed or undirected
acyclic network, which consists of a set of points called vertices and a set of curves called arcs that connect certain pairs of distinct vertices. An acyclic network is one in which there are no paths connecting a vertex to itself. An arc whose origin vertex is and whose destination vertex is can be written as . In an undirected network the arcs and are equivalent (i.e., ), whereas in a directed network they are different. Note that the shortest path may not be unique and in some cases may not even exist (e.g., if the network is disconnected).
The network is assumed to consist of
vertices which are labelled by the integers
. The lengths of the arcs between the vertices are defined by the
by
distance matrix
, in which the element
gives the length of the arc
;
if there is no arc connecting vertices
and
(as is the case for an acyclic network when
). Thus the matrix
is usually
sparse. For example, if
and the network is directed, then
If the network is undirected,
is
symmetric since
(i.e., the length of the arc
the length of the arc
).
The method used by
nag_mip_shortestpath (h03ad) is described in detail in
Further Comments.
References
Dijkstra E W (1959) A note on two problems in connection with graphs Numer. Math. 1 269–271
Parameters
Compulsory Input Parameters
- 1:
– int64int32nag_int scalar
-
, the number of vertices.
Constraint:
.
- 2:
– int64int32nag_int scalar
- 3:
– int64int32nag_int scalar
-
and , the labels of the first and last vertices, respectively, between which the shortest path is sought.
- 4:
– logical scalar
-
Indicates whether the network is directed or undirected.
- The network is directed.
- The network is undirected.
- 5:
– double array
-
The nonzero elements of the distance matrix
, ordered by increasing row index and increasing column index within each row. More precisely,
must contain the value of the nonzero element with indices (
); this is the length of the arc from the vertex with label
to the vertex with label
. Elements with the same row and column indices are not allowed. If
, then only those nonzero elements in the strict upper triangle of
need be supplied since
. (
nag_sparse_real_gen_sort (f11za) may be used to sort the elements of an arbitrarily ordered matrix into the required form. This is illustrated in
Example.)
Constraint:
, for .
- 6:
– int64int32nag_int array
- 7:
– int64int32nag_int array
-
and must contain the row and column indices, respectively, for the nonzero element stored in .
Constraints:
irow and
icol must satisfy the following constraints (which may be imposed by a call to
nag_sparse_real_gen_sort (f11za)):
- ;
- and , for .
In addition, if , , and ;
- if , .
Optional Input Parameters
- 1:
– int64int32nag_int scalar
-
Default:
the dimension of the arrays
irow,
icol,
d. (An error is raised if these dimensions are not equal.)
The number of nonzero elements in the distance matrix .
Constraints:
- if , ;
- if , .
Output Parameters
- 1:
– double scalar
-
The length of the shortest path between the specified vertices and .
- 2:
– int64int32nag_int array
-
Contains details of the shortest path between the specified vertices and . More precisely, for some . The remaining elements are set to zero.
- 3:
– int64int32nag_int scalar
unless the function detects an error (see
Error Indicators and Warnings).
Error Indicators and Warnings
Errors or warnings detected by the function:
-
-
On entry, | , |
or | , |
or | , |
or | , |
or | , |
or | . |
-
-
On entry, | when , |
or | when , |
or | . |
-
-
On entry, or or or or for some when .
-
-
On entry, or or for some when .
-
-
for some .
-
-
On entry, or and for some .
-
-
On entry, and for some .
-
-
No connected network exists between vertices
ns and
ne.
-
An unexpected error has been triggered by this routine. Please
contact
NAG.
-
Your licence key may have expired or may not have been installed correctly.
-
Dynamic memory allocation failed.
Accuracy
The results are exact, except for the obvious rounding errors in summing the distances in the length of the shortest path.
Further Comments
nag_mip_shortestpath (h03ad) is based upon Dijkstra's algorithm (see
Dijkstra (1959)), which attempts to find a path
between two specified vertices
and
of shortest length
.
The algorithm proceeds by assigning labels to each vertex, which may be temporary or permanent. A temporary label can be changed, whereas a permanent one cannot. For example, if vertex has a permanent label , then is the distance and is the previous vertex on a shortest length path. If the label is temporary, then it has the same meaning but it refers only to the shortest path found so far. A shorter one may be found later, in which case the label may become permanent.
The algorithm consists of the following steps.
1. |
Assign the permanent label to vertex and temporary labels to every other vertex. Set and go to 2. |
2. |
Consider each vertex adjacent to vertex with a temporary label in turn. Let the label at be and at . If , then a new temporary label is assigned to vertex ; otherwise no change is made in the label of . When all vertices with temporary labels adjacent to have been considered, go to 3. |
3. |
From the set of temporary labels, select the one with the smallest second component and declare that label to be permanent. The vertex it is attached to becomes the new vertex . If go to 4. Otherwise go to 2 unless no new vertex can be found (e.g., when the set of temporary labels is ‘empty’ but , in which case no connected network exists between vertices and ). |
4. |
To find the shortest path, let denote the label of vertex . The column label () gives while the row label () then links back to the previous vertex on a shortest length path. Go to vertex . Suppose that the (permanent) label of vertex is , then the next previous vertex is on a shortest length path. This process continues until vertex is reached. Hence the shortest path is
which has length . |
Example
This example finds the shortest path between vertices and for the undirected network
Open in the MATLAB editor:
h03ad_example
function h03ad_example
fprintf('h03ad example results\n\n');
n = int64(11);
ns = int64(1);
ne = n;
direct = false;
d = [ 5; 6; 5;
2; 4;
1; 4;
1; 3;
1; 9;
1; 6; 7;
8;
1; 4;
2; 2;
4];
irow = [int64(1);1;1; 2;2; 3;3; 4;4; 5;5; 6;6; 6; 7; 8; 8; 9; 9; 10];
icol = [int64(2);3;4; 3;5; 4;6; 6;7; 6;9; 7;8;10; 9; 9;11; 10;11; 11];
[splen, path, ifail] = h03ad(n, ns, ne, direct, d, irow, icol);
fprintf('Shortest path = ');
j = 1;
while path(j)~=0;
if j>1
fprintf(' to ');
end
fprintf('%2d', path(j));
j = j+1;
end
fprintf('\n\nLength of shortest path = %16.6g\n', splen);
h03ad example results
Shortest path = 1 to 4 to 6 to 8 to 9 to 11
Length of shortest path = 15
PDF version (NAG web site
, 64-bit version, 64-bit version)
© The Numerical Algorithms Group Ltd, Oxford, UK. 2009–2015