一. 搜索算法介紹
1. 暴力窮舉的思想
2. 搜索是一種通用的解決問題的手段,但復雜度往往較高
二. 基本搜索算法
DFS 與 BFS
三. 優化
1. 爬山法
思想:(局部優化的貪心法 + DFS)
在深度優先搜索過程中, 我們經常遇到多個節點可以擴展的情況, 爬山策略使用貪心方法確定搜索的方向 , 使用啟發式測度來排序節點擴展的順序。
a. 定義啟發式函數:對DFS下一次擴展出的結點,(f(結點) = 到目標的估計距離)
b. 在深度優先擴展結點時,將結點按啟發式函數從大到小壓入棧
2. Best-first
思想:(全局優化的貪心 + DFS + BFS)
best-first策略結合深度搜索和廣度搜索的優點,根據一個評價函數,在目前產生的所有節點中選擇具有最小評價函數值的節點來進一步擴展。
a. 評價函數:對所有的結點,(f(結點) = 到目標的估計距離)
b. 根據評價函數構造小頂堆,每次取出堆頂元素進行擴展
3. 分支界限法
注:爬山法和Best-first解決可行解的問題 ,分支界限解決優化解的問題
思想:(可行解 + 剪枝策略 ~> 優化解)
a.設計產生分支(得到問題上界)的機制
b. 剪枝縮小問題規模
分支限界法通過發現優化解的一個界限來縮小解空間,從而提高求解效率。
四. 應用
1. 8-puzzle 問題
- 問題定義
- 如何轉化成圖上的搜索問題
每個狀態看作一個結點,狀態的變化看作一條邊
- 算法設計:只需找到從輸入結點到輸出結點的路徑即可
(1)爬山法
a. 設每個結點的啟發式函數為與目標結點對比錯誤的方塊數
b. 在深度優先擴展結點時,將結點按啟發式函數從大到小壓入棧即可。
(2)Best-first
a. 設每個結點的啟發式函數為與目標結點對比錯誤的方塊數
b. 將結點構建成最小堆,每次取出堆頂元素進行擴展
2. 布爾表達式問題
- 問題定義:
– 輸入: n個布爾變量x1,x2, …., xn 關於x1,x2, …., xn的k個析取布爾式
– 輸出: 是否存在一個x1,x2, …., xn的一種賦值 使得所有k個布爾析取式皆為真
- 如何轉化成圖上的搜索問題
將T/F的問題轉化為二叉樹
- 算法設計
(1)爬山法/Best-first:
a. 設啟發式函數/評價函數為:如果該結點對應的布爾表達式存在假值(f = 0),否則(f = 布爾表達式正確的個數)
3. 哈密頓環問題
- 問題定義
–輸入: 具有n個節點的連通圖G=(V, E)
– 輸出: G中是否具有Hamiltonian環
- 如何轉化成圖的搜索問題
將任意一個頂點作為根節點,不斷擴展與他連通結點構造樹
- 算法設計
(1)爬山法/Best-first
設啟發式函數/評價函數為:根結點到該結點的距離
4. 子集合和的問題
- 問題定義
輸入: S={7, 5, 1, 2, 10}
輸出: 是否存在子集S ’ , 使得Sum(S ’ )=9
- 算法設計
(1)動態規划:更適合解最優化的問題(例如:子集合和最大的問題)
(2)搜索算法:通用、解決存在性問題更合適
綜上選擇搜索算法
- 如何轉化成圖的搜索問題
---只展示了一個分支
- 啟發式函數/評價函數:9 - 當前結點和
5. 多階段圖問題(分支界限)
- 問題定義
- 問題樹表示
- 算法設計
最優解的設計方案--選擇分支界限的方式
a. 使用爬山法得到問題的一個上界
b. 剪枝,縮小解空間
五. 拓展
本篇主要介紹幾種搜索的思想,關於分支界限的應用、A*算法將在下一篇中詳述