矩阵中的最短路径

时间:2015-02-23 18:57:09

标签: matlab matrix routes

我想找到NXN MATRIX的最短路径,如下面的3X3矩阵。从第1列的任何一行开始,到第3列的任何一行结束。下面矩阵A中的最短路径是1,3,2,4。

A = [1 3 9; 
     4 2 4;
     5 4 9];

1 个答案:

答案 0 :(得分:0)

标准方法是首先将您的问题表示为图形。在你的情况下,如果你将矩阵中的每个单元格视为一个顶点,那么从该顶点到右边的单元格,上面的单元格和下面的单元格都有一条边(任何一条都可能因为它们脱落而不存在)矩阵的边缘)。回溯到前一列无法为最短路径做出贡献,因此我们不会包含这些边。如果你确实包含了它们,那么答案就会变得相同,只需要花费更长的时间。

使用索引编号,我们有以下边和权重:

 i j  s
[1,2]=4
[1,4]=3
[2,1]=1
[2,3]=5
[2,5]=2
[3,2]=4
[3,6]=4
[4,5]=2
[4,7]=9
[5,4]=3
[5,6]=4
[5,8]=4
[6,5]=2
[6,9]=9
[7,8]=4
[8,7]=9
[8,9]=9
[9,8]=4

(标签i,j和s在下面使用。)但这并不能解释移动到第一列的初始成本,因此我们添加了一个对每个节点都有边缘的新节点:

  i j  s
[10,1]=1
[10,2]=4
[10,3]=3

不幸的是,我还没有找到一种聪明的方法来做到这一点,但它相当简单,一旦你完成了你需要创建一个稀疏矩阵的3列向量:

S = sparse(i,j,s,m,n,nzmax)

,其中

i,j,s are column vectors as labeled from the edge/weight list above
m = n = numel(A)+1
nzmax = numel(i) = numel(j) = numel(s)

从那里你可以使用Dijkstra's Algorithm来查找从新节点10开始的单源最短路径。您的答案将是最右侧列(节点7,8或9,在本例中为节点)的路径距离最小的节点。

如果您有生物信息学工具箱,则可以使用shortestpath。如果你不这样做,Dijkstra在文件交换上有几个实现。