【问题标题】:How to solve terrain map shortest path with dynamic programming?如何用动态规划求解地形图最短路径?
【发布时间】:2013-03-24 06:32:06
【问题描述】:

给定一个由所有positive 整数组成的矩阵,从最左边的列0th 开始,找到最右边的列(n - 1)th 的最小路径。例如:

最小路径是包含 1 的路径。

在任何给定的方格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)S 不需要计算(即无限)超过矩阵的边缘,以及 2)S[0,0,0]=0。
  • ...P.S.我知道这不是您要问的,但这确实需要迭代(非递归)BFS。
  • 如果你有S[i,j,0] = infinity,除了S[0,0,0] = 0,那么它应该可以工作。最终所有 S[i,j,k]==S[i,j,k+1] 并且您可以停止迭代。 S[i,j,k] 然后具有从 (0,0) 到 (i,j) 的最短路径的成本。
  • @VaughnCato:你能详细说明一下吗?提前致谢。

标签: algorithm dynamic-programming shortest-path


【解决方案1】:

如果你有 S[i,j,0] = infinity,除了 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

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

【讨论】:

  • 你知道一种方法来描述收敛之前需要多少步吗?
  • 谢谢,但它并不总是从[0, 0] 开始。我们应该对0th 列的所有行运行它并比较它们吗?
  • @Chan:我没有仔细阅读你的问题。我已经更新了我的答案。不需要多次运行算法,只需要不同的开始状态。
猜你喜欢
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
相关资源
最近更新 更多