1. 程式人生 > >狄克斯特拉演算法之Python實現(個人獨創)易於理解和擴充套件。

狄克斯特拉演算法之Python實現(個人獨創)易於理解和擴充套件。

狄克斯特拉演算法的基礎關係模型如下:

它解決的是從起點到終點的最佳路線問題。

如果把上圖的數字代表耗時,那就是要找到耗時最短的路徑。

由於本人較懶,先將原始碼給出來,之後有時間再解釋程式碼的意思。

下面程式碼針對的關係模型如下:

# 資料關係模型用字典巢狀字典的形式來表達。
graph = {
    'start': {'a': 3, 'b': 6, 'c': 4},
    'a': {"d": 8},
    "b": {'d': 10, "e": 5},
    'c': {"e": 6},
    "d": {"f": 2, 'g': 7, "e": -2},
    'e': {'g': 3, 'h': 6},
    'f': {'fina': 9},
    'g': {'fina': 8},
    "h": {'fina': 7},
    'fina': {}
}
# 定義耗時的字典。
costs = {}
costs["start"] = 0

# 儲存父節點的字典。
parents = {}


def find_lowest_cost_node(node, node_cost):
    """找到start下一級節點,並更新costs裡的值,和parents裡面的值"""
    # 獲取當前節點的所有下一級節點和其權重值。
    for next_node in graph[node].keys():
        # 判斷next_node是否在costs裡存在。
        if next_node in costs.keys():
            if graph[node][next_node] + node_cost < costs[next_node]:
                costs[next_node] = graph[node][next_node] + node_cost
                parents[next_node] = node
            else:
                continue
        else:
            costs[next_node] = graph[node][next_node] + node_cost
            parents[next_node] = node


def find_path(node):
    """利用遞迴演算法,獲取parents裡面的父節點"""
    super_node = parents[node]
    print(super_node)
    if super_node is not 'start':
        super_node= find_path(super_node)
        return super_node
    else:
        return 'start'


def main():
    """主函式部分"""
    # 給出起點的節點
    node = "start"
    
    while node is not "fina":
        # 找到costs裡面最小值的鍵,將其從costs裡面剔除
        node = min(costs, key=costs.get)
        node_cost = costs[node]
        del costs[node]
        if graph[node]:
            find_lowest_cost_node(node, node_cost)
        else:
            # 如果沒有下一級節點,就繼續找下一個最小的節點
            continue
            
    # parents裡面打印出來的,就可以從終點開始追溯其父節點,最終就會追溯到起點。
    print(parents)

    # 獲取父節點。並打印出來。
    finally_node = 'fina'
    print(finally_node)
    find_path(finally_node)


if __name__ == '__main__':
    main()

大體的思路如下:

每次獲取costs裡面最小的節點,並把最小節點從costs裡面刪除,然後找到該節點的下一級節點。

如果下一級節點已經在costs裡存在,則需要對值進行比較。

如果經由該節點達到下一級節點的值要小,就需要更新下一級節點的cost,並更新其父節點為當前節點。

如果找到了最終的節點‘fina’,並且其cost在costs裡面是最小的。就結束迴圈。

程式執行的結果如下:

相關推薦

演算法Python實現個人獨創易於理解擴充套件

狄克斯特拉演算法的基礎關係模型如下: 它解決的是從起點到終點的最佳路線問題。 如果把上圖的數字代表耗時,那就是要找到耗時最短的路徑。 由於本人較懶,先將原始碼給出來,之後有時間再解釋程式碼的意思。 下面程式碼針對的關係模型如下: # 資料關係模型用字典巢狀字

演算法,解決加權最短路徑問題--python實現

問題:尋找從起點到終點的最短路徑。 關係圖如下: 解決思路:建立三張散列表。graph 儲存關係圖;costs 儲存各個節點的開銷(開銷是指從起點到該節點的最小的權重);              

python程式碼實現演算法

狄克斯特拉演算法找最短路徑問題: 之前我們瞭解過,用廣度優先搜尋,找出段數最少的路徑,但是要找出最快的路徑該怎麼做呢,為此我們可以用現在提到的演算法,狄克斯特拉演算法。 我們知道,狄克斯特拉算的輔助圖形必須是有向無環加權圖,這也就決定了該演算法的使用條件。 那什麼是有向

演算法演算法 --《圖解演算法

2019你好!好好生活,好好工作! 狄克斯特拉演算法 狄克斯特拉演算法(Dijkstra )用於計算出不存在非負權重的情況下,起點到各個節點的最短距離 可用於解決2類問題: 從A出發是否存在到達B的路徑;從A出發到達B的最短路徑(時間最少、或者路徑最少等),事實上最後計算完成後,已經得到了A到各個節點

演算法學習小記

