前置知識
定義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),越接近,算法越佳。
例子說明