久久亚洲精品国产精品_羞羞漫画在线版免费阅读网页漫画_国产精品久久久久久久久久久久_午夜dj免费观看在线视频_希崎杰西卡番号

路線搜索(搜索路線地圖)

前沿拓展:

路線搜索

您可以直接搜索到目的地,第二點擊該位置,選擇搜索附近,第二選擇酒店即可。在搜索到的結(jié)果中,選擇投取衡矛向破常志川你想要去的酒店,第二直接導(dǎo)航前去即可。


我們不論在游戲還是在機(jī)器人中,經(jīng)常會碰到各種路徑搜索算法,或者說最短路徑查找,這里做個小結(jié)。我們第一要從經(jīng)典的廣度優(yōu)先BFS和深度優(yōu)先DFS說起。

不過很多地方都會用到openlist,closelist兩個表,這里做個說明,open表里面放的是待擴(kuò)展節(jié)點,close表里面放的是已經(jīng)擴(kuò)展過的節(jié)點,通常就是一個沒有搜索過的節(jié)點會先放如open表中,后面從open表中將其取出進(jìn)行擴(kuò)展,第二丟到close表中。

DFS深度優(yōu)先搜索

這種搜索算法算是最簡單的,將open表當(dāng)作棧使用,將A點入棧,第二從棧頂取出一個元素x,擴(kuò)展其鄰域,將合規(guī)的鄰域節(jié)點放入open棧中,將x丟到close表中,直到x是是終點才退出

合規(guī)的判定比較簡單,一般來說就是沒有搜索過的節(jié)點,即不在close表中,也不在open表中

一句話形象概括的話,就是滿屏都是食物的一條貪食蛇,每吃一格食物就增長一節(jié),從A爬到B,就勝利了。

貪心算法

DFS的缺點是取鄰域中,隨意一個節(jié)點進(jìn)行擴(kuò)展。如果我們?nèi)藶榧尤胍粋€預(yù)估模型,預(yù)估到終點的距離,這樣就可以取鄰域中離終點最近的節(jié)點進(jìn)行擴(kuò)展,形成貪心搜索。

預(yù)估模型是人為加入的,常用的如曼哈頓距離。這種人為加入模型影響搜索的方式又被稱為啟發(fā)式搜索,加入的預(yù)估模型被稱為啟發(fā)函數(shù),它能根據(jù)當(dāng)前位置得到一個啟發(fā)值,指導(dǎo)后續(xù)路徑的選擇

BFS廣度優(yōu)先

這種搜索算法也比較簡單,將open表當(dāng)作隊列使用,將A點加入隊列尾部,第二從隊列頭部取出一個元素x,擴(kuò)展其鄰域,將合規(guī)的鄰域節(jié)點放入open隊列中,將x丟到close表中,直到x是終點才退出

實際上和DFS很相似,只不過DFS用的是后進(jìn)先出的棧,由于最后進(jìn)入的都是該節(jié)點的鄰域,所以出來的也是鄰域節(jié)點。而BFS使用的是先進(jìn)先出隊列,比如最早進(jìn)去的是A的四個鄰域,取出一個鄰域擴(kuò)展后又丟進(jìn)隊列,但是下一個取出的還是A的某個鄰域點,只有該組鄰域點都拿完才能輪到下一組。

一句話形容的話,就是從A點開始像浸水一樣,沿著四面八方擴(kuò)展,直到找到B點

Dijkstra

迪克斯特拉也比較簡單,理解了BFS,基本上也就理解了Dijkstra,也可以說它是BFS的擴(kuò)展:

將A點放入open表,第二從open表中取出離A點最近的位置x,進(jìn)行鄰域擴(kuò)展,第二將合規(guī)的鄰域節(jié)點丟入open表中,第二將x丟入close表

實際上,如果節(jié)點和其鄰域節(jié)點的距離是固定常數(shù),Dijkstra便退化為了BFS,若不是固定常數(shù),則有細(xì)微差異,BFS是直接默認(rèn)相鄰節(jié)點距離相等,而Dijkstra則需要判斷:

若x的鄰域節(jié)點P已經(jīng)在open表中,且x到A的距離 + x到鄰域點P的距離 > P到A的距離,則重新更新P的距離。

此外,合規(guī)的判定和之前一致,即未搜索過的點即合規(guī),即不在open和close表中

A* 算法

A star算法也是比較常見的算法,它也是在Dijkstra的基礎(chǔ)上,引入一個人為的AB距離估計模型:f(x)=g(x)+h(x)

