如何用动态规划解决地形图最短路径?

时间:2013-03-24 06:32:07

标签: algorithm dynamic-programming shortest-path

给定所有positive整数的矩阵,从最左侧的列0th开始,找到最右侧列(n - 1)th的最小路径。例如:
enter image description here

最小路径是包含在1& s上的路径。

在任何给定的方格m[i, j],我们可以移动到4个方向(left, right, up, down);当然除了最左边,最右边的行/列的所有角落情况。例如,在[0, 0],我们只能移动rightdown 我的解决方案是构建m x n个顶点的图形,然后运行 Floyd-Warshall 来计算任意两个顶点(u, v)的所有对最短路径。然后运行另一个嵌套的for循环,检查0th列的所有顶点以及(n - 1)th列的所有顶点,以找到最小路径。
但是,我的教授通过使用以下重复建议了另一种算法:

S[i, j, L] = 
    min(
        S[i - 1, j, L - 1] + cost[i - 1, j],
        S[i + 1, j, L - 1] + cost[i + 1, j],
        S[i, j - 1, L - 1] + cost[i, j - 1],
        S[i, j + 1, L - 1] + cost[i, j + 1]);

我不知道它是如何工作的!因为在任何给定的方格[i, j],我们可以在4个方向上移动,这使得无法根据先前预先计算的值构建表格。
我在这里错过了什么吗?我无法看到这种复发是如何产生的。任何的想法?

1 个答案:

答案 0 :(得分:4)

如果你有S [i,j,0] =无穷大,除了S [0,j,L] = 0,那么它应该有效。最终所有S [i,j,L] == S [i,j,L + 1],你可以停止迭代。然后S [i,j,L]具有从第一列到该单元的最短路径的成本。

这是左上角的重复出现增加L值的方法。

0   inf inf inf inf
0   inf inf inf inf
0   inf inf inf inf

0   1   inf inf inf inf
0   20  inf inf inf inf
0   21  inf inf inf inf

0   1   2   inf inf inf
0   2   30  inf inf inf
0   21  22  inf inf inf

0   1   2   3   inf inf
0   2   3   39  inf inf
0   12  22  23  inf inf

0   1   2   3   4   inf
0   2   3   4   47  inf
0   12  12  23  24  inf

0   1   2   3   4   5  
0   2   3   4   5   48  
0   12  12  12  24  25 

0   1   2   3   4   5  
0   2   3   4   5   6   
0   12  12  12  6   25 

0   1   2   3   4   5
0   2   3   4   5   6
0   12  12  7   6   7

0   1   2   3   4   5
0   2   3   4   5   6
0   12  8   7   6   7

0   1   2   3   4   5
0   2   3   4   5   6
0   9   8   7   6   7

左上角不会发生进一步的变化。您可以看到它正在慢慢发现到达每个单元的最低成本。