簡體   English   中英

Python中Dijkstra算法在真實地圖上的最短路徑

[英]Shortest path on real maps by Dijkstra's algorithm in python

我正在嘗試使用Dijkstra的算法在真實地圖上找到兩個地點之間的最短路徑,但是我無法在有限的時間內(120秒)獲得結果。 如何優化代碼? 我只允許使用“枕頭”作為外部包裝。

這里是兩個紅點(33,193)(749,457) 的地圖 ,我想吸引他們的最短路徑。 但是即使花費很長時間也無法取得結果。 我已經很好地測試了Dijkstra的算法,並且不知道它是否還有很多錯誤。 Dijkstra的算法是用相同的距離創建的-1。

是完整的代碼。

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)

我期望最短路徑的輸出,但是仍然用完時間。

您必須使用Dijkstra嗎? 看起來這里使用A *方法會更好,因為您可以輕松設計出良好的啟發式方法(例如,曼哈頓距離)。

這可能會解決您的時間限制問題。 另外,在真實地圖上,您應該闡明圖形的定義方式(您僅考慮交集嗎?否則,如何削減空間?)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM