-
當前位置:首頁 > 創(chuàng)意學院 > 技術(shù) > 專題列表 > 正文
圖的四種最短路徑算法(圖的四種最短路徑算法是)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于圖的四種最短路徑算法的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、最短路徑算法(Dijkstra)
Dijkstra( 迪科斯特拉 )算法是用來解決單源最短路徑的算法,要求路徑權(quán)值非負數(shù)。該算法利用了深度優(yōu)先搜索和貪心的算法。
下面是一個有權(quán)圖,求從A到各個節(jié)點的最短路徑。
第1步:從A點出發(fā),判斷每個點到A點的路徑(如果該點不能直連A點則距離值為無窮大,如果該點能和A直連則是當前的權(quán)值),計算完之后把A點上色,結(jié)果如下圖:
第2步:從除A點之外的點查找到距離A點最近的點C,從C點出發(fā)查找其鄰近的節(jié)點(除去已上色的點),并重新計算C點的鄰近點距離A點的值,如圖中B點,若新值(C點到A點的值+C點到該點的路徑)小于原值,則將值更新為5,同理更新D、E點。同時將C標記為已經(jīng)處理過,如圖所示涂色。
第3步:從上色的節(jié)點中查找距離A最近的B點,重復第3步操作。
第4步: 重復第3步,2步,直到所有的節(jié)點都上色。
最后就算出了從A點到所有點的最短距離。
leetcode 743題
二、求圖中任意兩點之間最短路徑有什么算法?
單源節(jié)點到其他任意節(jié)點的最短路徑采用Dijkstra算法,任意兩個節(jié)點之間的最短路徑使用Floyd算法,這兩個算法有很多地方可以找打。
三、最短路徑算法
沒有圖怎么設(shè)計算法啊!!!
四、最短路徑算法
Dijkstra算法,A*算法和D*算法
Dijkstra算法是典型最短路算法,用于計算一個節(jié)點到其他所有節(jié)點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。Dijkstra算法能得出最短路徑的最優(yōu)解,但由于它遍歷計算的節(jié)點很多,所以效率低。
Dijkstra算法是很有代表性的最短路算法,在很多專業(yè)課程中都作為基本內(nèi)容有詳細的介紹,如數(shù)據(jù)結(jié)構(gòu),圖論,運籌學等等。
Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN, CLOSE表方式,Drew為了和下面要介紹的 A* 算法和 D* 算法表述一致,這里均采用OPEN,CLOSE表的方式。
大概過程:
創(chuàng)建兩個表,OPEN, CLOSE。
OPEN表保存所有已生成而未考察的節(jié)點,CLOSED表中記錄已訪問過的節(jié)點。
1. 訪問路網(wǎng)中里起始點最近且沒有被檢查過的點,把這個點放入OPEN組中等待檢查。
2. 從OPEN表中找出距起始點最近的點,找出這個點的所有子節(jié)點,把這個點放到CLOSE表中。
3. 遍歷考察這個點的子節(jié)點。求出這些子節(jié)點距起始點的距離值,放子節(jié)點到OPEN表中。
4. 重復2,3,步。直到OPEN表為空,或找到目標點。
提高Dijkstra搜索速度的方法很多,常用的有數(shù)據(jù)結(jié)構(gòu)采用Binary heap的方法,和用Dijkstra從起始點和終點同時搜索的方法。
A*(A-Star)算法是一種啟發(fā)式算法,是靜態(tài)路網(wǎng)中求解最短路最有效的方法。
公式表示為: f(n)=g(n)+h(n),
其中f(n) 是節(jié)點n從初始點到目標點的估價函數(shù),
g(n) 是在狀態(tài)空間中從初始節(jié)點到n節(jié)點的實際代價,
h(n)是從n到目標節(jié)點最佳路徑的估計代價。
保證找到最短路徑(最優(yōu)解的)條件,關(guān)鍵在于估價函數(shù)h(n)的選?。?/p>
估價值h(n)<= n到目標節(jié)點的距離實際值,這種情況下,搜索的點數(shù)多,搜索范圍大,效率低。但能得到最優(yōu)解。
如果 估價值>實際值, 搜索的點數(shù)少,搜索范圍小,效率高,但不能保證得到最優(yōu)解。
估價值與實際值越接近,估價函數(shù)取得就越好。
例如對于幾何路網(wǎng)來說,可以取兩節(jié)點間歐幾理德距離(直線距離)做為估價值,即f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));這樣估價函數(shù)f在g值一定的情況下,會或多或少的受估價值h的制約,節(jié)點距目標點近,h值小,f值相對就小,能保證最短路的搜索向終點的方向進行。明顯優(yōu)于Dijstra算法的毫無無方向的向四周搜索。
conditions of heuristic
Optimistic (must be less than or equal to the real cost)
As close to the real cost as possible
主要搜索過程:
創(chuàng)建兩個表,OPEN表保存所有已生成而未考察的節(jié)點,CLOSED表中記錄已訪問過的節(jié)點。
遍歷當前節(jié)點的各個節(jié)點,將n節(jié)點放入CLOSE中,取n節(jié)點的子節(jié)點X,->算X的估價值->
While(OPEN!=NULL)
{
從OPEN表中取估價值f最小的節(jié)點n;
if(n節(jié)點==目標節(jié)點) break;
else
{
if(X in OPEN) 比較兩個X的估價值f //注意是同一個節(jié)點的兩個不同路徑的估價值
if( X的估價值小于OPEN表的估價值 )
更新OPEN表中的估價值; //取最小路徑的估價值
if(X in CLOSE) 比較兩個X的估價值 //注意是同一個節(jié)點的兩個不同路徑的估價值
if( X的估價值小于CLOSE表的估價值 )
更新CLOSE表中的估價值; 把X節(jié)點放入OPEN //取最小路徑的估價值
if(X not in both)
求X的估價值;
并將X插入OPEN表中; //還沒有排序
}
將n節(jié)點插入CLOSE表中;
按照估價值將OPEN表中的節(jié)點排序; //實際上是比較OPEN表內(nèi)節(jié)點f的大小,從最小路徑的節(jié)點向下進行。
}
A*算法和Dijistra算法的區(qū)別在于有無估價值,Dijistra算法相當于A*算法中估價值為0的情況。
動態(tài)路網(wǎng),最短路算法 D*A* 在靜態(tài)路網(wǎng)中非常有效(very efficient for static worlds),但不適于在動態(tài)路網(wǎng),環(huán)境如權(quán)重等不斷變化的動態(tài)環(huán)境下。
D*是動態(tài)A*(D-Star,Dynamic A*) 卡內(nèi)及梅隆機器人中心的Stentz在1994和1995年兩篇文章提出,主要用于機器人探路。是火星探測器采用的尋路算法。
主要方法:
1.先用Dijstra算法從目標節(jié)點G向起始節(jié)點搜索。儲存路網(wǎng)中目標點到各個節(jié)點的最短路和該位置到目標點的實際值h,k(k為所有變化h之中最小的值,當前為k=h。每個節(jié)點包含上一節(jié)點到目標點的最短路信息1(2),2(5),5(4),4(7)。則1到4的最短路為1-2-5-4。
原OPEN和CLOSE中節(jié)點信息保存。
2.機器人沿最短路開始移動,在移動的下一節(jié)點沒有變化時,無需計算,利用上一步Dijstra計算出的最短路信息從出發(fā)點向后追述即可,當在Y點探測到下一節(jié)點X狀態(tài)發(fā)生改變,如堵塞。機器人首先調(diào)整自己在當前位置Y到目標點G的實際值h(Y),h(Y)=X到Y(jié)的新權(quán)值c(X,Y)+X的原實際值h(X).X為下一節(jié)點(到目標點方向Y->X->G),Y是當前點。k值取h值變化前后的最小。
3.用A*或其它算法計算,這里假設(shè)用A*算法,遍歷Y的子節(jié)點,點放入CLOSE,調(diào)整Y的子節(jié)點a的h值,h(a)=h(Y)+Y到子節(jié)點a的權(quán)重C(Y,a),比較a點是否存在于OPEN和CLOSE中,方法如下:
while()
{
從OPEN表中取k值最小的節(jié)點Y;
遍歷Y的子節(jié)點a,計算a的h值 h(a)=h(Y)+Y到子節(jié)點a的權(quán)重C(Y,a)
{
if(a in OPEN) 比較兩個a的h值
if( a的h值小于OPEN表a的h值 )
{ 更新OPEN表中a的h值;k值取最小的h值
有未受影響的最短路經(jīng)存在
break;
}
if(a in CLOSE) 比較兩個a的h值 //注意是同一個節(jié)點的兩個不同路徑的估價值
if( a的h值小于CLOSE表的h值 )
{
更新CLOSE表中a的h值; k值取最小的h值;將a節(jié)點放入OPEN表
有未受影響的最短路經(jīng)存在
break;
}
if(a not in both)
將a插入OPEN表中; //還沒有排序
}
放Y到CLOSE表;
OPEN表比較k值大小進行排序;
}
機器人利用第一步Dijstra計算出的最短路信息從a點到目標點的最短路經(jīng)進行。
D*算法在動態(tài)環(huán)境中尋路非常有效,向目標點移動中,只檢查最短路徑上下一節(jié)點或臨近節(jié)點的變化情況,如機器人尋路等情況。對于距離遠的最短路徑上發(fā)生的變化,則感覺不太適用。
以上就是關(guān)于圖的四種最短路徑算法相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
自己設(shè)計裝修效果圖的軟件(免費設(shè)計房屋裝修圖)
杭州比較有名的設(shè)計公司(中國最頂尖的設(shè)計公司)