A*算法的有關知識--例子:最短路徑問題


前置知識

        定義1,g(n)=從樹根到節點n的代價。當算法處理到某個節點時,g(n)是可以精確計算的。

        定義2,h*(n)=從節點n到目標節點的優化路徑的代價。一般不可知。

        定義3,f*(n)=g(n) + h*(n)是包含節點n的路徑的最小代價。一般不可知。

        定義4,h(n)=從節點n到目標節點的優化路徑的估計代價。

        定義5,f(n)=g(n) + h(n)是包含節點n的路徑的估計最小代價。

        假設,對於任意的節點n而言,已知h*(n),可以構建出一個算法直接找到最優解,即處理每一次選擇時,都選擇f*(n)代價最小的節點。但是,對於任意一個算法而言,h*(n)不可知,我們只能夠估計h*(n)的值,這也是爬山法和Best-Frist算法中評價函數或啟發式函數的作用。

算法本質

        A*算法保證所估計h*(n)的值h(n)滿足:h(n) ≤ h*(n)。

        一旦滿足這個條件,當使用使用Best-first策略搜索時,如果該方法選中的節點是目標節點,那么該節點表示的解就是當前問題的最優解。

       定理1,使用Best-first策略搜索,且滿足h(n) ≤ h*(n),如果算法選擇的節點是目標節點, 則該節點表示的解是優化解。

       證明1:只需要證明,f*(t)是最優解代價即可,n為此時可以進行擴展的所有節點,即f*(t){f*(n)}中的最小值

  • 由於節點t是目標節點,所以h*(t) = h(t) = 0,f(t) = f*(t) = g(t)。
  • 假設:{f*(n)}中的最小值為M,M∈{f*(n)}。
  • 由於 f*(t)∈{f*(n)},故而,f(t) ≥ M。
  • 由於此時算法選擇的節點是節點t,即在當前可以擴展的節點中,t是估計總代價最小的那一個,故而 f(t) ≤ f(n) ,而對於所有當前可以擴展的節點n而言,由於h(n) ≤ h*(n),所以 f(n) ≤ f*(n),而{f*(n)}中的最小值為M,f(t) ≤ M。
  • 由 f(t) ≥ M 以及 f(t) ≤ M 可知,f(t) = M。

算法拓展

       可以將A*算法的h(n)作兩種極端情況的考慮。

  • 對於任意的節點n,h(n) = 0,此時算法退化,每一次進行選擇時,選擇當前g(n)最小也就是當前路徑長度最小的點。
  • 對於任意的節點n,h*(n) = 0,正如本文之前提到的,直接可以選擇得到,不會走其他路徑。

       由此,可以明確的是,盡量使得h(n)接近h*(n),越接近,算法越佳。

例子說明


 


 


 


 

 

 


 


 


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM