a演算法,從框架上看和深度以及寬度優先搜尋之間有異曲同工之妙。為解決寬度優先搜尋、深度優先搜尋的盲目搜尋問題(在實現過程中表現形式為節點的優先順序只與深度有關),a演算法採用啟發式搜尋,簡單的來說就是先「判斷一下目標的可能性」,選擇容易到達目標的節點優先搜尋。由此引入估價函式,對節點的「可能性」就行評估,每個節點的評估值可以作為其優先順序(越可能到達目標的節點優先順序越高,與深度、寬度優先搜尋區別最大的地方)。
接下來就是估價函式的問題。演算法的估價函式可表示為f(n) = g(n) + h(n), g(n) 表示開始節點到節點n 的實際路徑代價,而h(n) 表示節點n 到目標節點的最小路徑代價的估計值,那麼f(n) 就表示從開始節點到目標節點且經過節點n 的最小代價解的估計代價。在本次的8數碼實驗中,以曼哈頓距離作為估計值:例如:這種情形 下,於目標 比對,在忽略3、1的影響下,6需要移動三步;2,3不需要移動;5需要向右移動一步;同理類推一共需要移動heuristics=3+0+0+1+1+3+1+1=10。節點的優先順序為:priority = new_cost + newpuzzle8.heuristics,new_cost為已經走的步數,newpuzzle8.heuristics還需代價的估計值。當然priority的值越小,節點的優先順序越高。
a演算法是一種啟發式搜尋,關鍵是找到乙個好的啟發式策略,也就是乙個比較好的估價函式。如果能在bfs搜尋演算法中利用估價函式對佇列中的節點進行排序的話,該搜尋方式為a演算法。在將a*演算法應用到8數碼問題時,有許多小技巧值得學習:將乙個節點的狀態用tostring方法轉換成字串記錄;用曼哈頓距離作為估價函式。
8數碼問題
8數碼問題,即在乙個3 3的矩陣中有8個數 1至8 和乙個空格,從乙個狀態轉換到另乙個狀態,每次只能移動與空格相鄰的乙個數字到空格當中 aoj 417 8數碼 這題是求轉化的最少步數,可用bfs解決,共有9 362880種情況,關鍵是如何標記已經訪問過的狀態,保證每次搜尋得到的狀態都是最小的步數,這...
藍橋杯 BFS 八數碼問題(演算法筆記8)
題目中輸入初始狀態和目標狀態,返回最少的移動步數。這與迷宮問題的最短路勁有些許相似,但這裡更多的是一種狀態的思考,本題涉及到 康托展開 這個特殊的雜湊函式。但是,思路有了不代表能做對,因為ac還要考慮時間複雜度,空間複雜度問題,不過一般空間複雜度都沒太大的問題。那麼為什麼這裡說不能做對?這裡參考書上...
演算法入門經典第二版 3 5 Puzzle
1.提醒一下自己初始化很重要。2.因為自己在solve 中使用for int i 0 i strlen command i 沒注意到strlen command 返回的是最長的命令輸入的字元個數而不是當前字元個數導致無法ac eg command 接收到 lllrrraaa 的輸入 command為...