簡體   English   中英

Python,Dijkstra 算法可視化

[英]Python, Dijkstra's Algorithm visualization

我正在嘗試在 python 中可視化 Dijkstra 算法,其中每個節點都是一個正方形 - 請參見下圖。 但感覺有點不對勁。 我將最短路徑的結果與標准 A* 進行了比較,但我沒有得到完全相同的路徑。 我認為我的代碼已關閉,但我不知道具體情況如何。

我正在使用 PriorityQueue

網格是對象列表的列表 -

每個 object 代表屏幕上的一個立方體 -

draw - 將網格繪制到屏幕上

** -code- ** 中的代碼是我在發布問題后編輯的部分。


def dijkstra_algorithm(grid, start, end):
    # set up dist (distance to start) with infinity
    dist = {elem: float("inf") for row in grid for elem in row}

    # distance from start to start is 0.
    dist[start] = 0

    # set up prev dict - prev[V] = U - represents that the shortest current path to X is through U
    prev = {}

    # create Priority Queue based on distance from origin and insert start to PQ
    PQ = PriorityQueue()
    counter = 0
    # create hash table to check if element is inside PQ.
    PQ.put((0, counter, start))
    PQ_hash = {start}

    # insert every elem except start into PQ with distance infinity
    for row in grid:
        for elem in row:
            if elem != start:
                PQ.put((dist[elem],**float("inf")**, elem))
                PQ_hash.add(elem)


    # iterate untill PQ is empty
    while not PQ.empty():
        

        current = PQ.get()[1]  # get element with min distance - index 1 in (dist[elem], elem)

        # if what's left is infinitly far - there is no path from start to end
        if dist[current] == float('inf'):
            return False

        PQ_hash.remove(current)  # remove element from Hash table (PQ.get removes elem from PQ)
        current.set_closed() #(color - red)
        draw_func() #(draw the grid)
              
        if current == end: #end node found

            reconstruct_path(prev, current, draw_func) #draw path from end to start
            end.set_end()
            start.set_start()
            return True # found

        #iterate over all neighbors of current node

        for neighbor in current.neighbors:
            # if neighbor inside PQ

            if neighbor in PQ_hash: 
                #calculate distance if we go to neighbor through current (+1 distance)
                alt = dist[current] + 1

                #if quicker - update
                if alt < dist[neighbor]:
                    dist[neighbor] = alt
                    prev[neighbor] = current
                  **counter += 1 **
                    PQ.put((dist[neighbor],**counter**, neighbor))
                    neighbor.set_open() #color green
                    draw_func() #draw the grid
    #path not found
    return False

我認為這與我添加到 PQ 而不是編輯這一事實有關,但我不確定。 另外,對於缺少 PEP8,我感到很抱歉,我試圖在我去的時候評論我的想法,我希望它是可以理解的。

Tech with time - 黑色塊是障礙,紫色是最短路徑 - A* 搜索

向 PQ 中的 go 元素添加一個計數器,將所有內容都整理出來。 PQ.put((0, counter, start)),計數器在程序開始時從零開始,每次我們將一個元素放入 PQ(最后一個 if 語句)我們增加計數器,從而降低優先級.

暫無
暫無

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

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