1. 程式人生 > 實用技巧 >[AI]A*演算法

[AI]A*演算法

A*演算法及其變種

一、A*演算法原理

相比貪婪最優搜尋的 f ( n ) = h ( n ) f(n)=h(n) f(n)=h(n)注重當前節點到目標節點的距離h(n),A*演算法還注重當前節點到初始節點的距離g(n),用公式表示為:

f ( n ) = g ( n ) + h ( n ) f(n) = g(n) + h(n) f(n)=g(n)+h(n)
這公式看著可太枯燥了,用個簡單圖的表達就是:

在這裡插入圖片描述
A*演算法每次擴充套件f(n)最小的節點。

二、做個例題吧~

著名的Romania地圖,以Bucharest為目標,Arad為起點:
在這裡插入圖片描述
在這裡插入圖片描述

  • 初始狀態, 366表示點Arad到目標Bucharest的距離,0表示Arad到初始節點Arad它本身的距離:
    在這裡插入圖片描述
  • 然後擴充套件Arad,接著判斷Sibiu, Timisoara和Zerind的 f(n),發現 f(Sibiu)最小,其中g(Sibiu)=140表示 Arad到Sibiu的距離,h(Sibiu)=253表示Sibiu到目標Bucharest的距離:

在這裡插入圖片描述

  • 擴充套件Sibiu,然後繼續判斷 f(Rimnica Vakea) 最小:
    在這裡插入圖片描述
  • 繼續遵循 f(n)最小的原則去擴充套件節點。此時,f(Petisti) = 417不是最小了!因為之前的 f(Fagaras) = 415最小!這時候就要返回來擴充套件 Fagaras 節點:

在這裡插入圖片描述

  • 回來擴充套件 Fagaras,此時我們已經找到了目標節點 Bucharest,但是!此時的 f(Bucharest)=450,當前最小的 f 是 f(Pitesti) = 417,那就再回來擴充套件 Pitesti節點:
    在這裡插入圖片描述
  • 最後找到 f(Bucharest) = 418,則為最終最優解:
    在這裡插入圖片描述
    這時候,找到的解也是最優的!

三、A*演算法的最優性

保證最優性的兩個條件:

  • 可採納啟發式 Admissible Heuristic
  • 一致性啟發式 Consistent Heuristic

1.可採納啟發式 Admissible Heuristic

這個是說,可採納啟發式不會高估到達目標的距離,f(n)永遠不會超過實際解的距離。

我個人覺得,就是說,A*每次找的路徑,都不超過實際到達解的距離,因為他每次找的 f(n)都是最小的,所以他每次找的路徑都是近路,他不會繞遠路去找解。

2.一致性啟發式 Consistent Heuristic

是說,對於節點 n 和通過任一行動 a 生成的每個 n 的後繼節點 n’,從節點 n 到達目標的代價都不大於從 n 到 n’ 的單步代價與從 n’ 到達目標的代價之和,公式為:
h ( n ) ≤ c ( n , a , n ′ ) + h ( n ′ ) h(n) \le c(n,a,n')+h(n') h(n)c(n,a,n)+h(n)

說人話就是,,,,懶得寫了,直接看知乎大佬的解釋吧:
在這裡插入圖片描述

四、A*演算法的效能

A*演算法可以找到最優解,其他的,,看下圖吧:
在這裡插入圖片描述

五、IDA演算法 Iterative-Deepening A

A*演算法的一個缺點在於,他需要儲存所有處在候選區域的節點資訊,這些資訊是呈指數級增長的,這會極大的佔用記憶體。

如果你對迭代深度有所疑問,請移步迭代深度搜索 Iterative Deepening Search

IDA是指,採用迭代深度A演算法,即設定一個限制,每次限制迭代增大, IDA*所用的截斷值是 f(g+h).每次迭代,截斷值取上一次迭代截斷值得節點中最小的 f 代價值。
IDA*的一些點

六、遞迴最佳優先搜尋 RBFS

原理和貪婪最佳優先搜尋差不多,只不過用的是線性儲存空間。
在這裡插入圖片描述

下圖是一些詳細資訊,太長了,我實在不想打字了55555:
在這裡插入圖片描述

七、SMA*

我先簡單貼點圖,等我有時間了再回來更。。。

1. SMA*原理

在這裡插入圖片描述
在這裡插入圖片描述

2.SMA*演算法效能

在這裡插入圖片描述

3.SMA*演算法的使用

在這裡插入圖片描述

各位看官老爺,一鍵三連再走吧~再不濟點個贊也行啊~~