我正在尝试使用此算法从路径矩阵P打印出最短路径。
我的实施:
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中遇到了一些递归限制,或者是否(很可能)我的实现出现了问题。但说实话,我无法弄清楚我做错了什么。如果有人可以给我一些关于解决这个问题的指导,我会非常感激。
答案 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