尝试从P矩阵打印最短路径

时间:2016-10-28 01:17:10

标签: python numpy shortest-path floyd-warshall

我正在尝试使用此算法从路径矩阵P打印出最短路径。

Pseudo for Shortest Path Print

我的实施:

testmatrix=np.matrix('0,7,7,0,7,7,0,0,7;0,0,7,0,7,9,0,1,0;9,0,0,0,7,0,2,9,6;9,8,8,0,8,8,8,0,8;9,3,0,0,0,3,3,9,6;9,9,9,0,9,0,9,9,0;9,5,5,0,0,5,0,9,6;9,7,7,0,7,7,0,0,7;0,7,7,0,7,0,1,1,0')

def path(q,r):
    if (testmatrix[q,r] !=0):
        path(q,testmatrix[q,r])
        print("v "+str(testmatrix[q,r]))
        path(testmatrix[q,r],r)

当我打电话给它打印v7到v8的最短路径时:

path(7,8)

我收到一个错误,打印出来:

v 7
v 7
v 7
.
.
.
v 7
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-41-72a35ae59934> in <module>()
----> 1 path(7,8)

<ipython-input-40-7b3409c28cd1> in path(q, r)
      3         path(q,testmatrix[q,r])
      4         print("v "+str(testmatrix[q,r]))
----> 5         path(testmatrix[q,r],r)
      6 

... last 1 frames repeated, from the frame below ...

<ipython-input-40-7b3409c28cd1> in path(q, r)
      3         path(q,testmatrix[q,r])
      4         print("v "+str(testmatrix[q,r]))
----> 5         path(testmatrix[q,r],r)
      6 

RuntimeError: maximum recursion depth exceeded while calling a Python object

我不知道我是否在Python中遇到了一些递归限制,或者是否(很可能)我的实现出现了问题。但说实话,我无法弄清楚我做错了什么。如果有人可以给我一些关于解决这个问题的指导,我会非常感激。

1 个答案:

答案 0 :(得分:0)

你的权重0与python的0索引相冲突,因为你的索引是1到9而不是0到8.你可以通过从矩阵中减去1并将-1视为权重0并切换到python索引世界。

matrix([[-1,  6,  6, -1,  6,  6, -1, -1,  6],
        [-1, -1,  6, -1,  6,  8, -1,  0, -1],
        [ 8, -1, -1, -1,  6, -1,  1,  8,  5],
        [ 8,  7,  7, -1,  7,  7,  7, -1,  7],
        [ 8,  2, -1, -1, -1,  2,  2,  8,  5],
        [ 8,  8,  8, -1,  8, -1,  8,  8, -1],
        [ 8,  4,  4, -1, -1,  4, -1,  8,  5],
        [ 8,  6,  6, -1,  6,  6, -1, -1,  6],
        [-1,  6,  6, -1,  6, -1,  0,  0, -1]])

现在索引从0到8开始。如果元素是-1,则意味着它是最短路径。

代码:

import numpy as np
testmatrix=np.matrix('0,7,7,0,7,7,0,0,7;0,0,7,0,7,9,0,1,0;9,0,0,0,7,0,2,9,6;9,8,8,0,8,8,8,0,8;9,3,0,0,0,3,3,9,6;9,9,9,0,9,0,9,9,0;9,5,5,0,0,5,0,9,6;9,7,7,0,7,7,0,0,7;0,7,7,0,7,0,1,1,0')
testmatrix = testmatrix -1
def path(q,r):
    if (testmatrix[q,r] !=-1):
        path(q,testmatrix[q,r])
        print("v "+str(testmatrix[q,r]))
        path(testmatrix[q,r],r)

path(6,7)

结果:

v 4
v 2
v 5
v 8
v 0

或者如果你真的坚持使用1-9索引,你可以将path放入newpath并在那里完成工作:

import numpy as np
testmatrix=np.matrix('0,7,7,0,7,7,0,0,7;0,0,7,0,7,9,0,1,0;9,0,0,0,7,0,2,9,6;9,8,8,0,8,8,8,0,8;9,3,0,0,0,3,3,9,6;9,9,9,0,9,0,9,9,0;9,5,5,0,0,5,0,9,6;9,7,7,0,7,7,0,0,7;0,7,7,0,7,0,1,1,0')
def new_path (q1,r1,testmatrix):
    def path(q,r):
        if (testmatrix[q,r] !=-1):
            path(q,testmatrix[q,r])
            print("v "+str(testmatrix[q,r]+1))
            path(testmatrix[q,r],r)
    testmatrix = testmatrix-1
    q = q1-1
    r = r1-1
    path(q,r)


new_path(7,8,testmatrix)

结果:

v 5
v 3
v 6
v 9
v 1