啟發(fā)函數(shù)f(x)由兩部分構(gòu)成,g(x)是位置x到起點A的距離,h(x)是位置x到終點B的距離。其中只有h(x)項是預(yù)估項,或者說啟發(fā)項。

A* 算法和Dijkstra相似,只不過Dijkstra中只有g(shù)(x)這一項,而A*引入了預(yù)估項h(x),其余和Dijkstra基本一樣,將A點放入open表,第二從open表中取出f(x)最小的位置x,進(jìn)行鄰域擴(kuò)展,第二將合規(guī)的鄰域節(jié)點丟入open表中,第二將x丟入close表

D*算法

又稱為動態(tài)A* 算法,它用了一個更為先進(jìn)的預(yù)估模型,它的預(yù)估項h(x)是通過反向Dijkstra得到的。

首次它便使用Dijkstra進(jìn)行反向搜索,從B開始,直到搜索到了A,并記錄各點x到B的距離為h(x),在A*中,我們的啟發(fā)函數(shù)是f(x)=g(x)+h(x),由于h(x)是準(zhǔn)確的測量,假設(shè)機(jī)器人走到位置x,第二檢查所有合規(guī)鄰域y,由于的g(y)都相等g(y)=g(x)+1,所以找f(y)=g(y)+h(y)最小等價于找h(y)最小。在算法中我們將所有h(y)記為k(y),這樣從f(y)最小演變?yōu)檎襨(y)最小

實際上,D* 算法用在機(jī)器人實時尋路上,比如當(dāng)前位置是A,目的地是B,最開始實際上找的是A到B的最短路徑,當(dāng)機(jī)器人走到位置x=A+1時,實際上機(jī)器人要尋找的是當(dāng)前位置x到B的最短路徑,所以才有所有鄰域y到x的距離g(y)=1,找f(y)=g(y)+h(y)最小等價于找h(y)最小,這便是所謂動態(tài)A*的動態(tài)之處:將A到B的最短路徑變成當(dāng)前位置x到離B最近的鄰域y的最短路徑

用反向Dijkstra計算出h(x)預(yù)估后,從當(dāng)前位置x開始,取出鄰域中k(y)最小的位置y,第二機(jī)器人移動到y(tǒng),當(dāng)前位置x=y,開啟下一輪搜索

但是如果發(fā)現(xiàn)路徑上有新的障礙點了,則需要重新更新受到影響的點的距離,所謂受到影響也就是父節(jié)點為障礙物的節(jié)點。第二使用一些算法更新那些受到影響的預(yù)估h(x)值即可。

即令屬于新增障礙物的所有位置o的h(o)=∞,并將其鄰域受到影響的點的h值也標(biāo)為∞,放入open表,直到影響擴(kuò)散至機(jī)器人當(dāng)前位置x

受到影響的點分兩種情況:在障礙物中間(C在**位置)、在障礙物邊緣(C在橙色位置)

受到障礙影響的點,h值處于上升狀態(tài),判斷標(biāo)準(zhǔn)即 k(x)<h(x),**點的鄰域節(jié)點y若未受到影響即:h(y)<=k(y),且可以降低其h值:h(y)+c(x,y)<h(x) ,則將y點作為其父節(jié)點并更新其h值

實際上也就是取**點集里,按k值從小到大進(jìn)行鄰域擴(kuò)展,更新h值。更新完該**點后,最靠近該點那個橙色點又將變成了**點

更新h后,對當(dāng)前節(jié)點進(jìn)行搜索鄰域,進(jìn)行后續(xù)的傳播擴(kuò)展。這里就不詳細(xì)介紹了。

拓展知識:

路線搜索

使用百度地圖查詢出現(xiàn)路線的方法如下:
打開百度瀏覽器,第二在百度首頁選中“地圖”。如下所示:
點擊“地圖”,即可進(jìn)入百度地圖首頁。如下圖所示:
進(jìn)入百度地圖的首頁后,可以看到搜索欄底下有三個功能:搜索、公交、駕車;左側(cè)則是一些常見的餐飲等。
搜索目的地,查看周圍環(huán)境和交通狀況。
搜索出來后可以看到左側(cè)欄目是標(biāo)記地點的符號,右側(cè)是搜索地點的放大地圖,左側(cè)的標(biāo)記符號在右側(cè)的地點會看到具體的標(biāo)記位置。
點擊標(biāo)記點后,會彈出信息窗口,詳細(xì)介紹標(biāo)記點的地點名稱和相關(guān)信息以及附上圖片。
在搜索攔下,點擊公交,即可進(jìn)行兩個地點的公交路線搜索查詢,并在地圖顯示出來。這時就有了出行路線。

