狀態空間的盲目搜索
根據狀態空間所採用的數據結構的不同,可分爲圖搜索算法和樹搜索算法。由於圖搜索算法且一般問題都可用樹搜索算法解決,於是主要討論樹搜索算法,包括一般和代價樹。
一般樹的盲目搜索主要包括深度優先和廣度優先兩種搜索算法。
廣度優先算法
也稱爲寬度優先算法,是一種先生成的節點先擴展的策略。
算法精髓:從初始節點$S_0$
開始逐層向下擴展,在第n
層還沒有完全搜索完之前不會進入第n+1
層的搜索。Open
表中的節點總是按進入的先後排序,先進入的節點排在前面。
算法描述:
- 把初始節點
$S_0$
放入Open
表中 - 如果
Open
表爲空,則問題無解,失敗退出 - 把
Open
表的第一個節點取出,放入Closed
表,並記該節點爲n
- 考察節點
n
是否爲目標節點,若是,則得到問題的解,成功退出 - 若節點
n
不可擴展,則轉第二步 - 擴展節點
n
,將其子節點放入Open
表的尾部,並未每一個子節點設置指向父節點的指針,然後轉到第二步。
總結
廣度優先搜索是一種完備策略,即只要問題有解,算法就一定可以找到解。並且,廣度優先算法找到的解還一定是路徑最短的解。
缺點是盲目性較大,特別是當目標節點與初始節點距離較遠時,將產生許多無用的節點,效率較低。
深度優先算法
算法步驟基本與廣度優先算法相同,只是Open
表中的排序不同,在深度優先算法中,後進入Open表的節點總是排在最前面。即後生成的節點先擴展。
總結
深度優先算法是一種非完備策略,即某些本身有解的問題,該算法可能找不到最優解,甚至找不到解。常見做法是增加一個深度限制,當達到一定深度時,停止深度搜索,轉向寬度搜索。這種算法也叫有界深度優先算法。