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