前沿拓展:

路線搜索

您可以直接搜索到目的地,第二點擊該位置,選擇搜索附近,第二選擇酒店即可。在搜索到的結(jié)果中,選擇投取衡矛向破常志川你想要去的酒店,第二直接導(dǎo)航前去即可。


我們不論在游戲還是在機(jī)器人中,經(jīng)常會碰到各種路徑搜索算法,或者說最短路徑查找,這里做個小結(jié)。我們第一要從經(jīng)典的廣度優(yōu)先BFS和深度優(yōu)先DFS說起。

不過很多地方都會用到openlist,closelist兩個表,這里做個說明,open表里面放的是待擴(kuò)展節(jié)點,close表里面放的是已經(jīng)擴(kuò)展過的節(jié)點,通常就是一個沒有搜索過的節(jié)點會先放如open表中,后面從open表中將其取出進(jìn)行擴(kuò)展,第二丟到close表中。

DFS深度優(yōu)先搜索

這種搜索算法算是最簡單的,將open表當(dāng)作棧使用,將A點入棧,第二從棧頂取出一個元素x,擴(kuò)展其鄰域,將合規(guī)的鄰域節(jié)點放入open棧中,將x丟到close表中,直到x是是終點才退出

合規(guī)的判定比較簡單,一般來說就是沒有搜索過的節(jié)點,即不在close表中,也不在open表中

一句話形象概括的話,就是滿屏都是食物的一條貪食蛇,每吃一格食物就增長一節(jié),從A爬到B,就勝利了。

貪心算法

DFS的缺點是取鄰域中,隨意一個節(jié)點進(jìn)行擴(kuò)展。如果我們?nèi)藶榧尤胍粋€預(yù)估模型,預(yù)估到終點的距離,這樣就可以取鄰域中離終點最近的節(jié)點進(jìn)行擴(kuò)展,形成貪心搜索。

預(yù)估模型是人為加入的,常用的如曼哈頓距離。這種人為加入模型影響搜索的方式又被稱為啟發(fā)式搜索,加入的預(yù)估模型被稱為啟發(fā)函數(shù),它能根據(jù)當(dāng)前位置得到一個啟發(fā)值,指導(dǎo)后續(xù)路徑的選擇

BFS廣度優(yōu)先

這種搜索算法也比較簡單,將open表當(dāng)作隊列使用,將A點加入隊列尾部,第二從隊列頭部取出一個元素x,擴(kuò)展其鄰域,將合規(guī)的鄰域節(jié)點放入open隊列中,將x丟到close表中,直到x是終點才退出

實際上和DFS很相似,只不過DFS用的是后進(jìn)先出的棧,由于最后進(jìn)入的都是該節(jié)點的鄰域,所以出來的也是鄰域節(jié)點。而BFS使用的是先進(jìn)先出隊列,比如最早進(jìn)去的是A的四個鄰域,取出一個鄰域擴(kuò)展后又丟進(jìn)隊列,但是下一個取出的還是A的某個鄰域點,只有該組鄰域點都拿完才能輪到下一組。

一句話形容的話,就是從A點開始像浸水一樣,沿著四面八方擴(kuò)展,直到找到B點

Dijkstra

迪克斯特拉也比較簡單,理解了BFS,基本上也就理解了Dijkstra,也可以說它是BFS的擴(kuò)展:

將A點放入open表,第二從open表中取出離A點最近的位置x,進(jìn)行鄰域擴(kuò)展,第二將合規(guī)的鄰域節(jié)點丟入open表中,第二將x丟入close表

實際上,如果節(jié)點和其鄰域節(jié)點的距離是固定常數(shù),Dijkstra便退化為了BFS,若不是固定常數(shù),則有細(xì)微差異,BFS是直接默認(rèn)相鄰節(jié)點距離相等,而Dijkstra則需要判斷:

若x的鄰域節(jié)點P已經(jīng)在open表中,且x到A的距離 + x到鄰域點P的距離 > P到A的距離,則重新更新P的距離。

此外,合規(guī)的判定和之前一致,即未搜索過的點即合規(guī),即不在open和close表中

A* 算法

A star算法也是比較常見的算法,它也是在Dijkstra的基礎(chǔ)上,引入一個人為的AB距離估計模型:f(x)=g(x)+h(x)

