1. 程式人生 > >A*智慧尋路演算法(php版本)

A*智慧尋路演算法(php版本)

          A*被譽為大眾級尋路演算法,常用於獲取兩個座標的最短路徑,屬於AI(人工智慧)範疇,最近自己開發了一套php版本的A*尋路演算法類,想要直接使用的朋友可以借鑑下。可以在我的空間裡面看具體的呼叫部分,類庫我會盡快上傳。

          先說下A*的演算法思路吧,首先,要有一個地圖,其實尋路就是在一塊塊的方格子裡面的中心點間進行移動,地圖的話我這裡用的是一個二位陣列矩陣(如圖):

這就是一張簡單的地圖了!你可以自由編輯或者是擴容,把他想想成遊戲中的場景地圖。

             其次就是一個核心的公式:f = g + h 。地圖中走哪些點,先走哪個點後走哪個點就靠這個公式啦!

            (一)f 值代表這當前座標點到達終點的一個預判距離,值越小表示距離越短,越優!

            (二)g 表示已經知曉的從起點到當前節點的實際距離,這裡注意包括斜邊距,比如從(0,0)到(1,0)的g距離就是1,而從(0,0)到(1,1)斜邊距離就是1.414 ,為什麼?斜邊長度大於直邊長度,想想勾股定理;

            (三)h值表示從當前節點到終點的曼哈頓距離,曼哈頓距離表示水平和垂直距離,不包括斜邊的距離,比如(0,0)到(1,0)的h值就是1,而到(1,1)的h值距離就是2,一直計算水平或者垂直距離。

             分析完公式後,我們準備2個存放資料的容器,比如2個列表吧(執行時需要考慮效能問題,比如排序等,可以用連結串列或者二叉樹),一個叫做open(要探索的列表),命名為,另一個叫做close(已探索的列表),對座標的篩選就是從這兩個列表中來的。

             我們先從起始點出發進行探索,比如(0,0)吧,它既是起始點,也是我們當前正在使用的座標點,我們把(0,0)新增到open列表中,進入open列表前,座標的f,g,h,父座標等資料都應該計算完成。同時從(0,0)向四周探索相鄰的點共有3個,(1,0),(1,1),(0,1),由於是有(0,0)的探索得到的這3個點,所以(0,0)就是他們的父節點。計算好相應的f,g,h等資料後,把他們3個新增到open列表中,同時移除(0,0),因為(0,0)已經探索過了。在探索過程中對於新生成的座標點要進行一定的過濾,當為地圖中的障礙物時,或者在close列表中時直接將該相鄰點略過,如果在open列表中發現相鄰點已經存在則需要做進一步分析,它在open中存在說明了經過其他座標的時候就已經把這個相鄰點新增到open列表中了,說明了父物件肯定不是正在探索的座標點,然後可以:模擬一下,如果open列表中已存在座標點物件的父座標點物件設定為當前座標點的話,g值是否可以得到優化,如果可以則修正之前已經存在於open列表中的那個節點的父物件點和f等值,否則保持不動。

             把要探索的座標點都存放到了open中後,我們就可以根據open列表中h值最小的座標點進行優先提取,提取出座標點後,再進行四周臨邊的探索,然後把從open列表中優先提取出來的點從open中移除,並且新增到close中去,就這樣周而復始。

             當open列表為空時表示沒有找到最終的路徑,尋路失敗。如果從open列表中提起的最優座標就是最終的終點座標,那麼恭喜你,尋路就成功了!這樣的話只需要從最後的節點按照其父座標物件的依次遞迴就可以得到最終的完美路徑了! 你也可以到 www.2kapp.com 首頁的 AI智慧尋路板塊進行下載除錯