HOME 首頁(yè)
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營(yíng)
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    最短路徑算法有哪些(最短路徑算法總結(jié))

    發(fā)布時(shí)間:2023-04-08 17:42:32     稿源: 創(chuàng)意嶺    閱讀: 147        

    大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于最短路徑算法有哪些的問題,以下是小編對(duì)此問題的歸納整理,讓我們一起來(lái)看看吧。

    開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端

    官網(wǎng):https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    最短路徑算法有哪些(最短路徑算法總結(jié))

    一、權(quán)圖中求最短路徑都有哪些算法?

    帶權(quán)圖也分有向和無(wú)向兩種,基本的算法可以看看書咯。

    帶權(quán)的無(wú)向圖的最短路徑又叫最小生成樹,Prim算法和Kruskal算法;

    帶權(quán)的有向圖的最短路徑算法有迪杰斯特拉算法和佛洛依德算法;

    二、最短路徑 | 深入淺出Dijkstra算法(一)

    上次我們介紹了神奇的只有 五行的 Floyd-Warshall 最短路算法 ,它可以方便的求得 任意兩點(diǎn)的最短路徑, 這稱為 “多源最短路”。

    這次來(lái)介紹 指定一個(gè)點(diǎn)(源點(diǎn))到其余各個(gè)頂點(diǎn)的最短路徑, 也叫做 “單源最短路徑”。 例如求下圖中的 1 號(hào)頂點(diǎn)到 2、3、4、5、6 號(hào)頂點(diǎn)的最短路徑。

    與 Floyd-Warshall 算法一樣,這里仍然 使用二維數(shù)組 e 來(lái)存儲(chǔ)頂點(diǎn)之間邊的關(guān)系, 初始值如下。

    我們還需要用 一個(gè)一維數(shù)組 dis 來(lái)存儲(chǔ) 1 號(hào)頂點(diǎn)到其余各個(gè)頂點(diǎn)的初始路程, 我們可以稱 dis 數(shù)組為 “距離表”, 如下。

    我們將此時(shí) dis 數(shù)組中的值稱為 最短路的“估計(jì)值”。

    既然是 求 1 號(hào)頂點(diǎn)到其余各個(gè)頂點(diǎn)的最短路程, 那就 先找一個(gè)離 1 號(hào)頂點(diǎn)最近的頂點(diǎn)。

    通過數(shù)組 dis 可知當(dāng)前離 1 號(hào)頂點(diǎn)最近是 2 號(hào)頂點(diǎn)。 當(dāng)選擇了 2 號(hào)頂點(diǎn)后,dis[2]的值就已經(jīng)從“估計(jì)值”變?yōu)榱恕按_定值”, 即 1 號(hào)頂點(diǎn)到 2 號(hào)頂點(diǎn)的最短路程就是當(dāng)前 dis[2]值。

    為什么呢?你想啊, 目前離 1 號(hào)頂點(diǎn)最近的是 2 號(hào)頂點(diǎn),并且這個(gè)圖所有的邊都是正數(shù),那么肯定不可能通過第三個(gè)頂點(diǎn)中轉(zhuǎn),使得 1 號(hào)頂點(diǎn)到 2 號(hào)頂點(diǎn)的路程進(jìn)一步縮短了。 因此 1 號(hào)頂點(diǎn)到其它頂點(diǎn)的路程肯定沒有 1 號(hào)到 2 號(hào)頂點(diǎn)短,對(duì)吧 O(∩_∩)O~

    既然選了 2 號(hào)頂點(diǎn),接下來(lái)再來(lái)看 2 號(hào)頂點(diǎn) 有哪些 出邊 呢。有 2->3 和 2->4 這兩條邊。

    先討論 通過 2->3 這條邊能否讓 1 號(hào)頂點(diǎn)到 3 號(hào)頂點(diǎn)的路程變短。 也就是說(shuō)現(xiàn)在來(lái)比較 dis[3] dis[2]+e[2][3] 的大小。其中 dis[3]表示 1 號(hào)頂點(diǎn)到 3 號(hào)頂點(diǎn)的路程,dis[2]+e[2][3]中 dis[2]表示 1 號(hào)頂點(diǎn)到 2 號(hào)頂點(diǎn)的路程,e[2][3]表示 2->3 這條邊。所以 dis[2]+e[2][3]就表示從 1 號(hào)頂點(diǎn)先到 2 號(hào)頂點(diǎn),再通過 2->3 這條邊,到達(dá) 3 號(hào)頂點(diǎn)的路程。

    我們發(fā)現(xiàn) dis[3]=12,dis[2]+e[2][3]=1+9=10,dis[3]>dis[2]+e[2][3],因此 dis[3]要更新為 10。這個(gè)過程有個(gè)專業(yè)術(shù)語(yǔ)叫做 “松弛” 。即 1 號(hào)頂點(diǎn)到 3 號(hào)頂點(diǎn)的路程即 dis[3],通過 2->3 這條邊 松弛成功。 這便是 Dijkstra 算法的主要思想: 通過 “邊” 來(lái)松弛 1 號(hào)頂點(diǎn)到其余各個(gè)頂點(diǎn)的路程。

    同理通過 2->4(e[2][4]),可以將 dis[4]的值從 ∞ 松弛為 4(dis[4]初始為 ∞,dis[2]+e[2][4]=1+3=4,dis[4]>dis[2]+e[2][4],因此 dis[4]要更新為 4)。

    剛才我們對(duì) 2 號(hào)頂點(diǎn)所有的出邊進(jìn)行了松弛。松弛完畢之后 dis 數(shù)組為:

    接下來(lái),繼續(xù)在剩下的 3、4、5 和 6 號(hào)頂點(diǎn)中,選出離 1 號(hào)頂點(diǎn)最近的頂點(diǎn)。通過上面更新過 dis 數(shù)組,當(dāng)前離 1 號(hào)頂點(diǎn)最近是 4 號(hào)頂點(diǎn)。此時(shí),dis[4]的值已經(jīng)從“估計(jì)值”變?yōu)榱恕按_定值”。下面繼續(xù)對(duì) 4 號(hào)頂點(diǎn)的所有出邊(4->3,4->5 和 4->6)用剛才的方法進(jìn)行松弛。松弛完畢之后 dis 數(shù)組為:

    繼續(xù)在剩下的 3、5 和 6 號(hào)頂點(diǎn)中,選出離 1 號(hào)頂點(diǎn)最近的頂點(diǎn),這次選擇 3 號(hào)頂點(diǎn)。此時(shí),dis[3]的值已經(jīng)從“估計(jì)值”變?yōu)榱恕按_定值”。對(duì) 3 號(hào)頂點(diǎn)的所有出邊(3->5)進(jìn)行松弛。松弛完畢之后 dis 數(shù)組為:

    繼續(xù)在剩下的 5 和 6 號(hào)頂點(diǎn)中,選出離 1 號(hào)頂點(diǎn)最近的頂點(diǎn),這次選擇 5 號(hào)頂點(diǎn)。此時(shí),dis[5]的值已經(jīng)從“估計(jì)值”變?yōu)榱恕按_定值”。對(duì)5號(hào)頂點(diǎn)的所有出邊(5->4)進(jìn)行松弛。松弛完畢之后 dis 數(shù)組為:

    最后對(duì) 6 號(hào)頂點(diǎn)的所有出邊進(jìn)行松弛。因?yàn)檫@個(gè)例子中 6 號(hào)頂點(diǎn)沒有出邊,因此不用處理。 到此,dis 數(shù)組中所有的值都已經(jīng)從“估計(jì)值”變?yōu)榱恕按_定值”。

    最終 dis 數(shù)組如下,這便是 1 號(hào)頂點(diǎn)到其余各個(gè)頂點(diǎn)的最短路徑。

    OK,現(xiàn)在來(lái)總結(jié)一下剛才的算法。 Dijkstra算法的基本思想是:每次找到離源點(diǎn)(上面例子的源點(diǎn)就是 1 號(hào)頂點(diǎn))最近的一個(gè)頂點(diǎn),然后以該頂點(diǎn)為中心進(jìn)行擴(kuò)展,最終得到源點(diǎn)到其余所有點(diǎn)的最短路徑。

    基本步驟如下:

    在 博客 中看到兩個(gè)比較有趣的問題,也是在學(xué)習(xí)Dijkstra時(shí),可能會(huì)有疑問的問題。

    當(dāng)我們看到上面這個(gè)圖的時(shí)候,憑借多年對(duì)平面幾何的學(xué)習(xí),會(huì)發(fā)現(xiàn)在“三角形ABC”中,滿足不了 構(gòu)成三角形的條件(任意兩邊之和大于第三邊)。 納尼,那為什么圖中能那樣子畫?

    還是“三角形ABC”,以A為起點(diǎn),B為終點(diǎn),如果按照平面幾何的知識(shí), “兩點(diǎn)之間線段最短”, 那么,A到B的最短距離就應(yīng)該是6(線段AB),但是,實(shí)際上A到B的最短距離卻是3+2=5。這又怎么解釋?

    其實(shí),之所以會(huì)有上面的疑問,是因?yàn)?strong> 對(duì)邊的權(quán)值和邊的長(zhǎng)度這兩個(gè)概念的混淆, 。之所以這樣畫,也只是為了方便理解(每個(gè)人寫草稿的方式不同,你完全可以用別的方式表示,只要便于你理解即可)。

    PS:數(shù)組實(shí)現(xiàn)鄰接表可能較難理解,可以看一下 這里

    參考資料:

    Dijkstra算法是一種基于貪心策略的算法。每次新擴(kuò)展一個(gè)路程最短的點(diǎn),更新與其相鄰的點(diǎn)的路程。當(dāng)所有邊權(quán)都為正時(shí),由于不會(huì)存在一個(gè)路程更短的沒擴(kuò)展過的點(diǎn),所以這個(gè)點(diǎn)的路程永遠(yuǎn)不會(huì)再被改變,因而保證了算法的正確性。

    根據(jù)這個(gè)原理, 用Dijkstra算法求最短路徑的圖不能有負(fù)權(quán)邊, 因?yàn)閿U(kuò)展到負(fù)權(quán)邊的時(shí)候會(huì)產(chǎn)生更短的路徑,有可能破壞了已經(jīng)更新的點(diǎn)路徑不會(huì)發(fā)生改變的性質(zhì)。

    那么,有沒有可以求帶負(fù)權(quán)邊的指定頂點(diǎn)到其余各個(gè)頂點(diǎn)的最短路徑算法(即“單源最短路徑”問題)呢?答案是有的, Bellman-Ford算法 就是一種。(我們已經(jīng)知道了 Floyd-Warshall 可以解決“多源最短路”問題,也要求圖的邊權(quán)均為正)

    通過 鄰接矩陣 的Dijkstra時(shí)間復(fù)雜度是 。其中每次找到離 1 號(hào)頂點(diǎn)最近的頂點(diǎn)的時(shí)間復(fù)雜度是 O(N),這里我們可以用 優(yōu)先隊(duì)列(堆) 來(lái)優(yōu)化,使得這一部分的時(shí)間復(fù)雜度降低到 。這個(gè)我們將在后面討論。

    三、矩陣乘法求最短路徑

    們把求A →E 的最短路分解為四個(gè)階段A →B →C→D →E 來(lái)求解.每一個(gè)階段可以用一個(gè)矩陣來(lái)表示,這個(gè)矩陣稱為權(quán)矩陣.相鄰階段的路徑可以用權(quán)矩陣的乘積來(lái)表示.但這里的矩陣乘法和普通矩陣乘積運(yùn)算的區(qū)別是:普通矩陣乘積其對(duì)應(yīng)元素是相應(yīng)元素乘積的代數(shù)和,這里把元素相乘改為相加,元素的代數(shù)和改為取小運(yùn)算,如果不同層節(jié)點(diǎn)間沒有連接,則視它們之間的距離為無(wú)窮大. 如果是求極大,改為取大運(yùn)算,此時(shí)如果不同層節(jié)點(diǎn)間沒有連接,則視它們的距離為0.

    如下:

    由A地到B地的距離可表示為:A[2 5 8]

    由B地到C地的權(quán)矩陣可表示為

    [3,6,5;7,10,8;4,9,6]

    因此由A到C的權(quán)矩陣為[2,5,8][3,6,5;7,10,8;4,9,6]=[5,8,7]

    因此由A到D的權(quán)矩陣為[5,8,7)][7,5;3,4;5,2]=[11 ,9]

    由A→E的權(quán)矩陣為:[11 ,9][4,2)]=[15,11]

    因此從家里到學(xué)校的最短距離為11百米,最近的路徑為從A地出發(fā)經(jīng)過B1地C1地D2地到達(dá)E地.

    下面我們給出基于“矩陣乘法”求解最短路的算法:

    第一階段:計(jì)算出圖中從起始點(diǎn)到終點(diǎn)最短路的長(zhǎng)度.

    step1  劃分出該網(wǎng)絡(luò)圖中的層次關(guān)系(網(wǎng)絡(luò)劃分為N 層,起點(diǎn)為第一層,終點(diǎn)為第N 層) ;

    step2  依次給出從第i 層到第i + 1 層的權(quán)矩陣( i= 1 ,2 , …, N21) ; (若第i 層有m 個(gè)頂點(diǎn);第i + 1 層有n

    個(gè)頂點(diǎn), 則從第i 層到第i + 1 層的權(quán)矩陣為m *n

    階) .

    step3  按照我們定義的矩陣乘法計(jì)算出最短路的

    數(shù)值.

    第二階段:尋找最短路所經(jīng)過的中間點(diǎn).

    (利用第一階段中step2 的數(shù)據(jù)) 計(jì)算出從第i 層到

    終點(diǎn)的最短路, 對(duì)比與i21 層到終點(diǎn)的最短路, 從而確

    定出第i 層上最短路所經(jīng)過的頂點(diǎn)( i = 2 , …, N21) .

    四、最短路徑 - Dijkstra算法

    算法每次都查找距離起始點(diǎn)最近的點(diǎn),那么剩下的點(diǎn)距離起始點(diǎn)的距離一定比當(dāng)前點(diǎn)大。

    1.選定A節(jié)點(diǎn)并初始化,如上述步驟3所示

    2.執(zhí)行上述 4、5兩步驟,找出U集合中路徑最短的節(jié)點(diǎn)D 加入S集合,并根據(jù)條件 if ( 'D 到 B,C,E 的距離' + 'AD 距離' < 'A 到 B,C,E 的距離' ) 來(lái)更新U集合

    3.這時(shí)候 A->B, A->C 都為3,沒關(guān)系。其實(shí)這時(shí)候他倆都是最短距離,如果從算法邏輯來(lái)講的話,會(huì)先取到B點(diǎn)。而這個(gè)時(shí)候 if 條件變成了 if ( 'B 到 C,E 的距離' + 'AB 距離' < 'A 到 C,E 的距離' ) ,如圖所示這時(shí)候A->B距離 其實(shí)為 A->D->B

    思路就是這樣,往后就是大同小異了

    算法結(jié)束

    (圖片來(lái)源于網(wǎng)絡(luò))

    Dijkstra算法保證能找到一條從初始點(diǎn)到目標(biāo)點(diǎn)的最短路徑,只要所有的邊都有一個(gè)非負(fù)的代價(jià)值。在上圖中,粉紅色的結(jié)點(diǎn)是初始結(jié)點(diǎn),藍(lán)色的是目標(biāo)點(diǎn),而類菱形的有色區(qū)域則是Dijkstra算法掃描過的區(qū)域。顏色最淡的區(qū)域是那些離初始點(diǎn)最遠(yuǎn)的,因而形成探測(cè)過程(exploration)的邊境(frontier)。因而Dijkstra算法可以找到一條最短的路徑,但是效率上并不高。

    數(shù)據(jù)結(jié)構(gòu)--Dijkstra算法最清楚的講解

    以上就是關(guān)于最短路徑算法有哪些相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。


    推薦閱讀:

    最短路徑算法有哪些(最短路徑算法總結(jié))

    圖最短路徑算法

    院線電影最短時(shí)長(zhǎng)

    普陀區(qū)庭院景觀設(shè)計(jì)效果圖(普陀區(qū)庭院景觀設(shè)計(jì)效果圖片)

    常州綠化景觀設(shè)計(jì)資質(zhì)(常州綠化景觀設(shè)計(jì)資質(zhì)公司)