啟發(fā)函數(shù)f(x)由兩部分構(gòu)成,g(x)是位置x到起點A的距離,h(x)是位置x到終點B的距離。其中只有h(x)項是預(yù)估項,或者說啟發(fā)項。

A* 算法和Dijkstra相似,只不過Dijkstra中只有g(shù)(x)這一項,而A*引入了預(yù)估項h(x),其余和Dijkstra基本一樣,將A點放入open表,第二從open表中取出f(x)最小的位置x,進(jìn)行鄰域擴(kuò)展,第二將合規(guī)的鄰域節(jié)點丟入open表中,第二將x丟入close表

D*算法

又稱為動態(tài)A* 算法,它用了一個更為先進(jìn)的預(yù)估模型,它的預(yù)估項h(x)是通過反向Dijkstra得到的。

首次它便使用Dijkstra進(jìn)行反向搜索,從B開始,直到搜索到了A,并記錄各點x到B的距離為h(x),在A*中,我們的啟發(fā)函數(shù)是f(x)=g(x)+h(x),由于h(x)是準(zhǔn)確的測量,假設(shè)機(jī)器人走到位置x,第二檢查所有合規(guī)鄰域y,由于的g(y)都相等g(y)=g(x)+1,所以找f(y)=g(y)+h(y)最小等價于找h(y)最小。在算法中我們將所有h(y)記為k(y),這樣從f(y)最小演變?yōu)檎襨(y)最小

實際上,D* 算法用在機(jī)器人實時尋路上,比如當(dāng)前位置是A,目的地是B,最開始實際上找的是A到B的最短路徑,當(dāng)機(jī)器人走到位置x=A+1時,實際上機(jī)器人要尋找的是當(dāng)前位置x到B的最短路徑,所以才有所有鄰域y到x的距離g(y)=1,找f(y)=g(y)+h(y)最小等價于找h(y)最小,這便是所謂動態(tài)A*的動態(tài)之處:將A到B的最短路徑變成當(dāng)前位置x到離B最近的鄰域y的最短路徑

用反向Dijkstra計算出h(x)預(yù)估后,從當(dāng)前位置x開始,取出鄰域中k(y)最小的位置y,第二機(jī)器人移動到y(tǒng),當(dāng)前位置x=y,開啟下一輪搜索

但是如果發(fā)現(xiàn)路徑上有新的障礙點了,則需要重新更新受到影響的點的距離,所謂受到影響也就是父節(jié)點為障礙物的節(jié)點。第二使用一些算法更新那些受到影響的預(yù)估h(x)值即可。

即令屬于新增障礙物的所有位置o的h(o)=∞,并將其鄰域受到影響的點的h值也標(biāo)為∞,放入open表,直到影響擴(kuò)散至機(jī)器人當(dāng)前位置x

受到影響的點分兩種情況:在障礙物中間(C在**位置)、在障礙物邊緣(C在橙色位置)

受到障礙影響的點,h值處于上升狀態(tài),判斷標(biāo)準(zhǔn)即 k(x)<h(x),**點的鄰域節(jié)點y若未受到影響即:h(y)<=k(y),且可以降低其h值:h(y)+c(x,y)<h(x) ,則將y點作為其父節(jié)點并更新其h值

實際上也就是取**點集里,按k值從小到大進(jìn)行鄰域擴(kuò)展,更新h值。更新完該**點后,最靠近該點那個橙色點又將變成了**點

更新h后,對當(dāng)前節(jié)點進(jìn)行搜索鄰域,進(jìn)行后續(xù)的傳播擴(kuò)展。這里就不詳細(xì)介紹了。

拓展知識:

路線搜索

使用百度地圖查詢出現(xiàn)路線的方法如下:
打開百度瀏覽器,第二在百度首頁選中“地圖”。如下所示:
點擊“地圖”,即可進(jìn)入百度地圖首頁。如下圖所示:
進(jìn)入百度地圖的首頁后,可以看到搜索欄底下有三個功能:搜索、公交、駕車;左側(cè)則是一些常見的餐飲等。
搜索目的地,查看周圍環(huán)境和交通狀況。
搜索出來后可以看到左側(cè)欄目是標(biāo)記地點的符號,右側(cè)是搜索地點的放大地圖,左側(cè)的標(biāo)記符號在右側(cè)的地點會看到具體的標(biāo)記位置。
點擊標(biāo)記點后,會彈出信息窗口,詳細(xì)介紹標(biāo)記點的地點名稱和相關(guān)信息以及附上圖片。
在搜索攔下,點擊公交,即可進(jìn)行兩個地點的公交路線搜索查詢,并在地圖顯示出來。這時就有了出行路線。

