感謝路徑規劃之a*這篇文章的步步引導,在此基礎上,記下自己對a*演算法的理解,以及啟發式函式的理解。
設想一下演算法在乙個地圖中尋找另外一點,最簡單的方式就是從出發點開始,一圈圈向外膨脹。從起點開始,首先遍歷起點周圍鄰近的點,然後再遍歷已經遍歷過的點鄰近的點,逐步的向外擴散,直到找到終點。這便是廣度有限演算法bfs。這個過程像在火山的岩漿蔓延,逐漸佔滿空間直到達到目標點。然後從目標點回溯,得到最短路徑。
在網格中移動,移動都周圍的格仔的代價都是走一步,是相同的。但是很多情況並非一樣,比如在地圖中,a城市到相鄰的b、c城市距離並非一樣。在移動代價不同的時候,就需要dijkstra了。
在dijkstra演算法中,需要計算每乙個節點距離起點的總移動代價。同時,還需要乙個優先佇列結構。對於所有待遍歷的節點,放入優先佇列中會按照代價進行排序。在演算法執行的過程中,每次都從優先佇列中選出代價最小的作為下乙個遍歷的節點。直到到達終點為止。
如果不考慮節點移動代價差異的廣度優先搜尋與dijkstra演算法,它們的結果將變得一致。
對於移動代價相同的情況,使用bfs這種方法顯然是暴力的,做了很多無用功,它遍歷了自身周圍的全部點,而非優先選擇某一些。這就引出了最佳優先搜尋。
原理很簡單,使用乙個優先佇列,以到達目標點的距離大小作為比較值。在新增了節點周邊的點之後,優先選擇距離目標點近的點。換句話說,原來bfs是一圈圈擴大,現在則是優先向著目標點走去。這可以大大加快路徑的搜尋速度。
但是缺點也很明顯,如果起點與目標點之間存在障礙物,最佳優先搜尋找到的就可能不是最優路徑。打乙個比方:小明在四合院**要到四合院背後,眼前有兩條路,從前門走,再繞到院子後面;直接向著院子後方走,但是要繞過一大堆的家具。在家具中經過的時間大於繞路走,但是最佳優先搜尋只會指導向前走。
可以說,a演算法是綜合了以上的演算法優點。a演算法通過下面這個函式來計算每個節點的優先順序:
f(n)
= g(n) + h(n)
這裡的g(n)
可以看做bfs的移動代價,h(n)
則是最佳優先搜尋的代價。
f(n)是節點n的綜合優先順序。當我們選擇下乙個要遍歷的節點時,我們總會選取綜合優先順序最高(值最小)的節點。
g(n) 是節點n距離起點的代價。
h(n)是節點n距離終點的預計代價,這也就是a*演算法的啟發函式。關於啟發函式我們在下面詳細講解。
a*
演算法在運算過程中,每次從優先佇列中選取f(n)值最小(優先順序最高)的節點作為下乙個待遍歷的節點。
另外,a*
演算法使用兩個集合來表示待遍歷的節點,與已經遍歷過的節點,這通常稱之為open_set和close_set
* 初始化open_set和close_set;
* 將起點加入open_set中,並設定優先順序為0(優先順序最高);
* 如果open_set不為空,則從open_set中選取優先順序最高的節點n:
* 如果節點n為終點,則:
* 從終點開始逐步追蹤parent節點,一直達到起點;
* 返回找到的結果路徑,演算法結束;
* 如果節點n不是終點,則:
* 將節點n從open_set中刪除,並加入close_set中;
* 遍歷節點n所有的鄰近節點:
* 如果鄰近節點m在close_set中,則:
* 跳過,選取下乙個鄰近節點
* 如果鄰近節點m也不在open_set中,則:
* 設定節點m的parent為節點n
* 計算節點m的優先順序
* 將節點m加入open_set中
啟發函式
上面已經提到,啟發函式會影響a*演算法的行為。
由上面這些資訊我們可以知道,通過調節啟發函式我們可以控制演算法的速度和精確度。因為在一些情況,我們可能未必需要最短路徑,而是希望能夠盡快找到乙個路徑即可。這也是a*
演算法比較靈活的地方。
對於網格形式的圖,有以下這些啟發函式可以使用:
a*總結
總而言之,就是如何在set中選擇下乙個待遍歷的節點。在bfs
中按誰先進入set選誰,最佳優先搜尋
按誰離得目標近選誰,a*
則是用它們兩的綜合選擇。另外一方面,啟發函式十分重要,決定了速度與精度。
啟發函式是一種思想,它給演算法選擇增加了乙個度量,在演算法增加資訊,在不知道如何選擇下乙個呆遍歷的節點時候,指導演算法選擇。
換言之,bfs並沒有充分利用好全部的已知資訊,沒有將目標點位置的資訊利用。甚至a*
也沒有,是不是甚至可以創造乙個啟發函式h_1()
,它描述了目標點距離障礙物的距離或者方向,當節點到達障礙物附近時候,指導下乙個節點的選擇。只不過這樣的啟發函式帶來的演算法複雜度在效率上是否划算。
在優達學城的自動駕駛入門課中,學習到了,我們還可以利用多個啟發函式,比如在h_1()``h_2()
都未大於真實代價的情況下,我們可以:
h()
=max
(h_1()
,h_2()
)
這樣是不是更加機智 移動機械人學 學習(一)移動機械人應用和分類
地面自主移動機械人 a 設計在室內或者室外,進行物料搬運,例如現代物流的很多倉庫 一般在醫院或者商場導購中常見,結合語音識別,人臉識別等技術,實現人機互動 例如電子科大的羽毛球機械人,日本研發的桌球機械人等,有幸與電子科大初代研發羽毛球機械人團隊交流過,並且了解整機工作流程 此類機械人在市場上常見於...
機械人學導論學習(1)
下面是對機械人學導論乙個概括 1 章對介紹了機械人學的背景以及發展前景,然後對本書的各個章節核心思想進行了介紹。2 章用數學的方法建立三維空間的座標系來描述操作臂的位置與姿態,主要包括笛卡爾空間與關節空間。3 章介紹了操作臂的正運動學,研究物體的運動而不考慮物體的力,主要內容是笛卡爾空間想關節空間的...
NAO機械人學習筆記(1)
1 nao機械人硬體 1.1 紅外線 紅外線發射角度 60 60 波長940nm.1.2 超聲波 聲納 nao能夠探測前方0.25 2.55m內是否有障礙物,探測角度60 超聲波頻率為49khz.1.3 感測器 1.3.1 接觸感測器 頭部感測器周圍 12個led 耳部 2 10個16級藍色led,...