手把手教你用Python實現Dijkstra算法(偽代碼+Python實現)

2021-02-23 運小籌



最短路問題Shortest Path Problem

之前的文章中我們已經用迪傑斯特拉算法求解過Solomon算例了,今天是用該算法求解有5個點連通圖的最短路徑。大家可以看完這篇再回顧一下之前的文章。(

如圖所示的連通圖,以s為起點,t為終點,求一條s到t的最短路徑。

Dijkstra算法

Dijkstra算法是一種動態規劃思想的算法:

把所有的點都標記為臨時標號,每個點有兩個屬性:起點到這個點的最短距離和這個點的前序節點;將起始點的最短距離初始化為0,將其餘點的最短距離初始化為無窮大;從起始點開始,探索其子節點,更新子節點的最短距離和前序節點,當所有子節點都探索完成,則修改當前節點的標號為永久標號;選擇剩餘臨時標號的點中,最短距離最小的,作為下一個要遍歷的點,重複上述過程,直到所有節點的標號都變成永久標號為止。Dijkstra算法解決最短路問題(SPP)偽代碼
Dijkstra算法解決最短路問題(SPP)Python實現5點連通圖的最短路徑

輸入模塊

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import networkx as nx
import copy
import re
import math

代碼語言表示文首5點連通圖

Nodes = ['s', 'a', 'b', 'c', 't']

Arecs = {('s', 'a'):5, ('s', 'b'):8, ('a', 'c'):2, ('b','a'):10, ('c','b'):3, ('b','t'):4, ('c','t'):3}

給圖中的點和弧添加屬性

Graph = nx.DiGraph()
for node in Nodes:
    Graph.add_node(node, min_dis = 0, previous_node = None)
for key in Arecs.keys():
    Graph.add_edge(key[0],key[1],length = Arecs[key])

定義用Dijkstra算法求解最短路的函數

def Dijkstra(Graph , org ,des):
 # 定義T
    T = list(Graph.nodes())
 
 # 給各點臨時標號
    for node in T:
        if (node == org) :
            Graph.nodes[node]['min_dis'] = 0
        else:
            Graph.nodes[node]['min_dis'] = np.inf
    current_node = org

    while (len(T) > 0):
        min_dis = np.inf
        
        # 更新永久標號的點
        for node in T:
            if (Graph.nodes[node]['min_dis'] < min_dis):
                current_node = node
                min_dis=Graph.nodes[node]['min_dis']
        if (current_node != None):
            T.remove(current_node)
        
        # 更新永久標號點相鄰點的臨時標號
        for child in Graph.successors(current_node):
            arc = (current_node, child)
            dis_t = Graph.nodes[current_node]['min_dis'] + Graph.edges[arc]['length']
            if (dis_t < Graph.nodes[child]['min_dis']):
                Graph.nodes[child]['min_dis'] = dis_t
                Graph.nodes[child]['previous_node'] = current_node
                
    # 確定最短路徑和最短距離
    min_dis = Graph.nodes[des]['min_dis']
    current_node = des
    shortest_path = [current_node]
    while (current_node != org):
        current_node=Graph.nodes[current_node]['previous_node']
        shortest_path.insert(0, current_node)
    return Graph, shortest_path, min_dis

調用函數求解文首的最短路徑問題

org = 's'
des = 't'
Graph, shortest_path, min_dis = Dijkstra(Graph, org, des)

結果輸出如下:(['s', 'a', 'c', 't'], 10)

相關焦點

  • 最全 Python 算法實現資源匯總!
    整理 | Rachel責編 | Jane出品 | Python大本營(ID:pythonnews)【導語】數據結構與算法是所有人都要學習的基礎課程為了幫助大家在這個假期能提高學習效率,進階 Python 技能,筆者為大家推薦了一份用 Python代碼實現算法的資源帖,涵蓋從入門到高級的各類算法。下文中,筆者首先對項目的整體內容進行了一個歸納,之後為大家選取了幾個內容比較豐富的部分,供大家更高效地使用這一資源。
  • 如何使用python完成數學建模常見算法
    在數學建模中主流的程式語言是MATLAB,但隨著python/R中數學軟體包的不斷完善,熟悉這兩種程式語言的同學也可以快速數學建模的編程環節。後面我們將介紹幾種常見數學建模算法的python實現,旨在展示python在本領域的強大威力。
  • 送你一份Python算法的打怪升級路線圖 | 用 Python 實現各種常用算法
    對程式設計師來說,算法的重要性不言而喻,算法基礎是否紮實,間接決定了你是月薪5000,還是月薪50000。實驗樓上線了一門免費的Python算法入門課——【用 Python 實現各種常用算法】,主要包括兩部分內容:一是各種算法的基本原理講解,二是各種算法的代碼實現,內容由淺入深,非常適合剛入門Python的同學學習。
  • Python Robotics代碼詳解:Dijkstra 搜索算法
    PythonRobotics是由Atsushi Sakai, Daniel Ingram等人建立的開原始碼軟體平臺:https://github.com/redglassli/PythonRobotics#a-algorithm收集了機器人學當下主流算法的python代碼(基於python3),為了幫助初學者明白各個算法的基本原理,詳細介紹見(PythonRobotics
  • 從零開始:用Python實現KNN算法
    算法(簡稱KNN算法)的邏輯很簡單,它易於理解和實現,是你可以使用的有力工具。通過學習這個教程,你將能夠用Python從0開始實現一個KNN算法。這個實現主要用來處理分類問題,我們將使用鳶尾花分類問題來演示這個例子。這個教程的學習要求是你能夠使用Python編碼,並且對實現一個KNN算法感興趣。
  • Python不超過10行代碼就可實現人臉識別,教你辨別真假
    依賴及其它依賴庫 $sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev獲得opencv原始碼 git clone https://github.com
  • 用python實現遺傳算法
    最近事情比較多,一個月沒有寫公眾號了,但也積累了些不錯的內容可以分享,今天就給大家介紹的是遺傳算法,並用python加以實現。在遺傳算法的學習過程中,在CSDN上看到一篇已有人分享的python代碼,因此直接借鑑過來,並結合《數學建模與數學實驗》進行補充。
  • 小白學數據:教你用Python實現簡單監督學習算法
    在IRIS數據集上實現sklearn中的KNN,並對給定的輸入進行花卉類型分類。首先,要應用機器學習算法,我們需要了解給定數據集的組成。現在讓我們使用代碼查看IRIS數據集。請確保你的電腦上成功安裝了Python。
  • 10行Python代碼也能實現,親測好用!
    大數據文摘出品編譯:朱一輝、雪清、小魚短短10行代碼就可以實現目標檢測?!本文作者和他的團隊構建了一個名為ImageAI 的Python庫,集成了現今流行的深度學習框架和計算機視覺庫。本文將手把手教你構建自己的第一個目標檢測應用,而且文摘菌已經幫你踩過坑了,親測有效!
  • Python如何實現超長整數
    當你使用像C這樣的低級語言編寫代碼時,你需要為整數選擇正確的數據類型和限定符; 在每一步中,你都需要考慮int是否足夠,或者你是否應該使用
  • 一行代碼實現Python並行處理
    撇開技術上的問題,例如線程的實現和 GIL,我覺得錯誤的教學指導才是主要問題。常見的經典 Python 多線程、多進程教程多顯得偏"重"。而且往往隔靴搔癢,沒有深入探討日常工作中最有用的內容。我並不是說使用生產者/消費者模型處理多線程/多進程任務是錯誤的(事實上,這一模型自有其用武之地)。只是,處理日常腳本任務時我們可以使用更有效率的模型。問題在於…而且,你還需要在通道兩端都構建相應的方法來協助其工作(如果需想要進行雙向通信或是保存結果還需要再引入一個隊列)。
  • 手把手教你用OpenCV和Python實現圖像和視頻神經風格遷移(代碼)
    首先說明的一點是,今天討論的方法在一個CPU上可以達到近乎實時的效果,如果在GPU上則完全可以實現實時效果。首先我們會簡單塔倫下什麼是神經風格遷移,以及它是如何運作的。之後我們會用OpenCV和Python動手操作。
  • 手把手教你用python搶票回家過年 !(附代碼)
    本文教大家用Python寫出搶火車票代碼以及實戰。首先看看如何快速查看剩餘火車票?當你想查詢一下火車票信息的時候,你還在上12306官網嗎?或是打開你手機裡的APP?下面讓我們來用Python寫一個命令行版的火車票查看器, 只要在命令行敲一行命令就能獲得你想要的火車票信息!如果你剛掌握了Python基礎,這將是個不錯的小練習。接口設計一個應用寫出來最終是要給人使用的,哪怕只是給你自己使用。所以,首先應該想想你希望怎麼使用它?
  • python利用百度雲接口實現車牌識別
    目前有兩個想法調雲在線的接口或者使用SDK做開發(配置環境和編譯第三方庫很麻煩,當然使用python可以避免這些問題)自己實現車牌識別算法(複雜)一開始準備使用百度雲文字識別C++ SDK來做,發現需要準備curl、jsoncpp和OpenCV,並且curl和jsoncpp需要自己編譯,很麻煩,所以換用了python來做,真的是順暢簡單。
  • 用 python 實現各種排序算法
    代碼如下:#!中你可以這麼寫:a, b = b, a,其實這是因為賦值符號的左右兩邊都是元組(這裡需要強調的是,在python中,元組其實是由逗號「,」來界定的,而不是括號)。,希爾排序是非穩定排序算法。
  • 如何在 i5 上實現 20 倍的 Python 運行速度?
    他對外宣布:在配備四核 i5 的 iMAC 上實現了 20 倍的性能加速!至於他是怎麼做到的,請繼續往下看(含代碼)。(對新手的提醒: Anaconda 是針對 Python 算法包的集合,Conda 則是 package manager,即算法包管理器。我兩個都用並且都很喜歡。)我使用 「conda create」來創造被我稱之為 intelpy 的環境。然後,我能夠使用 「source activate intelpy」、「source deactivate intelpy」來激活、關閉它。
  • Python實現Python解釋器
    你也許會覺得很奇怪,用Python實現Python解釋器?!好比「自己生下了自己」這種說法一樣奇怪。
  • 收藏 | 如何用Python實現機器學習算法(完整代碼)
    ,真正幫你從零轉型機器學習工程師!用Python實現出來的機器學習算法都是什麼樣子呢?下面從線性回歸到反向傳播算法、從SVM到K-means聚類算法,咱們一一來分析其中的Python代碼。五、K-Means聚類算法全部代碼https://github.com/lawlite19
  • 高斯混合模型(GMM):理念、數學、EM算法和python實現
    高斯混合模型是一種流行的無監督學習算法。GMM方法類似於K-Means聚類算法,但是由於其複雜性,它更健壯,更有用。K-means聚類使用歐式距離函數來發現數據中的聚類。只要數據相對於質心呈圓形分布,此方法就可以很好地工作。
  • 詳解 | 如何用Python實現機器學習算法
    來自:AI科技大本營(ID:rgznai100)用Python實現出來的機器學習算法都是什麼樣子呢