前沿拓展:

路線搜索

您可以直接搜索到目的地,第二點擊該位置,選擇搜索附近,第二選擇酒店即可。在搜索到的結(jié)果中,選擇投取衡矛向破常志川你想要去的酒店,第二直接導(dǎo)航前去即可。


我們不論在游戲還是在機(jī)器人中,經(jīng)常會碰到各種路徑搜索算法,或者說最短路徑查找,這里做個小結(jié)。我們第一要從經(jīng)典的廣度優(yōu)先BFS和深度優(yōu)先DFS說起。

不過很多地方都會用到openlist,closelist兩個表,這里做個說明,open表里面放的是待擴(kuò)展節(jié)點,close表里面放的是已經(jīng)擴(kuò)展過的節(jié)點,通常就是一個沒有搜索過的節(jié)點會先放如open表中,后面從open表中將其取出進(jìn)行擴(kuò)展,第二丟到close表中。

DFS深度優(yōu)先搜索

這種搜索算法算是最簡單的,將open表當(dāng)作棧使用,將A點入棧,第二從棧頂取出一個元素x,擴(kuò)展其鄰域,將合規(guī)的鄰域節(jié)點放入open棧中,將x丟到close表中,直到x是是終點才退出

合規(guī)的判定比較簡單,一般來說就是沒有搜索過的節(jié)點,即不在close表中,也不在open表中

一句話形象概括的話,就是滿屏都是食物的一條貪食蛇,每吃一格食物就增長一節(jié),從A爬到B,就勝利了。

貪心算法

DFS的缺點是取鄰域中,隨意一個節(jié)點進(jìn)行擴(kuò)展。如果我們?nèi)藶榧尤胍粋€預(yù)估模型,預(yù)估到終點的距離,這樣就可以取鄰域中離終點最近的節(jié)點進(jìn)行擴(kuò)展,形成貪心搜索。

預(yù)估模型是人為加入的,常用的如曼哈頓距離。這種人為加入模型影響搜索的方式又被稱為啟發(fā)式搜索,加入的預(yù)估模型被稱為啟發(fā)函數(shù),它能根據(jù)當(dāng)前位置得到一個啟發(fā)值,指導(dǎo)后續(xù)路徑的選擇

BFS廣度優(yōu)先

這種搜索算法也比較簡單,將open表當(dāng)作隊列使用,將A點加入隊列尾部,第二從隊列頭部取出一個元素x,擴(kuò)展其鄰域,將合規(guī)的鄰域節(jié)點放入open隊列中,將x丟到close表中,直到x是終點才退出

實際上和DFS很相似,只不過DFS用的是后進(jìn)先出的棧,由于最后進(jìn)入的都是該節(jié)點的鄰域,所以出來的也是鄰域節(jié)點。而BFS使用的是先進(jìn)先出隊列,比如最早進(jìn)去的是A的四個鄰域,取出一個鄰域擴(kuò)展后又丟進(jìn)隊列,但是下一個取出的還是A的某個鄰域點,只有該組鄰域點都拿完才能輪到下一組。

一句話形容的話,就是從A點開始像浸水一樣,沿著四面八方擴(kuò)展,直到找到B點

Dijkstra

迪克斯特拉也比較簡單,理解了BFS,基本上也就理解了Dijkstra,也可以說它是BFS的擴(kuò)展:

將A點放入open表,第二從open表中取出離A點最近的位置x,進(jìn)行鄰域擴(kuò)展,第二將合規(guī)的鄰域節(jié)點丟入open表中,第二將x丟入close表

實際上,如果節(jié)點和其鄰域節(jié)點的距離是固定常數(shù),Dijkstra便退化為了BFS,若不是固定常數(shù),則有細(xì)微差異,BFS是直接默認(rèn)相鄰節(jié)點距離相等,而Dijkstra則需要判斷:

若x的鄰域節(jié)點P已經(jīng)在open表中,且x到A的距離 + x到鄰域點P的距離 > P到A的距離,則重新更新P的距離。

此外,合規(guī)的判定和之前一致,即未搜索過的點即合規(guī),即不在open和close表中

A* 算法

A star算法也是比較常見的算法,它也是在Dijkstra的基礎(chǔ)上,引入一個人為的AB距離估計模型:f(x)=g(x)+h(x)

啟發(fā)函數(shù)f(x)由兩部分構(gòu)成,g(x)是位置x到起點A的距離,h(x)是位置x到終點B的距離。其中只有h(x)項是預(yù)估項,或者說啟發(fā)項。

