Astar A 演算法 最短路徑演算法

2021-07-24 05:09:18 字數 1764 閱讀 6074



通常情況下,迷宮尋路演算法可以使用深度優先或者廣度優先演算法,但是由於效率的原因,不會直接使用這些演算法,在路徑搜尋演算法中最常見的就是a*尋路演算法。使用a*演算法的魅力之處在於它不僅能找到地圖中從a到b的一條路徑,還能保證找到的是一條最短路徑,它是一種常見的啟發式搜尋演算法,類似於dijkstra演算法一樣的最短路徑查詢演算法,很多遊戲應用中的路徑搜尋基本都是採用這種演算法或者是a*演算法的變種。

1.首先把起始位置點加入到乙個稱為「open list」的列表,在尋路的過程中,目前,我們可以認為open list這個列表會存放許多待測試的點,這些點是通往目標點的關鍵,以後會逐漸往裡面新增更多的測試點,同時,為了效率考慮,通常這個列表是個已經排序的列表。

2.如果open list列表不為空,則重複以下工作:

(1)找出open list中通往目標點代價最小的點作為當前點;

(2)把當前點放入乙個稱為close list的列表;

(3)對當前點周圍的4個點每個進行處理(這裡是限制了斜向的移動),如果該點是可以通過並且該點不在close list列表中,則處理如下;

(4)如果該點正好是目標點,則把當前點作為該點的父節點,並退出迴圈,設定已經找到路徑標記;

(5)如果該點也不在open list中,則計算該節點到目標節點的代價,把當前點作為該點的父節點,並把該節點新增到open list中;

(6)如果該點已經在open list中了,則比較該點和當前點通往目標點的代價,如果當前點的代價更小,則把當前點作為該點的父節點,同時,重新計算該點通往目標點的代價,並把open list重新排序;

3.完成以上迴圈後,如果已經找到路徑,則從目標點開始,依次查詢每個節點的父節點,直到找到開始點,這樣就形成了一條路徑。 

以上,就是a*演算法的全部步驟,按照這個步驟,就可以得到一條正確的路徑。這裡有乙個關鍵的地方,就是如何計算每個點通往目標點的代價,之所以稱為a*演算法為啟發式搜尋,就是因為通過評估這個代價值來搜尋最近的路徑,對於任意乙個點的代價值,在a*演算法中通常使用下列的公式計算:

代價f=g+h

在這裡,f表示通往目標點的代價,g表示從起始點移動到該點的距離,h則表示從該點到目標點的距離,比如圖中,可以看到小狗的附近格仔的代價值,其中左上角的數字代表f值,左下角的數字代表g值,右下角的數字代表h值。拿小狗上方的格仔來舉例,g=1,表示從小狗的位置到該點的距離為1個格仔,h=6,表示從小狗到骨頭的距離是6個格仔,則f=g+h=7。在此處,距離的演算法是採用曼哈頓距離,它計算從當前格仔到目的格仔之間水平和垂直的方格的數量總和,例如在平面上,座標(x1,y1)的點和座標(x2,y2)的點的曼哈頓距離為:

|x1-x2|+|y1-y2|

當然,距離的演算法也可以採用其他的方法,實際在遊戲中,這個移動的代價除了要考慮距離因素外,還要考慮當前格仔的遊戲屬性。比如有的格仔表示水路、草地、陸地,這些有可能影響人物移動的速度,實際計算的時候還要把這些考慮在內。

另乙個需要注意的就是,在計算這個距離的時候是毋須考慮障礙因素的,因為在以上a*演算法步驟中會剔除掉障礙。

這樣,按照前面所說的a*演算法的步驟,第一次迴圈open list的時候,把a點作為當前點,同時把a周圍的四個點放入到open list中。第二次迴圈的時候把a右邊的點作為當前點,該點的父節點就是a,這是處理當前點的時候,只需要把當前點的上下兩個點放入open list中,因為左邊的a已經在close list中,而右邊的是牆,所以直接被忽略。

演算法比較簡單就不貼把,用優先佇列比較好實現

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

演算法 最短路徑演算法

ps 能求帶負邊圖,但不能帶負權迴路 可以求出任意兩點之間的最短路徑 主 for k 1 k n k for i 1 i n i for j 1 j n j if i j j k i k dis i j min dis i k dis k j dis i j ps 不支援負邊 求單源最短路徑,即起點...

最短路徑演算法

floyd演算法 012345 001 54 1108 1 2 801 3 3 1035 45 302 5413520 floyd 演算法過程描述如下 首先 以邊集 初始化,得到所有的直接連通代價 依次考慮第 k個結點,對於 中的每乙個 i j 判斷是否滿足 s i j s i k s k j 如果...