




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上學 號: 算法設計與分析B大 作 業(yè)題 目多種方法解決多段圖的最短路徑問題學 院計算機科學與技術學院專 業(yè)軟件工程班 級姓 名指導教師2014年12月26日多種方法解決多段圖的最短路徑問題摘 要多段圖的最短路徑問題是求從源點到終點的最小代價路徑。本文主要描述的是分別用動態(tài)規(guī)劃法、貪心法和分支限界法來解決多段圖最短路徑問題時的情況。文章首先闡述了各個方法的原理,主要的思路是通過輸入一組數(shù)據(jù),比較三者的輸出結果的準確性以及運行時間,以之為基礎來分析、討論三者的性能區(qū)別。文章最后講述了若這幾種方法運行到有向圖中的情況,幾種方法的對比和它們比較適應的使用情況的討論,并給出了自
2、己的建議。關鍵字:多段圖最短路徑問題;動態(tài)規(guī)劃法;分支限界法;貪心法專心-專注-專業(yè)目 錄摘 要II1 引 言12 問題描述13 貪心法求解23.1 貪心法介紹23.2 問題分析34 動態(tài)規(guī)劃法求解34.1 動態(tài)規(guī)劃法介紹34.2 問題分析45 分支限界法求解55.1 分支限界法介紹55.2 問題分析56 程序清單66.1 源代碼66.2 結果截圖97 結果分析98 課程體會109 參考文獻101 引 言當前社會,關于最短路徑的問題屢屢出現(xiàn)。例如在開車自駕游的一個過程中,排除其它影響因素,從一個地點到另一點,這個時候必然是希望有一條距離最短的路程來盡量減少消耗的時間以及花費的(它們在模型中被稱
3、為代價),市場上對該問題的解決有很大的需求,因此,這里我將討論多段圖的最短路徑的問題。大二開設的數(shù)據(jù)結構課程中就包括最短路徑這方面問題的討論。當時老師介紹了分別面向單源(Dijkstra算法)與非單源(Floyd算法)兩種問題的算法這是我們最早的對最短路徑方面的理解,也是我們接觸的比較早的關于圖的問題。在這學期的算法設計與分析課程中,我們學習了很多基本的算法設計技術,蠻力法、分治法、減治法、動態(tài)規(guī)劃法、貪心法、回溯法、分支限界法等,它們把以前學習的諸多方法都命名并歸納分類起來,其中有多種算法都可以用來解決最短路徑問題,并且該問題作為一個圖的問題,對該問題的繼續(xù)探討優(yōu)化的需求很大、本文將就不同算
4、法在解決該最短路徑問題時的不同方法進行對比并給出該問題在不同基礎上不同的最終解決方案。由于時間的限制,本文將重點分析動態(tài)規(guī)劃法下的情況,并會對圖的情況加以簡化、限制,最后會對其它的圖做一些拓展。2 問題描述設圖G=(V, E)是一個帶權有向連通圖,如果把頂點集合V劃分成k個互不相交的子集Vi(2kn, 1ik),使得E中的任何一條邊(u, v),必有uVi,vVi+m(1ik, 1i+mk),則稱圖G為多段圖,稱sV1為源點,tVk為終點。多段圖的最短路徑問題是求從源點到終點的最小代價路徑。多段圖的最短路徑問題是求從源點到終點的最小代價路徑。由于多段圖將頂點劃分為k個互不相交的子集,所以,可以
5、將多段圖劃分為k段,每一段包含頂點的一個子集。不失一般性,將多段圖的頂點按照段的順序進行編號,同一段內(nèi)頂點的相互順序無關緊要。假設圖中的頂點個數(shù)為n,則源點s的編號為0,終點t的編號為n-1,并且,對圖中的任何一條邊(u, v),頂點u的編號小于頂點v的編號。這里我們討論的多段圖是可以分段的,各段之間的關系最好是單向的,即對該有向圖來說,圖中是沒有環(huán)的存在的。3 貪心法求解3.1 貪心法介紹貪心法是一種簡單有效的方法。它在解決問題的策略上只根據(jù)當前已有的信息就做出選擇,而且一旦做出了選擇,不管將來有什么結果,這個選擇都不會改變。貪心法并不是從整體最優(yōu)考慮,它所做出的選擇只是在某種意義上的局部最
6、優(yōu)。這種局部最優(yōu)選擇并不總能獲得整體最優(yōu)解,但通常能獲得近似最優(yōu)解。本例中利用的貪心算法,是每當要選擇下一個結點時,總是選擇與當前結點間代價最小的點,這就叫做總是優(yōu)先局部最優(yōu)解,以此得到最終的解序列。這里舉一個貪心法的拓展例子Dijkstra算法。Dijkstra算法是一種最短路徑算法,用于計算一個節(jié)點到其它所有節(jié)點的最短路徑,動態(tài)路由協(xié)議OSPF中就用到了Dijkstra算法來為路由計算最短路徑。算法本身并不是按照我們的正常思維習慣,我們一般會從原點遍歷所有與之相連的節(jié)點,找到最短路徑,再從最短路徑上的那個點遍歷與之相連的所有其它點(原點除外),然后依次類推。這樣做雖然可以算出一個樹形,但是
7、在大多數(shù)情況下,這種算法會產(chǎn)生很多次優(yōu)路徑,也就是說非最短路徑。Dijkstra算法的大概過程:假設有兩個集合或者說兩個表,表A和表B,表A表示生成路徑,表B表示最后確定的路徑(1) 從原點出發(fā),遍歷檢查所有與之相連的節(jié)點,將原點和這些節(jié)點存放到表A中,并記錄下兩節(jié)點之間的代價;(2) 將代價最小的代價值和這兩節(jié)點移動到表B中(其中一個是原點);(3) 把這個節(jié)點所連接的子節(jié)點找出,放入到表A中,算出子節(jié)點到原點的代價;(4) 重復第二步和第三步直到表A為空。然后根據(jù)表B中的數(shù)據(jù)算出最優(yōu)樹。維基百科中還有另一種說法,Dijkstra算法的輸入包含了一個有權重的有向圖G,以及G中的一個來源頂點S
8、。 我們以V表示G中所有頂點的集合。 每一個圖中的邊,都是兩個頂點所形成的有序元素對。(u,v)表示從頂點u到v有路徑相連。 我們以E所有邊的集合,而邊的權重則由權重函數(shù)w: E 0, 定義。 因此,w(u,v)就是從頂點u到頂點v的非負花費值(cost)。 邊的花費可以想像成兩個頂點之間的距離。任兩點間路徑的花費值,就是該路徑上所有邊的花費值總和。 已知有V中有頂點s及t,Dijkstra算法可以找到s到t的最低花費路徑(i.e. 最短路徑)。 這個算法也可以在一個圖中,
9、找到從一個頂點s到任何其它頂點的最短路徑。3.2 問題分析以起始點為中心向外層層擴展,直到擴展到終點為止。Dijstra算法(邊的拓展)While(!(每一個dv=最短路徑))If(存在一條從u到v的邊) If(du+w(u,v)<dv) dv= du+w(u,v);4 動態(tài)規(guī)劃法求解4.1 動態(tài)規(guī)劃法介紹動態(tài)規(guī)劃主要用于求解以時間劃分階段的動態(tài)過程的優(yōu)化問題,但是一些與時間無關的靜態(tài)規(guī)劃(如線性規(guī)劃、非線性規(guī)劃),可以人為地引進時間因素,把它視為多階段決策過程,也可以用動態(tài)規(guī)劃方法方便地求解。動態(tài)規(guī)劃是考察問題的一種途徑,或是求解某類問題的一種方法。動態(tài)規(guī)劃問世以來,在經(jīng)濟管理、生產(chǎn)調(diào)
10、度、工程技術和最優(yōu)控制等方面得到了廣泛的應用。例如最短路線、庫存管理、資源分配、設備更新、排序、裝載等問題,用動態(tài)規(guī)劃方法比其它方法求解更為方便。動態(tài)規(guī)劃法設計算法一般分成三個階段:(1) 劃分子問題:將原問題分解為若干個子問題, 每個子問題對應一個決策階段,并且子問題之間具有重疊關系;(2) 確定動態(tài)規(guī)劃函數(shù):根據(jù)子問題之間的重疊關系找到子問題滿足的遞推關系式(即動態(tài)規(guī)劃函數(shù)),這是動態(tài)規(guī)劃法的關鍵;(3) 填寫表格:設計表格,以自底向上的方式計算各個子問題的解并填表,實現(xiàn)動態(tài) 原問題的解 原問題 填 表子問題1子問題2子問題n規(guī)劃過程。4.2 問題分析設數(shù)組costn存儲最短路徑長度,co
11、stj表示從源點s到頂點j的最短路徑長度,數(shù)組pathn記錄狀態(tài)轉(zhuǎn)移,pathj表示從源點到頂點j的路徑上頂點的前一個頂點,動態(tài)規(guī)劃法求解多段圖的最短路徑問題的算法如下:輸入:多段圖的代價矩陣輸出:最短路徑長度及路徑1. 循環(huán)變量j從1n-1重復下述操作,執(zhí)行填表工作: 1.1 考察頂點j的所有入邊,對于邊(i, j)E: 1.1.1 costj=mincosti+cij; 1.1.2 pathj=使costi+cij最小的i; 1.2 j+;2. 輸出最短路徑長度costn-1;3. 循環(huán)變量i=pathn-1,循環(huán)直到pathi=0: 3.1 輸出pathi; 3.2 i=pathi;第一
12、部分是依次計算各個頂點到終點的最短路徑,由兩層嵌套的循環(huán)組成,外層循環(huán)執(zhí)行n-1次,內(nèi)層循環(huán)對所有入邊進行計算,并且在所有循環(huán)中,每條入邊只計算一次。假定圖的邊數(shù)為m,則這部分的時間性能是O(m);第二部分是輸出最短路徑經(jīng)過的頂點,設多段圖劃分為k段,其時間性能是O(k)。所以,該算法的時間復雜性為O(n+k)。 5 分支限界法求解5.1 分支限界法介紹分支限界法按廣度優(yōu)先策略搜索問題的解空間樹,在搜索過程中,對待處理的結點根據(jù)限界函數(shù)估算目標函數(shù)的可能取值,從中選取使目標函數(shù)取得極值(極大或極?。┑慕Y點優(yōu)先進行廣度優(yōu)先搜索,從而不斷調(diào)整搜索方向,盡快找到問題的解。5.2 問題分析討論當用分支
13、限界法用來解決多段圖路徑問題的過程:首先對該多段圖應用貪心法求得近似解,并算出其代價路徑。將其作為多段圖最短路徑問題的上界。而把每一段最小的代價相加,可以得到一個非常簡單的下界。于是,就可以得到了目標函數(shù)的一個大致的范圍。由于多段圖將頂點劃分為k個互不相交的子集,所以,多段圖劃分為k段,一旦某條路徑的一些段被確定后,就可以并入這些信息并計算部分解的目標函數(shù)值的下界。一般情況下,對于一個正在生成的路徑,假設已經(jīng)確定了i段(1ik),其路徑為(r1, r2, , ri, ri+1),此時,該部分解的目標函數(shù)值的計算方法即限界函數(shù)如下:應用分支限界法同樣求解多段圖的最短路徑問題,具體的搜索過程是這樣
14、進行的,首先考慮根節(jié)點,根據(jù)限界函數(shù)算出目標函數(shù)的值,這里每種情況下的目標函數(shù)值下界都要算出來并且加以比較,下界的計算方法為除了加上選定點與初始點之間的距離外,以后的第一個點選擇一選定點為初始點到下段最小代價的路徑,以后的段與段之間的代價都按它們之間最小的代價來計算。這樣再加上根節(jié)點與初始階段之間的最小代價,就得到這種情況下的解了。在得到的代價中,找出最小的代價,并以之為初始結點循環(huán)往下做,直到到達目標結點。算法如下:1根據(jù)限界函數(shù)計算目標函數(shù)的下界down;采用貪心法得到上界up;2將待處理結點表PT初始化為空;3for (i=1; i<=k; i+)xi=0;4i=1; u=0; /
15、求解第i段 5while (i>=1) 5.1 對頂點u的所有鄰接點v 5.1.1 計算目標函數(shù)值lb; 5.1.2 若lb<=up,則將i,<u,v>,lb存儲在表PT中; 5.2 如果i= =k-1且葉子結點的lb值在表PT中最小, 則輸出該葉子結點對應的最優(yōu)解; 5.3 否則,如果i= =k-1且表PT中的葉子結點的lb值不是最小,則 5.3.1 up=表PT中的葉子結點最小的lb值; 5.3.2 將表PT中目標函數(shù)值超出up的結點刪除; 5.4 u=表PT中l(wèi)b最小的結點的v值; 5.5 i=表PT中l(wèi)b最小的結點的i值;i+;6 程序清單6.1 源代碼#inc
16、lude<iostream.h>const int N = 20;const int MAX = 1000;int arcNN; int Backpath(int n);int creatGraph();int creatGraph()int i, j, k;int weight;int vnum, arcnum;cout<<"輸入頂點的個數(shù)和邊的個數(shù):"<<endl;cin>>vnum>>arcnum;for (i = 0; i < vnum; i+)for (j = 0; j < vnum; j+)
17、arcij = MAX;for (k = 0; k < arcnum; k+)cout<<"輸入邊的兩個頂點和權值:"cin>>i>>j>>weight;arcij = weight;return vnum;int Backpath(int n)int i, j, temp;int costN;int pathN;for(i = 0; i < n; i+)costi = MAX;pathi = -1;cost0 = 0;for(j = 1; j < n; j+)for(i = j - 1; i >= 0
18、; i-)if (arcij + costi < costj)costj = arcij + costi;pathj = i;cout<<n-1; i = n-1;while (pathi >= 0)cout<<"<-"<<pathi;i = pathi;cout<<endl;return costn-1;int main()int n = creatGraph( );int pathLen = Backpath(n);cout<<"最短路徑的長度是:"<<path
19、Len<<endl;return 0;6.2 結果截圖7 結果分析(1) 貪心法、動態(tài)規(guī)劃法和分支限界法都可以用來解決多段最短路徑問題,然而在這種情況相比之下,貪心法的運算效率比較高,因為它不像另外兩種方法一樣,需要涉及到許多的點??梢钥吹?,動態(tài)規(guī)劃法由于需要填表,并有一個相關的迭代問題,它幾乎涉及了所有的點;而分支限界法,它通過貪心法設置的上下限,并以它們?yōu)橐罁?jù)進行剪枝,減少了許多的運算量。而貪心法,訪問了最少的點。(2) 就結果準確性來看,就本題例子來看,貪心法結果為0 2 4 7 9,路徑的代價為20;動態(tài)分配法采取的路徑為:0 3 5 8 9,路徑的代價為16;而分支限界法
20、,結果為0 3 5 8 9,路徑的代價為16??梢钥闯?,在這個方面,動態(tài)分配法和分支限界法都達到了預期的結果,相比直線,貪心法的誤差就比較大了。由以上的討論,我們可以看出分支限界法的綜合性能比較好,它和動態(tài)規(guī)劃法在解決多段最短路徑問題時都可以得到正確解,而貪心法雖然可以省時間與空間,但結果不準確是它的缺點。各方法都是有利有弊的。因此在選擇方法時,還應當根據(jù)實際情況。當只需要大概的一個解時,當然是要用省時省力的貪心法;如果對結果又比較高的要求的話,就要采取動態(tài)規(guī)劃法或分支限界法。dijkstra算法的明顯優(yōu)點就是它的多用性,它可以求任意一點到其它某一點的距離,但是它訪問的數(shù)據(jù)量很大,幾乎要訪問所
21、有的邊(相對于貪心法而言),因此這里來說,在單純的解決多段最短路徑問題時,它們的功能都差不多,而在解決其它較復雜的圖時,Dijkstra算法有明顯的優(yōu)越性,但當然,作為貪心法的一種,它的結果的準確性不是那么的高。Dijkstra算法在本質(zhì)上為貪心算法,每一步的選擇為當前步的最優(yōu),復雜度為O(n*n)。動態(tài)規(guī)劃法是可以看作是對分支限界法的改進。其實,它們各有各的優(yōu)缺點,可以嘗試將它們混合起來用,揚長避短,設置范圍,并且過程中對肯定不會是最后結果的數(shù)據(jù)“剪枝”。這樣就可以提高運行速率了。8 課程體會算法分析與設計是一門非常重要的課程。很多問題的解決,程序的編寫都要依賴它,在軟件還是面向過程的階段,就有“程序=算法+數(shù)據(jù)結構”這個公式。算法的學習對于培養(yǎng)一個人的邏輯思維能力是有極大幫助的,它可以培養(yǎng)我們養(yǎng)成思考分析問題,解決問題的能力。作
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新建清淤溝施工方案
- 魚池裝飾改造方案范本
- 6年級上冊方程
- 5年級下冊語英語書
- 等邊角鋼的規(guī)格型號
- 地下碳儲發(fā)展文章
- 2024年海南省海東市樂都區(qū)部分學校中考語文一模試卷
- 2025年重慶化工職業(yè)學院單招職業(yè)傾向性考試題庫附答案
- 2025年延安職業(yè)技術學院單招職業(yè)適應性測試題庫參考答案
- 2025年關于憲法知識競賽培訓試題及答案
- 頂管專項施工方案
- 農(nóng)田土壤改良項目實施方案
- 2024年湖北省公務員錄用考試《行測》試題及答案解析
- 2024中國兒童大腦發(fā)育白皮書
- 某幼兒園食物中毒事故應急預案
- DB61T 5097-2024 強夯法處理濕陷性黃土地基技術規(guī)程
- 南瓜小房子故事課件
- 2024-2030年中國地鐵廣告行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 高等職業(yè)學校人工智能技術應用專業(yè)實訓教學條件建設標準
- 2025年高考生物總復習:減數(shù)分裂和受精作用
- 運動損傷預測與預防技術
評論
0/150
提交評論