A* 算法和Dijkstra相似,只不過Dijkstra中只有g(shù)(x)這一項,而A*引入了預(yù)估項h(x),其余和Dijkstra基本一樣,將A點放入open表,第二從open表中取出f(x)最小的位置x,進(jìn)行鄰域擴(kuò)展,第二將合規(guī)的鄰域節(jié)點丟入open表中,第二將x丟入close表

D*算法

又稱為動態(tài)A* 算法,它用了一個更為先進(jìn)的預(yù)估模型,它的預(yù)估項h(x)是通過反向Dijkstra得到的。

首次它便使用Dijkstra進(jìn)行反向搜索,從B開始,直到搜索到了A,并記錄各點x到B的距離為h(x),在A*中,我們的啟發(fā)函數(shù)是f(x)=g(x)+h(x),由于h(x)是準(zhǔn)確的測量,假設(shè)機(jī)器人走到位置x,第二檢查所有合規(guī)鄰域y,由于的g(y)都相等g(y)=g(x)+1,所以找f(y)=g(y)+h(y)最小等價于找h(y)最小。在算法中我們將所有h(y)記為k(y),這樣從f(y)最小演變?yōu)檎襨(y)最小

實際上,D* 算法用在機(jī)器人實時尋路上,比如當(dāng)前位置是A,目的地是B,最開始實際上找的是A到B的最短路徑,當(dāng)機(jī)器人走到位置x=A+1時,實際上機(jī)器人要尋找的是當(dāng)前位置x到B的最短路徑,所以才有所有鄰域y到x的距離g(y)=1,找f(y)=g(y)+h(y)最小等價于找h(y)最小,這便是所謂動態(tài)A*的動態(tài)之處:將A到B的最短路徑變成當(dāng)前位置x到離B最近的鄰域y的最短路徑

用反向Dijkstra計算出h(x)預(yù)估后,從當(dāng)前位置x開始,取出鄰域中k(y)最小的位置y,第二機(jī)器人移動到y(tǒng),當(dāng)前位置x=y,開啟下一輪搜索

但是如果發(fā)現(xiàn)路徑上有新的障礙點了,則需要重新更新受到影響的點的距離,所謂受到影響也就是父節(jié)點為障礙物的節(jié)點。第二使用一些算法更新那些受到影響的預(yù)估h(x)值即可。

即令屬于新增障礙物的所有位置o的h(o)=∞,并將其鄰域受到影響的點的h值也標(biāo)為∞,放入open表,直到影響擴(kuò)散至機(jī)器人當(dāng)前位置x

受到影響的點分兩種情況:在障礙物中間(C在**位置)、在障礙物邊緣(C在橙色位置)

受到障礙影響的點,h值處于上升狀態(tài),判斷標(biāo)準(zhǔn)即 k(x)<h(x),**點的鄰域節(jié)點y若未受到影響即:h(y)<=k(y),且可以降低其h值:h(y)+c(x,y)<h(x) ,則將y點作為其父節(jié)點并更新其h值

實際上也就是取**點集里,按k值從小到大進(jìn)行鄰域擴(kuò)展,更新h值。更新完該**點后,最靠近該點那個橙色點又將變成了**點

更新h后,對當(dāng)前節(jié)點進(jìn)行搜索鄰域,進(jìn)行后續(xù)的傳播擴(kuò)展。這里就不詳細(xì)介紹了。

拓展知識:

路線搜索

使用百度地圖查詢出現(xiàn)路線的方法如下:
打開百度瀏覽器,第二在百度首頁選中“地圖”。如下所示:
點擊“地圖”,即可進(jìn)入百度地圖首頁。如下圖所示:
進(jìn)入百度地圖的首頁后,可以看到搜索欄底下有三個功能:搜索、公交、駕車;左側(cè)則是一些常見的餐飲等。
搜索目的地,查看周圍環(huán)境和交通狀況。
搜索出來后可以看到左側(cè)欄目是標(biāo)記地點的符號,右側(cè)是搜索地點的放大地圖,左側(cè)的標(biāo)記符號在右側(cè)的地點會看到具體的標(biāo)記位置。
點擊標(biāo)記點后,會彈出信息窗口,詳細(xì)介紹標(biāo)記點的地點名稱和相關(guān)信息以及附上圖片。
在搜索攔下,點擊公交,即可進(jìn)行兩個地點的公交路線搜索查詢,并在地圖顯示出來。這時就有了出行路線。

