patternMinor
Shortest Minimax Path via Floyd-Warshall
Viewed 0 times
floydminimaxpathshortestwarshallvia
Problem
I am trying to modify the Floyd-Warshall algorithm to find all-pairs minimax paths in a graph. (That is, the shortest length paths such that the maximum edge weight along a path is minimized.)
Floyd-Warshall algorithm contains the following loop to enhance the distance (
I replaced
However, the modified algorithm finds paths with loops, that is, paths such as 1-3-2-3-4. While the maximum edge weight of the paths 1-3-2-3-4 and 1-3-4 are identical, the latter has a shorter path length and supposed to be returned by the enhanced Floyd-Warshall. Any ideas?
A working Java version of both algorithms and a test case which produces a path with loop can be found here.
Edit: Since no solutions were presented yet, I implemented my own shortest minimax path algorithm using incremental link removal method. Java sources to the solutions can be accessed from the above link.
Floyd-Warshall algorithm contains the following loop to enhance the distance (
ds) and the next vertex (ns) matrices at each iteration.for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (ds[i][k] != inf && ds[k][j] != inf) {
final int d = ds[i][k] + ds[k][j];
if (d < ds[i][j]) {
ds[i][j] = d;
ns[i][j] = k;
}
}I replaced
ds with two new matrices: ws (weights) and ls (lengths). Further, updated the iteration step as follows:for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (ws[i][k] != inf && ws[k][j] != inf) {
final int w = Math.max(ws[i][k], ws[k][j]);
final int l = ls[i][k] + ls[k][j];
if (w < ws[i][j] || (w == ws[i][j] && l < ls[i][j])) {
ws[i][j] = w;
ls[i][j] = l;
ns[i][j] = k;
}
}However, the modified algorithm finds paths with loops, that is, paths such as 1-3-2-3-4. While the maximum edge weight of the paths 1-3-2-3-4 and 1-3-4 are identical, the latter has a shorter path length and supposed to be returned by the enhanced Floyd-Warshall. Any ideas?
A working Java version of both algorithms and a test case which produces a path with loop can be found here.
Edit: Since no solutions were presented yet, I implemented my own shortest minimax path algorithm using incremental link removal method. Java sources to the solutions can be accessed from the above link.
Solution
No need to introduce two arrays. In the original algorithm the distance equals the minimum (over all paths) of the sum of edges (in the path). The new variant defines a distance as the minimum (over all paths) of the maximum of edges (in the path).
Then one only needs to rethink the instruction
In my understanding of Floyd-Warshall the array
In that way no vertex will be repeated on a shortest path, but that part of Foyd-Warshall I always find hard to explain.
Then one only needs to rethink the instruction
final int d = ds[i][k] + ds[k][j];In my understanding of Floyd-Warshall the array
ns stores the highest number of the shortest path: it is updated to k each time a shorter path is found. To retrieve the path itself I would use a recursive procedure short[i,j] = short[i,k] + short[k,j] where k=ns[i,j] and provided k<>i and k<>j. (adapted to your programming syntax)In that way no vertex will be repeated on a shortest path, but that part of Foyd-Warshall I always find hard to explain.
Code Snippets
final int d = ds[i][k] + ds[k][j];Context
StackExchange Computer Science Q#14353, answer score: 2
Revisions (0)
No revisions yet.