基於c 的A star演算法

2021-10-03 06:50:00 字數 1312 閱讀 3754

資料:

一、基礎原理

1、從起點開始,向周圍八個方向擴充套件。測試新擴充套件的點的路徑代價,路徑代價由已走的路徑和距離終點的期望加和而成。這個路徑代價是選擇路徑的標準。

2、有兩個表open、close。

close:生成並且考察過的點,存在兩種點。一種是當前選擇的路徑,是最終想要的結果。另一種是考察但沒有用到的點,是考察過但是比最終路徑代價大的路線,可能父指標可以指回起點,也可能無法指回起點(曾經進入死胡同的路線)。

open:生成但是沒有考察的點

·若形象的想的話,open中的點,close中的最終路線,close中的沒用的路線用不同的圖形畫出。open在最外側一層,close在中間,有一條線根據父指標逐層引出。

3、具體步驟

(1)最開始的時候只有起點在open中.

(2)從open中找到最小的點n。

(3)n向八個方向擴充套件,就獲得了八個新點x1~x8,接下來判斷八個點的存入的地方。

(4)如果x存在於close中,則比較close中和當前點的代價大小。若新的點小,則用新的點代替舊的。若舊的點小,則放棄新的點。

如果x存在於open中,則比較close中和當前點的代價大小。若新的點小,則用新的點代替舊的。若舊的點小,則放棄新的點。

如果都不存在,就放入open。

根據這個方法,進行八個點的判定。

(5)將n放入close。

(6)返回(2),直到open中沒有點或者到達目的地。

·close和open中都是沒有重複的點的。整套演算法,就是生成新的點,然後每一步做區域性最優解,有錯的情況下糾正,積累以後獲得整體的最優解。

·區域性最優解+多次嘗試然後糾錯=全域性最優解

二、**具體細節

·上面那個原理看起來很簡單,但是實施起來尤其是需要關注效率的時候就有些困難了

1、每乙個點包含的資訊

·用乙個結構體進行封裝

(1)自身座標

(2)父指標,實際上就是當前點儲存著自己是由哪乙個點擴充套件而來的。這個方法可以減輕很多**負擔,要改變路徑的時候,只要在關鍵位置將代價更小的點放入close,將之前路徑在這乙個關鍵點後面的close中的點放回open就可以了。

(3)代價,代價由當前路徑的代價和期望組成。路徑期望的演算法是路徑規劃效果好壞的關鍵。每乙個點都儲存著獨一無二的當前路徑的代價,這個代價是從父指標指著的點、父指標的父指標點、父指標的父指標的父指標點······一層層累加而得的。當前路徑代價和父指標共同組成了,到達目前這個點的第一無二的路徑資訊和代價。

2、資料型別的選用

close、open都是長度不定的資料型別,我這裡的想法是用乙個結構體封裝

要使用vector

未完待續······

A star演算法優化二

本文目的是對a 尋路演算法所生成的路徑進行一些人性化的調整,使其看起來不至於太機械化。關於a 演算法的原理與實現,讀者可以閱讀其他資料,這裡不再詳細闡述。a 尋路演算法本質上是乙個有方向性的廣度優先搜尋演算法,它使用乙個估價函式,來估測可能的最短路徑,在每一次搜尋迭代完成後,選取其鄰接點中最優的乙個...

A Star演算法的原理及應用

在acm集訓時看到小超同學在寫乙個a star的尋路演算法,於是心癢癢,自己也想寫乙個,只是一直沒有時間靜下來好好動動腦筋,近日終於趁週末的時間,把a star實現了,可在地圖上尋找較短路徑,也可解任意迷宮。在計算機中我們將地圖表現為單元格,分可走單元格和不可走單元格。如果用窮搜找最短路徑當然是可以...

我對AStar演算法的探索

最近讀到一篇關於 html5實現炮塔防守 的文章,對其中的路徑搜尋演算法有點興趣,稍微探索了一下。while open.isempty false else open.add neighbour i 沒有曾經掠過,就作為候選節點加入 判斷是否到達目標 if index contain open,en...