1. 程式人生 > >Dijkstra算法的思想和數學歸納法

Dijkstra算法的思想和數學歸納法

基礎 方程 led 單源最短路 view 路徑 ont 現在 算法

ospf協議很多人都知道,很多人也會配置而且很熟練,但是很少有人懂得其背後的思想是什麽,Dijkstra算法是求解單源最短路徑的絕妙算法之一,我打心眼裏頭喜歡這個算法,真想把之一去掉。Dijkstra算法是一種貪心算法,貪心算法的本質就是最值的和還是最值,也就是說人們相信我只要在點滴當中盡自己最大的努力,那麽最後的結果就是最好的,可能你會說不一定,但是你敢說如果有一個環節你沒有盡最大的努力,最後的結果會更好嗎?你不能,我也不能,因為現實總是很殘酷,事後諸葛亮只能出現在理想狀態,事情已經發生,那麽你就不能說更好的結果需要什麽條件,正所謂“證明一件事是錯的很容易,但是證明一件事正確根本不可能!”,因此貪心算法的證明非常復雜,可是Dijkstra算法確實是正確的,為什麽?不是因為它不是純粹的貪心算法,正是因為它的條件裏面存在的信息很少,我們可以利用另一把利器來證明之,這把利器就是“數學歸納法”。

數學歸納法是一種藝術,玩過多米諾骨牌的都知道,要使得任意數量的所有牌全部翻掉需要兩個條件而且只需要兩個條件,一個就是任意兩張牌間隔足夠近,另一個條件就是你必須推到第一張牌,就是這麽簡單。於是如果你往這個遊戲靠攏你會發現,牌的倒掉和牌的數量以及牌上的內容沒有任何關系,那麽任何可以歸結到這個遊戲的數學模型都可以用這個原理進行求解,多米諾骨牌遊戲的數學模型就是數學歸納法,數學歸納法進行的證明需要兩點,第一就是初始條件(推到第一張牌),第二就是假設n成立證明n+1成立(兩張牌間隔足夠近),貪心算法是一個步驟問題,如果我們可以證明貪心算法的第一部很顯然正確並且在歸納假設的情況下證明歸納假設的系一個步驟也正確的話,那麽貪心算法的局部最優解結合成的全局解一定是全局最優解,這是一定的。

Dijkstra算法是一個貪心算法,那麽我們可以通過數學歸納法證明其正確性,關鍵就是如何建立數學模型。Dijkstra算法的步驟是顯然的,是簡單的,我們只需要證明這個算法產生的路徑就是最短的就可以了,於是模型就有了,很多書上都用open-set作為“外面”的點,將close-set作為加入到“裏面”的點,那麽我們就證明每通過Dijkstra算法加入到close-set的點到原點的距離就是到原點距離的最短距離,這樣我們就證明了算法本身的正確性,因此開始用數學歸納法證明吧,當close-set中除了原點只有一個點的時候,這個點p離原點s的距離一定是最短的,因為如果s先到x再到p的距離比s直接到p還短,那麽s到x會更短,算法就不會選中p而會選中x,與假設矛盾,這裏已經證明了初始條件,下面開始歸納假設,設close-set中有k個點時,所有close-set中的k個點根據算法算出的距離都是最短的距離,那麽我們考慮加入第k+1個點加入時的情形,只要能證明k+1個點按照算法加入進close-set從而算出的距離也是最短距離的話,那麽問題得證,這個問題也是很好證明的,同樣用反證法,假設不是靠算法加入的,那麽路徑中一定除了終點p之外還有一個點在open-set中,如果這樣的話,根本就不可選中終點p而會選中那個經過的點,也是矛盾的,由此問題得證。在上面額證明中,所有在close-set中和p相連的點都會參與最後的最短距離競爭,因此就在它們當中選一條路徑最為結果就是問題的答案,而這正是算法的行為。

這裏可以看到有時候貪心算法可以用數學歸納法來證明,但是有的時候不能,不能的原因就在於約束條件太多,要麽就是因為初始條件無法被證明但是歸納假設卻正確,其實千萬不要過度懷疑貪心算法,我們人做事的時候不是也都是在用貪心算法嗎?如果有誰在做事之前來個全局證明或者必須證明其嚴密性的話,那麽這個人最終會因為理智過度要麽被社會淘汰,要麽成為劃時代的思想家。貪心算法來自於一個事實,那就是爆炸,爆炸波的包絡面總是呈球面向外擴撒,球面剛接觸到一個點的時候,這個點到爆炸源的距離肯定最短,這不是廢話嗎?這個點到爆炸源的連線不是一條線段嗎?很多的時候是一條線段,但是考慮到爆炸不是在一個密度相同的沒有障礙物的地方,而是在一個建築物裏面,該建築物內部有復雜的小隔間,而且各個隔間相通,隔間之間是堅固的鋼板隔開,爆炸無法摧毀這些隔板,那麽爆炸波的包絡面雖然是球面,但是實際路線卻不是線段,而是沿著各個隔間之間的通道走的,這個時候首先被波及的點沿著爆炸波的路線回到爆炸點,路線肯定是最短的,這是事實啊,好事怎麽也波及不到我們,壞事總是用最快的是速度到來。

有時候覺得人做事很多時候挺像計算機的,用了很多的算法,按經驗步驟進行,不求甚解,而我們從小學開始學的那些數學,比如解方程,函數求導之類的卻是純思維的東西,這些一般來用發掘新的算法,人的算法還來自於經驗,但是到底哪個更重要呢?

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

Dijkstra算法的思想和數學歸納法