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

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

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

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相連的點都會參與最後的最短距離競爭,因此就在它們當中選一條路徑最為結果就是問題的答案,而這正是演算法的行為。

 

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

 

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

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述