前沿拓展:

路線搜索

您可以直接搜索到目的地,第二點擊該位置,選擇搜索附近,第二選擇酒店即可。在搜索到的結(jié)果中,選擇投取衡矛向破常志川你想要去的酒店,第二直接導(dǎo)航前去即可。


我們不論在游戲還是在機(jī)器人中,經(jīng)常會碰到各種路徑搜索算法,或者說最短路徑查找,這里做個小結(jié)。我們第一要從經(jīng)典的廣度優(yōu)先BFS和深度優(yōu)先DFS說起。

不過很多地方都會用到openlist,closelist兩個表,這里做個說明,open表里面放的是待擴(kuò)展節(jié)點,close表里面放的是已經(jīng)擴(kuò)展過的節(jié)點,通常就是一個沒有搜索過的節(jié)點會先放如open表中,后面從open表中將其取出進(jìn)行擴(kuò)展,第二丟到close表中。

DFS深度優(yōu)先搜索

這種搜索算法算是最簡單的,將open表當(dāng)作棧使用,將A點入棧,第二從棧頂取出一個元素x,擴(kuò)展其鄰域,將合規(guī)的鄰域節(jié)點放入open棧中,將x丟到close表中,直到x是是終點才退出

合規(guī)的判定比較簡單,一般來說就是沒有搜索過的節(jié)點,即不在close表中,也不在open表中

一句話形象概括的話,就是滿屏都是食物的一條貪食蛇,每吃一格食物就增長一節(jié),從A爬到B,就勝利了。

貪心算法

DFS的缺點是取鄰域中,隨意一個節(jié)點進(jìn)行擴(kuò)展。如果我們?nèi)藶榧尤胍粋€預(yù)估模型,預(yù)估到終點的距離,這樣就可以取鄰域中離終點最近的節(jié)點進(jìn)行擴(kuò)展,形成貪心搜索。

預(yù)估模型是人為加入的,常用的如曼哈頓距離。這種人為加入模型影響搜索的方式又被稱為啟發(fā)式搜索,加入的預(yù)估模型被稱為啟發(fā)函數(shù),它能根據(jù)當(dāng)前位置得到一個啟發(fā)值,指導(dǎo)后續(xù)路徑的選擇

BFS廣度優(yōu)先

這種搜索算法也比較簡單,將open表當(dāng)作隊列使用,將A點加入隊列尾部,第二從隊列頭部取出一個元素x,擴(kuò)展其鄰域,將合規(guī)的鄰域節(jié)點放入open隊列中,將x丟到close表中,直到x是終點才退出

實際上和DFS很相似,只不過DFS用的是后進(jìn)先出的棧,由于最后進(jìn)入的都是該節(jié)點的鄰域,所以出來的也是鄰域節(jié)點。而BFS使用的是先進(jìn)先出隊列,比如最早進(jìn)去的是A的四個鄰域,取出一個鄰域擴(kuò)展后又丟進(jìn)隊列,但是下一個取出的還是A的某個鄰域點,只有該組鄰域點都拿完才能輪到下一組。

一句話形容的話,就是從A點開始像浸水一樣,沿著四面八方擴(kuò)展,直到找到B點

Dijkstra

迪克斯特拉也比較簡單,理解了BFS,基本上也就理解了Dijkstra,也可以說它是BFS的擴(kuò)展:

將A點放入open表,第二從open表中取出離A點最近的位置x,進(jìn)行鄰域擴(kuò)展,第二將合規(guī)的鄰域節(jié)點丟入open表中,第二將x丟入close表

實際上,如果節(jié)點和其鄰域節(jié)點的距離是固定常數(shù),Dijkstra便退化為了BFS,若不是固定常數(shù),則有細(xì)微差異,BFS是直接默認(rèn)相鄰節(jié)點距離相等,而Dijkstra則需要判斷:

若x的鄰域節(jié)點P已經(jīng)在open表中,且x到A的距離 + x到鄰域點P的距離 > P到A的距離,則重新更新P的距離。

此外,合規(guī)的判定和之前一致,即未搜索過的點即合規(guī),即不在open和close表中

A* 算法

A star算法也是比較常見的算法,它也是在Dijkstra的基礎(chǔ)上,引入一個人為的AB距離估計模型:f(x)=g(x)+h(x)

啟發(fā)函數(shù)f(x)由兩部分構(gòu)成,g(x)是位置x到起點A的距離,h(x)是位置x到終點B的距離。其中只有h(x)項是預(yù)估項,或者說啟發(fā)項。