丟擲問題 在廣度優先搜尋演算法裡面我們在從雙子峰到金門大橋的圖裡面尋找的是換乘最短的路徑,但是我們需要找出最快的路徑應該怎麼選擇? 如下圖: 因此我們可以使用另一種演算法——狄克斯特拉演算法(Dijkstra’s algorithm)。 演算法簡介 狄克斯特拉演算法包含4個

演算法學習筆記--演算法

演算法學習筆記–狄克斯特拉演算法 主要內容 加權圖:提高或降低某些邊的權重 介紹狄克斯特拉演算法,能找出加權圖中前往X的最短路徑 圖中的環會導致狄克斯特拉演算法不管用,如果有負權重也不適用 如果要處理負權重的圖,可以使用貝爾曼-福德演算法 狄克斯特演

演算法求解村莊問題

問題: 給定n個村莊之間的交通圖。若村莊i和j之間有路可通,則i和j用邊連線,邊上的權值Wij表示這條道路的長度。現打算在這n個村莊中選定一個村莊建一所醫院。編寫如下演算法: (1) 求出該醫院應建在哪個村莊,才能使距離醫院最遠的村莊到醫院的路程最短。 (2) 求出該醫

【圖演算法演算法Java實現

package cn.zhaoyuening.algorithms.dijkstra; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.

淺談:演算法Dijkstra找最小樹問題

•標號過程分為兩步: –1.修改T標號。假定 是新產生的P標號點,考察以 為始點的所有弧段  ,如果  是P標號點,則對該點不再進行標號;如果 是T標號點,則進行如下修改 –2.產生新的P標號點,原則:在現有的所有T標號中將值最小者改為P標號 以上為狄克斯特拉的演算法詳述,為了讓後來者有一個清晰的認識,

Dijkstra()演算法求單源最短通路

 typedef enum{FALSE,TRUE}boolean;typedef int dist[m];typedef int path[m];void spath_dij(mgraph g,int v0,path p,dist d){boolean final[m]; i

演算法——演算法

這裡有一些定義及程式碼取自CodeInfo的簡書,連結:https://www.jianshu.com/p/b805e9d1eb5c,和heroacool的CSDN,連結:https://blog.csdn.net/heroacool/article/details/51014824,感謝兩位大佬。 狄克斯特

有權最短路徑問題:(Dijkstra)演算法 & Java 實現

一、有權圖 之前我們知道,在無權重的圖中,求兩個頂點之間的最短路徑,可以使用 廣度優先搜尋 演算法。但是,當邊存在權重(也可以理解為路程的長度)時,廣度優先搜尋不再適用。 針對有權圖中的兩點間最短路徑,目前主要有 狄克斯特拉演算法 和 貝爾曼福德演算法 兩種解決

Dijkstra 演算法 C#實現

今天在看《演算法圖解》,看了加權最小路徑演算法,決定用程式碼實現一下。 首先是畫有向圖,在網上找了一下,有不錯的開源軟體graphviz,該原始碼託管在GitLab上。該軟體是一個圖形視覺化軟體。 畫了一個有向圖如下: 畫圖用的程式碼: digraph dijkstra{ start->A[lab

【算法】算法Dijkstra’s algorithm

父節點 定義 cte 最短路 pan 函數 dijk 節點 表示 狄克斯特拉算法(Dijkstra’s algorithm) 找出最快的路徑使用算法——狄克斯特拉算法(Dijkstra’s algorithm)。 使用狄克斯特拉算法 步驟 (1) 找出最便宜的節點,即可

演算法詳解及C++實現

演算法步驟如下: G={V,E} 1. 初始時令 S={V0},T=V-S={其餘頂點},T中頂點對應的距離值 若存在<V0,Vi>,d(V0,Vi)為<V0,Vi>弧上的權值

演算法

To 1 1 1 To 2 4 2 …… …… #include <iostream> #include <stdio.h> #define inf 37000 using namespace std; void dispath(int g[][6],int *dist ,int *

《圖論》——最短路徑 Dijkstra演算法(戴演算法)

十大演算法之Dijkstra演算法: 最短路徑是圖論演算法中的經典問題。圖分為有向圖、無向圖,路徑權值有正值、負值,針對不同的情況需要分別選用不同的演算法。在維基上面給出了各種不同的場景應用不同的演算法的基本原則:最短路問題。 針對無向圖,正權值路徑,採取Dijkstra

最短路徑演算法—Dijkstra(迪傑)演算法分析與實現(Python)

December 18, 2015 12:56 PM Dijkstra(迪傑斯特拉)演算法是典型的最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的

最短路徑演算法

問題:每個城市間的距離不一樣,任意選擇兩個城市,求出兩個城市間的最短距離 分析:用圖來表示城市和城市間的距離(鄰接矩陣),轉變成求圖的最短路徑 shortestPath.h #include <stdio.h> #define NUMVERTICES 10 #d

最短路徑 迪傑演算法的簡易實現 大話資料結構 P261改編

對應圖 #include<stdio.h> #define big 65530 #define max 100 int path[max]={0}; int shortpath[max]={0}; typedef struct Node{ c