我试图通过Dijkstra的算法在真实地图上找到两个地点之间的最短路径,但是我无法在有限的时间内(120秒)获得结果。如何优化代码?我只允许使用“枕头”作为外部包装。
map上有两个红色斑点(33,193)(749,457),我想画出它们的最短路径。但是即使花费很长时间也无法取得结果。我已经很好地测试了Dijkstra的算法,并且不知道它是否还有很多错误。 Dijkstra算法的创建距离相同-1。
Here是完整的代码。
def walkback(P, x, y):
L = [y]
while x != y:
y = P[y]
L = [y] + L
return L
def path(A, x, y):
M = []
W = [x]
P = {}
while W != []:
u = W.pop()
if u == y:
return walkback(P, x, y)
M.append(u)
for v in A[u]:
if not v in M:
P[v] = u
W.append(v)
return None
这是Dijkstra的算法。 我为此进行了测试。
A = { 1.324: [2,5.24], 2: [1.324,6], 3: [2],
4: [5], 5.24: [2,6], 6: [3] }
print(path(A, 1.324, 6))
print(path(A, 1.324, 4))
对于任何像素,白色和红色(开始,结束)是可移动的点,并设置为0。其他颜色设置为1。
for x in range(0, w):
for y in range(0, h):
(r, g, b, a) = im.getpixel((x, y))
if (r, g, b) == (255, 0, 0):
Red.append((x, y))
arr[y][x] = 0
elif (r, g, b) == (255, 255, 255):
arr[y][x] = 0
else:
arr[y][x] = 1
这会为任何活动点创建一个图形。对于['0.1':['0.2','0.3']],这意味着您可以从(0,1)移至(0,2)和(0,3)。
def coord2num(x, y):
z = str(x) + "." + str(y)
return z
B = {}
for x in range(0, h):
for y in range(0, w):
if arr[x][y] != 0:
continue
key = coord2num(x, y)
B[key] = []
if x - 1 >= 0 and arr[x - 1][y] == 0:
value = coord2num(x - 1, y)
B[key].append(value)
if x + 1 < h and arr[x + 1][y] == 0:
value = coord2num(x + 1, y)
B[key].append(value)
if y + 1 < w and arr[x][y + 1] == 0:
value = coord2num(x, y + 1)
B[key].append(value)
if y - 1 >= 0 and arr[x][y - 1] == 0:
value = coord2num(x, y - 1)
B[key].append(value)
我希望输出最短的路径,但仍然用完了时间。
答案 0 :(得分:0)
使用Dijkstra是强制性的吗?似乎在这里使用A *方法会更好,因为您可以轻松设计出良好的启发式方法(例如,曼哈顿距离)。
这可能会解决您的时间限制问题。另外,在真实地图上,您应该阐明图形的定义方式(您只考虑交点吗?否则,如何削减空间?)。