A* 算法和Dijkstra相似,只不過Dijkstra中只有g(shù)(x)這一項,而A*引入了預(yù)估項h(x),其余和Dijkstra基本一樣,將A點放入open表,第二從open表中取出f(x)最小的位置x,進(jìn)行鄰域擴(kuò)展,第二將合規(guī)的鄰域節(jié)點丟入open表中,第二將x丟入close表

D*算法

又稱為動態(tài)A* 算法,它用了一個更為先進(jìn)的預(yù)估模型,它的預(yù)估項h(x)是通過反向Dijkstra得到的。

首次它便使用Dijkstra進(jìn)行反向搜索,從B開始,直到搜索到了A,并記錄各點x到B的距離為h(x),在A*中,我們的啟發(fā)函數(shù)是f(x)=g(x)+h(x),由于h(x)是準(zhǔn)確的測量,假設(shè)機(jī)器人走到位置x,第二檢查所有合規(guī)鄰域y,由于的g(y)都相等g(y)=g(x)+1,所以找f(y)=g(y)+h(y)最小等價于找h(y)最小。在算法中我們將所有h(y)記為k(y),這樣從f(y)最小演變?yōu)檎襨(y)最小

實際上,D* 算法用在機(jī)器人實時尋路上,比如當(dāng)前位置是A,目的地是B,最開始實際上找的是A到B的最短路徑,當(dāng)機(jī)器人走到位置x=A+1時,實際上機(jī)器人要尋找的是當(dāng)前位置x到B的最短路徑,所以才有所有鄰域y到x的距離g(y)=1,找f(y)=g(y)+h(y)最小等價于找h(y)最小,這便是所謂動態(tài)A*的動態(tài)之處:將A到B的最短路徑變成當(dāng)前位置x到離B最近的鄰域y的最短路徑

用反向Dijkstra計算出h(x)預(yù)估后,從當(dāng)前位置x開始,取出鄰域中k(y)最小的位置y,第二機(jī)器人移動到y(tǒng),當(dāng)前位置x=y,開啟下一輪搜索

但是如果發(fā)現(xiàn)路徑上有新的障礙點了,則需要重新更新受到影響的點的距離,所謂受到影響也就是父節(jié)點為障礙物的節(jié)點。第二使用一些算法更新那些受到影響的預(yù)估h(x)值即可。

即令屬于新增障礙物的所有位置o的h(o)=∞,并將其鄰域受到影響的點的h值也標(biāo)為∞,放入open表,直到影響擴(kuò)散至機(jī)器人當(dāng)前位置x

受到影響的點分兩種情況:在障礙物中間(C在**位置)、在障礙物邊緣(C在橙色位置)

受到障礙影響的點,h值處于上升狀態(tài),判斷標(biāo)準(zhǔn)即 k(x)<h(x),**點的鄰域節(jié)點y若未受到影響即:h(y)<=k(y),且可以降低其h值:h(y)+c(x,y)<h(x) ,則將y點作為其父節(jié)點并更新其h值

實際上也就是取**點集里,按k值從小到大進(jìn)行鄰域擴(kuò)展,更新h值。更新完該**點后,最靠近該點那個橙色點又將變成了**點

更新h后,對當(dāng)前節(jié)點進(jìn)行搜索鄰域,進(jìn)行后續(xù)的傳播擴(kuò)展。這里就不詳細(xì)介紹了。

拓展知識:

路線搜索

使用百度地圖查詢出現(xiàn)路線的方法如下:
打開百度瀏覽器,第二在百度首頁選中“地圖”。如下所示:
點擊“地圖”,即可進(jìn)入百度地圖首頁。如下圖所示:
進(jìn)入百度地圖的首頁后,可以看到搜索欄底下有三個功能:搜索、公交、駕車;左側(cè)則是一些常見的餐飲等。
搜索目的地,查看周圍環(huán)境和交通狀況。
搜索出來后可以看到左側(cè)欄目是標(biāo)記地點的符號,右側(cè)是搜索地點的放大地圖,左側(cè)的標(biāo)記符號在右側(cè)的地點會看到具體的標(biāo)記位置。
點擊標(biāo)記點后,會彈出信息窗口,詳細(xì)介紹標(biāo)記點的地點名稱和相關(guān)信息以及附上圖片。
在搜索攔下,點擊公交,即可進(jìn)行兩個地點的公交路線搜索查詢,并在地圖顯示出來。這時就有了出行路線。

原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請注明出處:http://www.cddhlm.com/29341.html