原文連結:https://blog.csdn.net/weixin_39594441/article/details/101243168
目錄
涉及的問題
算法簡介
遺傳算法;
模擬退火;
人工勢場;
蟻群算法;
RRT;
PRM;
Dijkstra;
A-Star(A)搜索算法*;
Field D***
1. 涉及問題這裡的路徑規劃是指如何尋找一條從給定起點到終點的路徑,使機器人沿該路徑移動的過程中不與障礙物發生碰撞且路程最短或移動代價最小。2. 算法簡介遺傳算法(Genetic Algorithm)是一類借鑑生物界的進化規律(適者生存,優勝劣汰遺傳機制)演化而來的隨機化搜索方法。它是由美國的J.Holland教授1975年首先提出,其主要特點是直接對結構對象進行操作,不存在求導和函數連續性的限定;具有較好的全局尋優能力;採用概率化的尋優方法,能自動獲取和指導優化的搜索空間,自適應地調整搜索方向,不需要確定的規則。遺傳算法的這些性質,已被人們廣泛地應用於組合優化、機器學習、信號處理、自適應控制和人工生命等領域。就遺傳算法運用於路徑規劃而言,可簡單概括為如下步驟:a. 隨機選取節點組成一組初始路徑群(即許多條路徑構成的集合);c. 選擇路徑群中任意兩條路徑進行交叉和變異,路徑長度越短的路徑有更高的被選擇的概率,繼續選擇然後進行交叉和變異形成新的子代路徑群;d. 按照路徑長度淘汰掉初始路徑群和子代路徑群中路徑較長的路徑,然後形成新的路徑群;e. 回到步驟1繼續下一輪迭代,制定迭代到達一定次數或路徑長度變化非常緩慢的情況時停止迭代,此時路徑群中最短的路徑即為遺傳算法求得的優化路徑。
2.2 模擬退火
擬退火是S. Kirkpatrick, C. D. Gelatt和M. P. Vecchi在1983年提出。模擬退火算法(Simulated Annealing),簡稱SA,是一種適用於大規模組合優化問題的有效近似算法。
它模仿固體物質的退火過程,通過設定初溫、初態和降溫率控制溫度的不斷下降,結合概率突跳特性,利用解空間的鄰域結構進行隨機搜索。具有描述簡單、使用靈活、運行效率高、初始條件限制少等優點,但存在著收斂速度慢、隨機性等缺陷,參數設定是應用過程中的關鍵環節。
應用於路徑規劃問題中可簡單描述其運行步驟如下:
a. 進行若干次的隨機選擇路徑,從中選擇出路徑長度最小的路徑作為模擬退火迭代方法的初始解;
b. 對初始路徑進行隨機的元素置換然後依據Metropolis準則判斷轉換後的新解是否可以被接受;
c. 重複步驟2直至Metropolis準則中定義的溫度係數T低到一定程度後停止迭代,此時當前解即為模擬退火法求得的最優路徑。
關於Metropolis準則可簡單概括如下式:
# Procedure Calculate_estimate_value(i)Return line_distance(i,g);# Procedure Initialize()[r c]=size(Map);State=zeros(r,c);G=inf(r,c);P=inf(r,c);P(s)=s;Set-f=null;Set-f.insert(s,calculate_estimate_value(s));Procedure Main()Initialize();While(State(g)≠closed )cv=Set-f.getMin(); for all negh_cv∈ neighbor(cv) if(state(negh_cv) ≠closed ) temp_esti=G(cv)+line_distance(negh_cv,cv) if(temp_esti<G(negh_cv)) P(negh_cv)=cv; G(negh_cv)=temp_esti; state(negh_cv)=closed; Set-f.remove(cv); if(Is_empty(Set_f)) break;
偽碼第1行中函數line_distance(i,g)返回節點i到地圖目標節點g(goal)間的直線距離。障礙物地圖由矩陣Map表示。S表示路徑起點,Set-f.getMin()用於反饋集合Set-f中距離起點路徑長度最短的節點的索引。偽碼12行中neighbor(cv)表示與節點cv相鄰的節點組成的集合,在二維柵格地圖上若cv節點不位於地圖邊界上時與其相鄰的節點有且僅有8個。矩陣G用於存放節點距離地圖上路徑起點的路徑長度。
上圖3-4中標有S的方格代表地圖上的起點,標有G的方格代表路徑的目標點,即終點。圖3-4中深黑色部分的方格代表地圖上的障礙物,灰色部分的方格代表被算法計算區域,黃色部分方格代表在算法結束時該部分的方格仍然還在集合Set-f中,綠色部分方格表示算法搜索得到的路徑。每個方格上的箭頭均指向其父方格(或稱算法中的節點)。每個方格的左下方的兩組數據,由上至下分別表示該方格距離地圖上起點的路徑長度和該方格在Set-f中的評估數值,對於Dijkstra即為G值,對於A-Star即為F值。
A-Star(下稱A*)算法的整體結構和Dijkstra基本一致,關鍵的地方在於A算法為提高算法向目標點搜索的能力,即避免一些不必要的搜索方向而引入啟發函數使得搜索效率的到很大提高。在原有Dijkstra算法的中,當算法即將進行下一次迭代時,是從Set-f集合中選距離起點最近的節點(cv)作為即將進行的迭代過程中的傳遞路徑信息的節點,即G(cv)滿足下式:G(cv)≤G(i) ∀ i ∈Set-f (3.2)相比之下A僅是將Dijkstra算法中上式3.2變換成下式:F(cv)≤F(i) ∀ i ∈Set-f (3.3)F(i)=G(i)+H(i) (3.4)式 (3.4)中G(i)依然為節點i到地圖上路徑起點的距離,而H(i)為節點i到地圖上路徑目標點的估計距離。H函數數值的大小通常可以由以下幾類距離中的一類來計算, 曼哈頓距離(Manhattan distance) 、 切比雪夫距離(Chebyshev distance) 、 歐式距離(Euclidean distance)和Octile 距離 。H(i) = (abs(i.x – g.x) + abs(i.y – g.y)) (3.5)H(i) = Max(abs(i.x – g.x) ,abs(i.y – g.y)) (3.6)H(i) =(abs(i.x–g.x) + abs(i.y–g.y)) (3.7)H(i) = sqrt((i.x–g.x)^2 +(i.y–g.y)^2) (3.8)H=√2Min(abs(i.x – g.x),abs(i.y – g.y)+Max(abs(i.x – g.x) ,abs(i.y – g.y)) (3.9)上式(3.5-3.9)中i.x表示點i的x軸坐標值,abs()為求取絕對值的函數。對比式(3.2)和(3.4)不難發現Dijkstra與A算法差別在於從Set-f中選擇作為下一次迭代過程中使用的主動傳遞路徑信息節點的方式不樣。Dijkstra幾乎是以起點為圓心在任何一個方向上都進行主動傳遞路徑信息節點的選擇,這樣就導致路徑信息最終幾乎也是以起點為圓心逐漸向圓外進行拓展,沒有明顯的指向性。然而A算法在執行過程中Set-f中靠近路徑起點與路徑終點的節點將會被優先選取,這樣就使得A算法在迭代過程中逐漸向路徑終點靠近,從而明顯提高算法的搜索效率。Field D* 算法是由 Dave Ferguson 和Anthony Stentz提出的一種Any-Angle Path Planning algorithm算法(以下稱無角度約束路徑規劃)。所謂無角度約束路徑規劃主要是指,許多路徑規划算法在迭代過程中傳遞路徑信息的方式是以主動傳遞路徑信息的節點僅向其相鄰的8個節點進行路徑信息傳遞,而且在算法迭代過程中所有節點的父節點一定是與其相鄰的某個節點,這樣將導致算法最終得到的路徑上轉向點轉過的角度一定是45°的倍數(對於橫縱等間距的柵格地圖)。如下圖3-7所示這類有角度約束的算法生成的路徑通常如圖3-7(a)而無角度約束路徑規划算法的目的是找到圖3-7(b)中虛線的路徑。圖3-7中灰色方塊代表地圖上的障礙區域,Sstar和Sgoal分別代表地圖上的起點和終點。
圖3-6 受約束的路徑規劃和無角度約束路徑規劃受到角度約束的路徑規划算法中被傳遞路徑節點的父節點一定是與其相鄰的某個節點之一。
圖3-7 受約束的路徑規劃和無角度約束路徑規劃總的來說在計算靜態地圖時Field D算法的主體結構與3.3節中Dijkstra算法比較相似,主要區別在於Field D算法傳遞路徑信息的方式。與存在角度約束的算法中通過節點向其相鄰節點傳遞路徑信息的方式不同,Field D算法是通過兩個相鄰節點向與這兩個節點均相鄰的節點傳遞路徑信息。如下圖3-8 (a)所示某時刻算法擬對節點s進行路徑信息傳遞(即求出該點至地圖上路徑起點的距離),為確保節點s的路徑長度最短,顯然將s與路徑起點進行直接連線(這裡先假定這條直線不穿越障礙物)節點s可獲得最短的距離,這樣的連線必然穿越與s節點相鄰的兩個節點組成的連線。如圖3-8 (a)所示由s點出發的箭頭與S1和S2組成的線段相交。此時可抽象為S1和S2組成的線段向與S1和S2均相鄰的節點S傳遞路徑信息,具體計算S節點路徑長度的方法可見圖3-9中Field D算法計算路徑信息(路徑長度)的偽碼。
圖3-8 Field D*算法傳遞路徑信息分析下圖3-9中偽碼不難發現Field D算法,首先假定在節點Sa和Sb間的連線上距離起點的路徑長度呈線性分布(這其實與地圖上的實際情況差別比較大,也最終導致Field D算法不能準確地傳遞路徑信息,因為只有很少的情況下才滿足呈線性分布的關係)。過分析不難發現對於在二維地圖中設定起點和終點,尋找最短路徑的問題,使用遺傳算法和模擬退火算法不太恰當。這是因為這兩種算法都是在已知且固定的解空間維度中搜索最優解,而顯然對於尋找最短路徑問題,組成最優解的節點的個數並不是確定的。人工市場法建模方法相對複雜,不恰當的建模方法容易引發算法震蕩和陷入局部最優,而且在差異比較大的地圖環境中使用同一套建模方法算法還有可能出現與障礙物相碰撞或震蕩。蟻群算法雖然具有較好的搜索最優解的能力,但是它和A算法一樣應用在二維柵格地圖上時都存在搜索步長的約束,而無法實現無角度約束路徑規劃(Any-Angle Path Planning),而在求解最優路徑的所花的時間上A算法相比於蟻群算法有非常大的優勢。Field D算法是一種相對誕生比較早的無角度約束路徑規划算法,雖然後面有湧現出其它的同類算法(Any-Angle Path Planning),例如Theta-star、Block A-star 和Incremental Phi-star,這些算法的運行效率或求解的最優路徑相比Field D*並沒有明顯的提高。