前面
樹搜尋策略(上)介紹了樹搜尋的一些基本演算法,
樹搜尋策略(中)通過兩個例項具體介紹了分支限界法的思想,本篇主要介紹借助「best-first」搜尋的a*演算法。
1. a*演算法與分支限界策略的比較
分支限界策略是為了剪掉不能達到優化解的分支,其關鍵是「界限」。a*演算法的核心是告訴我們在某些情況下,我們得到的解一定是最優解,於是演算法可以停止。a*演算法試圖盡早地發現優化解,經常使用best-first策略求解優化問題。
2. a*演算法的核心——代價函式
對於任意節點n, g(n) 表示從樹根到節點n的代價, h*(n)表示從n到目標節點的優化路徑的代價, f*(n) = g(n) + h*(n)即為節點n的總代價。那麼,我們如何得到h*(n)的值呢?一般採用一種合適的方法來估計h*(n),h(n)是對h*(n)的估計,把f(n) = g(n) + h(n) ≤ g(n) + h*(n) = f*(n)定義為n的代價。為了更好的理解a*演算法,我們以求解最短路徑為例來講述這種演算法思想。
3. 利用a*演算法求解最短路徑問題
3.1 問題定義
輸入:乙個帶權有向連通圖g(v,e),如下圖所示。
輸出:發現乙個從s到t的最短路徑。
3.2 求解步驟
step 1: 分別計算f(v1)=g(v1) + h(v1) = 4 、f(v2) = g(v2) + h(v2)=5、f(v3) = g(v3) + h(v3)=6;
step 2:根據step1可知進一步擴充套件v1,分別計算f(v2) = g(v2) + h(v2) = 7、f(v4) = g(v4) + h(v4)=5;
step 3:根據step2可知進一步擴充套件v4、v2,分別計算f(v5) = g(v5) + h(v5) = 10、 f(t) = g(t) + h(t) = 7、f(v4) = g(v4) + h(v4) = 6、f(v5) = g(v5) + h(v5) = 10;
step 4:根據step3可知進一步擴充套件v3、v4,分別計算f(v5) = g(v5) + h(v5) = 11、f(v5) = g(v5) + h(v5)=11、f(t) = g(t) + h(t) = 8;
step 5:根據上述步驟可知進一步擴充套件t,由於t為目標節點,則演算法終止,求得最優解。
圖形化展示過程如下:
4. 小結
通過求解最短路徑問題我們大概已經掌握了a*演算法思想的精髓。現對a*演算法進行簡單總結:a*演算法借助「best-first」策略搜尋樹;假定g(n)表示從根節點到節點n的代價,h*(n)表示節點n到目標節點的優化代價;對於任一節點n,都有h(n)≤h*(n);選擇f(n)小的節點進行分支;如果選擇的節點n為目標節點,則演算法終止,給出最優解。
全路徑搜尋策略
1 為了能重用已有dijkstrasearcher的一些函式,新增乙個類directedgraph繼承自igraph,重寫虛函式。directedgraph中有node類和edge類。node類需要std vectoraedge ids欄位,edge類需要unsigned snode id unsi...
搜尋演算法策略
為了簡化上述搜尋過程以及避免盲目搜尋,我們討論啟發式策略 同樣以八數碼為例 使用估價函式f的最佳優先搜尋 a演算法本質上就是在一般的樹式搜尋基礎上新增了估價函式的一種啟發式搜尋演算法 估價函式的作用僅僅是幫助確定結點的擴充套件,從而避免盲目搜尋 對a演算法增加限制 對任一節點x均有 h x h x ...
再說搜尋結果排序策略
很多平台 會開發自己的搜素,如果要排序維度越多排序的難度越大。因其所涉及的排序引數和考量因素會很複雜,但終究沒有理想排序的結果原因不是不知道引數 因素的是否完備,而是其數學建模的不合理性 img 這類很明顯看到的結果是發散的,因為搜素小吃的目標人群無法判定,可能有美食者 經營者 學習者 研究者等等,...