A 演算法詳解

2022-05-05 16:36:17 字數 1621 閱讀 9911

a*演算法的基本原理

>a-star演算法是一種靜態路網中求解最短路徑最有效的直接搜尋方法,也是解決許多搜尋問題的有效演算法。演算法中的距離估算值與實際值越接近,最終搜尋速度越快。

f[i]=g[i]+h[i];
以上式子中\(g[i]\)表示從起點到當前節點已經付出的代價,這個是準確的

\(a*\)演算法最重要的是估價函式\(h[i]\)的設計,\(h[i]\)是估價函式,表示當前節點到終點的預計代價,當估價函式設為\(0\)時,就和普通的最短路沒有區別,設從當前節點到終點的真實值為\(x[i]\),\(h[i]\)越接近\(x[i]\),那麼這個演算法效率就越高,但需要注意一點。

我們要保證\(h[i]<=x[i]\),一旦大於,那麼\(a*\)演算法不能保證其正確性。

想必大家都很熟悉\(bfs\)了,在我的淺顯的理解中,\(a*\)是對\(bfs\)的優化。

\(q:\)假設有人想從\(a\)點移動到一牆之隔的\(b\)點,如下圖,綠色的是起點\(a\),紅色是終點\(b\),藍色方塊是中間的牆,假設走一格的代價為10,周圍有八個方向可以移動,對角線的代價是\(10\sqrt 2\),要求輸出最優的路徑。

第乙個想法是用\(bfs\)(但我們是在講\(a*\)啊喂)

然後我們還是要用\(a*\)的方法解決,和\(bfs\)很像,我們先開乙個優先佇列(按照f值從小到大排序),然後將起點周圍的八個節點放入佇列中,利用上面的公式\(f[i]=g[i]+h[i]\),這裡不要求輸出最優解,所以對角線用\(14\)近似即可,在格點圖中,\(h[i]\)通常使用當前節點與終點的曼哈頓距離,這樣\(h[i]\)也可以用\(o(1)\)的複雜度求出。

現在我們再開兩個陣列\(vis[i]、t[i]\),\(vis\)標記了還在佇列中的節點,\(t[i]\)表示不用再被訪問的節點

然後我們用乙個陣列儲存當前節點從哪個節點轉移而來,方便輸出路徑。當第一波操作完成後的情況是這樣的。(左上角表示f值,左下角g值,右下角h值)

下面我們開始一系列操作

\(1.\)找出當前佇列中的隊首(其實就是\(f\)值最小的那個),將它取消標記在佇列\(vis\)中,放入\(t\)中(一定要區分這兩個陣列,因為每次取的是最優解,這個節點一定不會被更優地更新了,所以它就像障礙物不用再訪問了),然後將它擴充套件,重新計算出\(g、h、f\),設定父節點,並且將這個節點標記已經訪問(\(vis\)),放入佇列。

\(2.\)如果遇到障礙物或在\(t\)中的節點,則跳過

\(3.\)如果遇到在\(vis\)的節點,檢查轉移後\(g\)值是否小於上次搜尋到時的\(g\)值,如果是,那麼更新這個節點的所有資訊,重新計算,然後很重要的一點是重新設定父節點

好的,接下來不停進行這種操作,直到找到最終節點。

最後要做的,就是從終點開始訪問父節點,將路徑逆推出來就大功告成了,\(a*\)演算法到此為止。

什麼你要\(code?\)不好意思暫時沒有

A 演算法詳解

第一部分 a 演算法簡介 寫這篇文章的初衷是應乙個的要求,當然我也發現現在有關人工智慧的中文站點實在太少,我在這裡 拋磚引玉,希望大家都來熱心的參與。還是說正題,我先拿a 演算法開刀,是因為a 在遊戲中有它很典型的用法,是人工智慧在遊戲中的代表。a 演算法在人工智慧中是一種典型的啟發式搜尋演算法,為...

KMP演算法詳解

模式匹配的kmp演算法詳解 這種由d.e.knuth,j.h.morris和v.r.pratt同時發現的改進的模式匹配演算法簡稱為kmp演算法。大概學過資訊學的都知道,是個比較難理解的演算法,今天特把它搞個徹徹底底明明白白。注意到這是乙個改進的演算法,所以有必要把原來的模式匹配演算法拿出來,其實理解...

KMP演算法詳解

kmp演算法即knuth morris pratt演算法,是模式匹配的一種改進演算法,因為是名字中三人同時發現的,所以稱為kmp演算法。因為偶然接觸到有關kmp的問題,所以上網查了一下next陣列和 nextval陣列的求法,卻沒有找到,只有在csdn的資料檔案裡找到了next陣列的簡單求法 根據書...