A star演算法的一些研究

來源:互聯網
上載者:User

A Star演算法是一智能找最短路徑演算法(下面簡稱A演算法), 與 Dijkstra演算法相比,A演算法訪問的節點比較少,因此可以縮短搜尋時間。他的演算法思想是:

這裡有公式f

         最終路徑長度f = 起點到該點的已知長度h + 該點到終點的估計長度g。

         O表(open):

                待處理的節點表。

         C表(close):

                已處理過的節點表。

演算法流程:

1. 從起點開始,起點的f = 1 + g,  1表示此節點已走過的路徑是1,g是此節點到終點的估計距離, 放入鏈表O中。

可以假設g值的計算使用勾股定理公式來計算此點到終點的直線距離。

2. 當O不為空白時,從中取出一個最小f值的節點x。

3.如果x等於終點,找到路徑,演算法結束。否則走第4步.

4. 遍曆x的所有相鄰點,對所有相鄰點使用公式f,計算出f值後,

先檢查每個相鄰節點y是否在鏈表O和C中,

如果在O中的話的話,更新y節點的f值,保留最小的f值,

如果在C中的話,並且此時f值比C中的f值小,則更新f值,將y節點從C中移到O中。否則不做操作。

如果不在以上兩表中,按最小順序排序將y插入鏈表O。最後將x插入C表中。

例如:

     起點是 (1,1), 終點是(5,5), 取一個相鄰點(0,1), 這時這個點的h=1+1 = 2, g可以用勾股定理公式來計算此點到終點的直線距離,就是 (5-0)*(5-0) - (5-1) *(5-1) = 9, 再開平方等於3,這樣f就等於2+3 = 5.然後將此點插入鏈表O中。

如果相鄰點不是路徑,比如是障礙,那就跳過。

5.繼續2,3,4步直到找到終點, 或者直到O為空白表示沒找到路徑。

 

上面檢查O和C表的原因是:

        如果圖是一個不規則的圖,比如一個遊戲裡,有幾個傳送門,這樣同一個點如果經過傳送門的話,路徑會大大縮短,這樣就需要檢查O和C表來更新f值,如果是一個不包含捷徑(傳送門)的圖,那樣就可以用個數組來標記已訪問過的節點,這樣就可以不用C表,也不用檢查O表來更新f值。

 

對於沒找到路徑的結果,訪問的節點有可能差不多是所有節點,這樣的效率和Dijkstra一樣低,我們可以使用同時從兩端用A演算法來找路徑,這樣當其中一個沒找到路徑的話,尋找結束。這樣用的時間將是2 * min(S,E)的時間,S是從起點開始尋路徑的時間,E是從終點開始尋路徑的時間。這樣的一個典型的例子是

     終點是個孤立的點,沒有任何點能到達他,而其他點都是連結的,那麼如果光從起點開始找的話,要到訪問完所有除終點之外的點後才知道找不到終點。這樣的效率非常差。 如果同時從兩端開始找,馬上就能知道終點沒有任何路徑相鄰,尋找結束。

    當然從終點反找起點的演算法有限制,比如有向圖就無法適用。

兩端同時尋找的演算法需要有些改動:

在第3步時,如果是S端的尋找過程,則檢查x是否存在E端尋找過程的C表裡,如果存在,則尋找到路徑。將兩個過程已訪問的路徑合并則是結果。反過來E端的尋找過程也一樣比較處理。

我用Qt寫了一個例子來檢驗A演算法,這裡不好附上程式,就附上幾張圖

Dijkstra搜尋的節點圖

 

同樣一張圖,A Star演算法搜尋的節點圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.