a* 演算法是啟發式搜尋演算法中的經典,經常應用於圖搜尋、路徑搜尋和規劃中。這裡以八數碼問題狀態空間圖的搜尋為例,初步介紹以a*演算法為代表的啟發式搜尋。
搜尋演算法可分為兩大類:無資訊的搜尋演算法和有資訊的搜尋演算法。無資訊的搜尋又稱盲目搜尋,其特點是只要問題狀態可以形式化表示,原則上就可用使用無資訊的搜尋,無資訊搜尋有如下常見的幾種搜尋策略:廣度優先搜尋、代價一致搜尋、深度優先搜尋、深度有限搜尋、迭代深入優先搜尋、雙向搜尋。我們說dfs和bfs都是蠻力搜尋,因為它們在搜尋到乙個結點時,在展開它的後續結點時,是對它們沒有任何『認識』的,它認為它的孩子們都是一樣的『優秀』,但事實並非如此,後續結點是有好有壞的。好,就是說它離目標結點『近』,如果優先處理它,就會更快的找到目標結點,從而整體上提高搜尋效能。啟發式搜尋是利用知識來引導搜尋過程的,達到減少搜尋範圍的目標,使得盡量先走「最有希望的方向」,從而降低問題複雜度。這裡就是要根據知識,設計啟發性資訊(啟發函式),啟發性資訊可以:為了改善上面的演算法,我們需要對展開後續結點時對子結點有所了解,這裡需要乙個估值函式,估值函式就是評價函式,它用來評價子結點的好壞,因為準確評價是不可能的,所以稱為估值。這就是我們所謂的有資訊搜尋。如果估值函式只考慮結點的某種效能上的價值,而不考慮深度,比較有名的就是有序搜尋(ordered-search),它著重看好能否找出解,而不看解離起始結點的距離(深度)。如果估值函式考慮了深度,或者是帶權距離(從起始結點到目標結點的距離加權和),那就是a* 如果不考慮深度,就是說不要求最少步數,移動一步就相當於向後多展開一層結點,深度多算一層,如果要求最少步數,那就需要用a*。簡單的來說a*就是將估值函式分成兩個部分,乙個部分是路徑價值,另乙個部分是一般性啟發價值,合在一起算估整個結點的價值。
1)幫助確定擴充套件節點的資訊
2)有效地幫助決定哪些後繼節點應被生成
3)能決定在擴充套件乙個節點時哪些節點應從搜尋樹上被刪除
啟發性資訊的設計至關重要,太弱可能就起不到效果,甚至退化為盲目搜尋,太強就會可能導致找不到最優的解。
evaluation function:是一種對於節點「希望」的度量,表示這個節點在通向目標節點最佳路徑上的「希望」或者概率,以此為指導選擇優先擴充套件的節點。
估價函式的選取有很多方式:節點處於最佳路徑上的概率;節點與目標節點集之間距離的度量或者差異的距離;根據狀態優劣的打分等等。
注意:估價函式和之前提到的代價函式不一樣,代價函式是預先知道的,而估價函式是根據知識**得到的
對於求解過程中,啟發式搜尋與盲目搜尋的區別就在於對於open表的重排,優先選擇最優希望的節點擴充套件。
重排的依據就是:從起始節點到達該節點的耗散g(n)和從該節點到目標節點的消耗h(n)結合起來對節點進行評價,即
對於a演算法中,g(n)和h(n),尤其是h(n)該如何選擇呢,選擇如果超過實際代價太多,也就是太強,可能會找不到解;太弱就會在搜尋過程中,擴充套件一些多餘的節點,對於具體問題要根據具體知識進行設計。這裡定義如果對於所有的n都有h(n)≤h* (n),也稱h(n)為h* (n)的下界,則是一種相對保守的搜尋,但是這樣是可納的。
採用h*(n)的下界h(n)為啟發函式的a演算法,稱為a* 演算法。當h=0時,a* 演算法就變為有序搜尋演算法。
上圖中,f*(n)=g*(n)+h*(n)是從s經過n到g的最優路徑的實際代價,而g(n)和h(n)就分別是對實際代價的估計!
所以在設計估價函式時,要盡可能的使得和h(n)逼近h*(n),但又不超過h*(n),這樣得到的時完備可納的,有時複雜度最小的,但是如何知道有沒有超過h*(n)呢?感覺還是需要具體問題具體分析。
搜尋過程大致和盲目搜尋一樣,只是在open表排序不同,其中涉及到的排序演算法,去重演算法等都會影響演算法的效率。
對於上面圖中「調整親子關係和指標」:
1)如果j既不在open表中,也不在closed表中,則用估價函式f把它添入open表,從j加一指向父輩節點i的指標。
2)如果j已在open表或closed表上,則比較剛剛對j計算過的f值和前面計算過的該節點在表中的f值.。如果新的f值較小,則作以下幾種操作:
a. 以此新值取代舊值
b.從j指向i, 而不是指向它的父輩節點
c.如果節點j在closed表中, 則把它移回open表
這裡以之前提到的八數碼問題為例:
1)估價函式1:f(n)=d(n)+w(n)
d(n)為n的深度
w(n)為不在位的棋子數
這樣w(n)≤h*(n),是滿足a* 演算法的限制條件,所有一定能找到最優解,但是這樣設計估價函式並不是最優的。
2)估價函式2:f(n)=d(n)+p(n)
p(n)為不在位的棋子與其目標位置的距離之和
這樣p(n)≤h*(n),也是滿足a* 演算法的限制條件。
w(n)是不在位的棋子數,不夠貼切,錯誤選用節點加以擴充套件,而p(n)是更接近於h*(n)的h(n),其值是節點n與目標狀態節點相比較,每個錯位棋子在假設不受阻攔的情況下,移動到目標狀態相應位置所需走步的總和。p(n)不僅考慮了錯位因素,還考慮了錯位的距離(移動次數),也就是啟發性資訊更多了。
1)對於啟發性資訊:設對同乙個問題定義了兩個a* 演算法a1和a2,若a2比a1有較多的啟發資訊,即對所有非目標節點有h2(n) > h1(n),則在具有一條從s到t的路徑的隱含圖上,搜尋結束時,由a2所擴充套件的每乙個節點,也必定由a1所擴充套件,即a1擴充套件的節點數至少和a2一樣多。
2)在實際應用中理論上是設計接近、又總是≤h*(n)的h(n),但是這種設計往往也要消耗大量的時間,如果h(n)本身設計的複雜,每次計算時消耗在h(n)上的復制度也就會增加,使得求解變慢。
3)對於搜尋深度和啟發性資訊的權衡:
f(n) = g(n) + wh(n)
搜尋圖的淺層時,讓w取較大值,突出啟發式函式的作用,加速向縱深方向搜尋。
搜尋到較深的層次時,讓w取較小值,以使g(n)所佔權重大,並確保wh(n)≤h* (n),引導搜尋向橫廣方向發展,尋找到較短的解答路徑。
人工智慧 搜尋 啟發式搜尋
搜尋演算法的形式化描述 狀態state 動作motion 狀態轉移state transition 路徑path 測試目標test target 一 啟發式搜尋 有資訊搜尋 heuristic search 代表演算法 貪婪最佳優先搜尋 greedy best first search a 搜尋 啟...
人工智慧 有資訊搜尋 (啟發式)
一 最佳優先搜尋 根據評價函式選擇表現的最佳的節點進行擴充套件 最佳優先搜尋 best first search 演算法 不同的方法有不同的評價函式 啟發函式,標記h x h n 從節點n到目標的最低耗散估計值 啟發函式是額外資訊的一種最普通的形式 二 貪婪最佳優先搜尋 最先擴充套件離目標節點最近的...
人工智慧導論(2) 啟發式演算法(八數碼問題)
用a 演算法來解決八數碼問題。include include include using namespace std int open cnt 0 int open node cnt open表節點個數 int close cnt 0 int noresoult 0 struct nodestart...