-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
4、A*算法介紹
常用路徑規(guī)劃算法實(shí)現(xiàn)(常用的路徑規(guī)劃算法)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于常用路徑規(guī)劃算法實(shí)現(xiàn)的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、常用的導(dǎo)航/路徑規(guī)劃軟件都用到哪些算法
一般都是分層做的。譬如說你要從廣州到北京,開車怎么走,當(dāng)然不可能直接在路上規(guī)劃吧,這樣計(jì)算量太大了。比較理想的方法是,我先知道到底要經(jīng)過多少城市,從每一個(gè)城市到下一個(gè)城市之間如何走才能用高速連接起來,你需要訪問的數(shù)據(jù)就小得多。當(dāng)最后約束到一個(gè)區(qū)那么大的地方的時(shí)候,直接上DP還是可以在可接受的時(shí)間內(nèi)做出來的。
二、誰能簡單解釋一下 谷歌,搜狗地圖是如何實(shí)現(xiàn)自動(dòng)路徑規(guī)劃的
一般采用的是A*路徑規(guī)劃算法
百度百科對此算法有詳細(xì)的介紹:
http://baike.baidu.com/view/7850.htm
三、推步聚頂之術(shù)是現(xiàn)在什么算法呢
推步聚頂算法是一種常用的路徑規(guī)劃算法。推步聚頂算法是一種基于樹狀結(jié)構(gòu)的隨機(jī)搜索算法,通過在空間中隨機(jī)生成節(jié)點(diǎn),并逐漸擴(kuò)展樹結(jié)構(gòu),最終找到起點(diǎn)到終點(diǎn)的最優(yōu)路徑,該算法相對于傳統(tǒng)的搜索算法,具有計(jì)算速度快、擴(kuò)展性好等優(yōu)點(diǎn)。
四、A*算法介紹
姓名:車文揚(yáng) 學(xué)號:16020199006
【嵌牛導(dǎo)讀】:A*算法的逐步詳解
【嵌牛鼻子】:啟發(fā)式算法
【嵌牛提問】:A*算法的原理是什么?
【嵌牛正文】:
A*算法
路徑規(guī)劃是指的是機(jī)器人的最優(yōu)路徑規(guī)劃問題,即依據(jù)某個(gè)或某些優(yōu)化準(zhǔn)則(如工作代價(jià)最小、行走路徑最短、行走時(shí)間最短等),在工作空間中找到一個(gè)從起始狀態(tài)到目標(biāo)狀態(tài)能避開障礙物的最優(yōu)路徑。機(jī)器人的路徑規(guī)劃應(yīng)用場景極豐富,最常見如游戲中NPC及控制角色的位置移動(dòng),百度地圖等導(dǎo)航問題,小到家庭掃地機(jī)器人、無人機(jī)大到各公司正爭相開拓的無人駕駛汽車等。
目前路徑規(guī)劃算法分為:
A*算法原理:
在計(jì)算機(jī)科學(xué)中,A*算法作為Dijkstra算法的擴(kuò)展,因其高效性而被廣泛應(yīng)用于尋路及圖的遍歷,如星際爭霸等游戲中就大量使用。在理解算法前,我們需要知道幾個(gè)概念:
搜索區(qū)域(The Search Area):圖中的搜索區(qū)域被劃分為了簡單的二維數(shù)組,數(shù)組每個(gè)元素對應(yīng)一個(gè)小方格,當(dāng)然我們也可以將區(qū)域等分成是五角星,矩形等,通常將一個(gè)單位的中心點(diǎn)稱之為搜索區(qū)域節(jié)點(diǎn)(Node)。
開放列表(Open List):我們將路徑規(guī)劃過程中待檢測的節(jié)點(diǎn)存放于Open List中,而已檢測過的格子則存放于Close List中。
父節(jié)點(diǎn)(parent):在路徑規(guī)劃中用于回溯的節(jié)點(diǎn),開發(fā)時(shí)可考慮為雙向鏈表結(jié)構(gòu)中的父結(jié)點(diǎn)指針。
路徑排序(Path Sorting):具體往哪個(gè)節(jié)點(diǎn)移動(dòng)由以下公式確定:F(n) = G + H 。G代表的是從初始位置A沿著已生成的路徑到指定待檢測格子的移動(dòng)開銷。H指定待測格子到目標(biāo)節(jié)點(diǎn)B的估計(jì)移動(dòng)開銷。
啟發(fā)函數(shù)(Heuristics Function):H為啟發(fā)函數(shù),也被認(rèn)為是一種試探,由于在找到唯一路徑前,我們不確定在前面會(huì)出現(xiàn)什么障礙物,因此用了一種計(jì)算H的算法,具體根據(jù)實(shí)際場景決定。在我們簡化的模型中,H采用的是傳統(tǒng)的曼哈頓距離(Manhattan Distance),也就是橫縱向走的距離之和。
如下圖所示,綠色方塊為機(jī)器人起始位置A,紅色方塊為目標(biāo)位置B,藍(lán)色為障礙物。
我們把要搜尋的區(qū)域劃分成了正方形的格子。這是尋路的第一步,簡化搜索區(qū)域。這個(gè)特殊的方法把我們的搜索區(qū)域簡化為了2 維數(shù)組。數(shù)組的每一項(xiàng)代表一個(gè)格子,它的狀態(tài)就是可走(walkalbe)或不可走(unwalkable) ?,F(xiàn)用A*算法尋找出一條自A到B的最短路徑,每個(gè)方格的邊長為10,即垂直水平方向移動(dòng)開銷為10。因此沿對角移動(dòng)開銷約等于14。具體步驟如下:
從起點(diǎn) A 開始,把它加入到一個(gè)由方格組成的open list(開放列表) 中,這個(gè)open list像是一個(gè)購物清單。Open list里的格子是可能會(huì)是沿途經(jīng)過的,也有可能不經(jīng)過。因此可以將其看成一個(gè)待檢查的列表。查看與A相鄰的8個(gè)方格 ,把其中可走的 (walkable) 或可到達(dá)的(reachable) 方格加入到open list中。并把起點(diǎn) A 設(shè)置為這些方格的父節(jié)點(diǎn) (parent node) 。然后把 A 從open list中移除,加入到close list(封閉列表) 中,close list中的每個(gè)方格都是不需要再關(guān)注的。
如下圖所示,深綠色的方格為起點(diǎn)A,它的外框是亮藍(lán)色,表示該方格被加入到了close list 。與它相鄰的黑色方格是需要被檢查的,他們的外框是亮綠色。每個(gè)黑方格都有一個(gè)灰色的指針指向他們的父節(jié)點(diǎn)A。
下一步,我們需要從open list中選一個(gè)與起點(diǎn)A相鄰的方格。但是到底選擇哪個(gè)方格好呢?選F值最小的那個(gè)。我們看看下圖中的一些方格。在標(biāo)有字母的方格中G = 10 。這是因?yàn)樗椒较驈钠瘘c(diǎn)到那里只有一個(gè)方格的距離。與起點(diǎn)直接相鄰的上方,下方,左方的方格的G 值都是10 ,對角線的方格G 值都是14 。H值通過估算起點(diǎn)到終點(diǎn)( 紅色方格) 的Manhattan 距離得到,僅作橫向和縱向移動(dòng),并且忽略沿途的障礙。使用這種方式,起點(diǎn)右邊的方格到終點(diǎn)有3 個(gè)方格的距離,因此H = 30 。這個(gè)方格上方的方格到終點(diǎn)有4 個(gè)方格的距離( 注意只計(jì)算橫向和縱向距離) ,因此H = 40 。
比較open list中節(jié)點(diǎn)的F值后,發(fā)現(xiàn)起點(diǎn)A右側(cè)節(jié)點(diǎn)的F=40,值最小。選作當(dāng)前處理節(jié)點(diǎn),并將這個(gè)點(diǎn)從Open List刪除,移到Close List中。
對這個(gè)節(jié)點(diǎn)周圍的8個(gè)格子進(jìn)行判斷,若是不可通過(比如墻,水,或是其他非法地形)或已經(jīng)在Close List中,則忽略。否則執(zhí)行以下步驟:
若當(dāng)前處理節(jié)點(diǎn)的相鄰格子已經(jīng)在Open List中,則檢查這條路徑是否更優(yōu),即計(jì)算經(jīng)由當(dāng)前處理節(jié)點(diǎn)到達(dá)那個(gè)方格是否具有更小的 G值。如果沒有,不做任何操作。相反,如果G值更小,則把那個(gè)方格的父節(jié)點(diǎn)設(shè)為當(dāng)前處理節(jié)點(diǎn) ( 我們選中的方格 ) ,然后重新計(jì)算那個(gè)方格的 F 值和 G 值。
若當(dāng)前處理節(jié)點(diǎn)的相鄰格子不在Open List中,那么把它加入,并將它的父節(jié)點(diǎn)設(shè)置為該節(jié)點(diǎn)。
按照上述規(guī)則我們繼續(xù)搜索,選擇起點(diǎn)右邊的方格作為當(dāng)前處理節(jié)點(diǎn)。它的外框用藍(lán)線打亮,被放入了close list 中。然后我們檢查與它相鄰的方格。它右側(cè)的3個(gè)方格是墻壁,我們忽略。它左邊的方格是起點(diǎn),在close list 中,我們也忽略。其他4個(gè)相鄰的方格均在open list 中,我們需要檢查經(jīng)由當(dāng)前節(jié)點(diǎn)到達(dá)那里的路徑是否更好。我們看看上面的方格,它現(xiàn)在的G值為14 ,如果經(jīng)由當(dāng)前方格到達(dá)那里,G值將會(huì)為20( 其中10為從起點(diǎn)到達(dá)當(dāng)前方格的G值,此外還要加上從當(dāng)前方格縱向移動(dòng)到上面方格的G值10) ,因此這不是最優(yōu)的路徑。看圖就會(huì)明白直接從起點(diǎn)沿對角線移動(dòng)到那個(gè)方格比先橫向移動(dòng)再縱向移動(dòng)要好。
當(dāng)把4個(gè)已經(jīng)在open list 中的相鄰方格都檢查后,沒有發(fā)現(xiàn)經(jīng)由當(dāng)前節(jié)點(diǎn)的更好路徑,因此不做任何改變。接下來要選擇下一個(gè)待處理的節(jié)點(diǎn)。因此再次遍歷open list ,現(xiàn)在open list中只有7 個(gè)方格了,我們需要選擇F值最小的那個(gè)。這次有兩個(gè)方格的F值都是54,選哪個(gè)呢?沒什么關(guān)系。從速度上考慮,選擇最后加入open list 的方格更快。因此選擇起點(diǎn)右下方的方格,如下圖所示。
接下來把起點(diǎn)右下角F值為54的方格作為當(dāng)前處理節(jié)點(diǎn),檢查其相鄰的方格。我們發(fā)現(xiàn)它右邊是墻(墻下面的一格也忽略掉,假定墻角不能直接穿越),忽略之。這樣還剩下 5 個(gè)相鄰的方格。當(dāng)前方格下面的 2 個(gè)方格還沒有加入 open list ,所以把它們加入,同時(shí)把當(dāng)前方格設(shè)為他們的父親。在剩下的 3 個(gè)方格中,有 2 個(gè)已經(jīng)在 close list 中 ( 一個(gè)是起點(diǎn),一個(gè)是當(dāng)前方格上面的方格,外框被加亮的 ) ,我們忽略它們。最后一個(gè)方格,也就是當(dāng)前方格左邊的方格,檢查經(jīng)由當(dāng)前方格到達(dá)那里是否具有更小的 G 值。沒有,因此我們準(zhǔn)備從 open list 中選擇下一個(gè)待處理的方格。
不斷重復(fù)這個(gè)過程,直到把終點(diǎn)也加入到了open list 中,此時(shí)如下圖所示。注意在起點(diǎn)下方2 格處的方格的父親已經(jīng)與前面不同了。之前它的G值是28并且指向它右上方的方格。現(xiàn)在它的G 值為20 ,并且指向它正上方的方格。這是由于在尋路過程中的某處使用新路徑時(shí)G值更小,因此父節(jié)點(diǎn)被重新設(shè)置,G和F值被重新計(jì)算。
那么我們怎樣得到實(shí)際路徑呢?很簡單,如下圖所示,從終點(diǎn)開始,沿著箭頭向父節(jié)點(diǎn)移動(dòng),直至回到起點(diǎn),這就是你的路徑。
A*算法總結(jié):
1. 把起點(diǎn)加入 open list 。
2. 重復(fù)如下過程:
a. 遍歷open list ,查找F值最小的節(jié)點(diǎn),把它作為當(dāng)前要處理的節(jié)點(diǎn),然后移到close list中
b. 對當(dāng)前方格的 8 個(gè)相鄰方格一一進(jìn)行檢查,如果它是不可抵達(dá)的或者它在close list中,忽略它。否則,做如下操作:
□ 如果它不在open list中,把它加入open list,并且把當(dāng)前方格設(shè)置為它的父親
□ 如果它已經(jīng)在open list中,檢查這條路徑 ( 即經(jīng)由當(dāng)前方格到達(dá)它那里 ) 是否更近。如果更近,把它的父親設(shè)置為當(dāng)前方格,并重新計(jì)算它的G和F值。如果你的open list是按F值排序的話,改變后你可能需要重新排序。
c. 遇到下面情況停止搜索:
□ 把終點(diǎn)加入到了 open list 中,此時(shí)路徑已經(jīng)找到了,或者
□ 查找終點(diǎn)失敗,并且open list 是空的,此時(shí)沒有路徑。
3. 從終點(diǎn)開始,每個(gè)方格沿著父節(jié)點(diǎn)移動(dòng)直至起點(diǎn),形成路徑。
以上就是關(guān)于常用路徑規(guī)劃算法實(shí)現(xiàn)相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
室內(nèi)設(shè)計(jì)常用網(wǎng)站(室內(nèi)設(shè)計(jì)常用網(wǎng)站排名)