搜尋演算法 Search

2021-07-13 01:57:03 字數 1707 閱讀 1516

1. 概述:

搜尋演算法是利用計算機的效能優勢來有目的的列舉乙個問題解空間的部分或所有的可能情況,從而求出問題的解的一種方法。在問題求解過程中,人們所面臨的大多數現實問題往往沒有確定性的演算法,需要通過搜尋演算法來解決。

搜尋問題一般只需要考慮兩個基本問題:

1、使用合適的狀態空間來表示問題。

2、測試該狀態空間中目標狀態是否會出現

乙個問題的基本資訊由4部分組成

1、初始狀態集合—–>定義了問題的初始狀態

2、操作符集合—–>把乙個問題從乙個狀態轉換到另乙個狀態的動作集合

3、目標檢測函式—->用來確定乙個狀態是不是目標

4、路徑費用函式—->對每條路徑賦予一定費用的函式

其中,初始狀態集合和操作符集合定義了問題的搜尋空間

搜尋演算法的兩個重要問題

搜尋什麼和在**搜尋

因此搜尋可以被分為兩個階段:狀態空間的生成階段和在該狀態空間中對所求問題的狀態的搜尋

搜尋可以分為啟發式搜尋和盲目搜尋

2. 盲目搜尋:

一般是指從當前狀態到目標狀態需要走多少步或者每條路徑的花費並不知道,按照預定的搜尋策略進行搜尋,終止於目標狀態,由於這種狀態沒有考慮到問題本身的特性,具有很大的盲目性,效率不高。需要提高盲目搜尋的效率就需要尋找合理的搜尋策略,該邊搜尋順序

常用的盲目搜尋有:深度優先搜搜(dfs)、廣度優先搜尋(bfs)

1、深度優先搜尋dfs

深度優先搜尋沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支

當節點v的所有邊都已經被搜尋過,將回溯到發現節點v的那條邊的起始節點

這一過程一直進行到已發現從源節點可達的所有節點為止。

如果還存在未被發現的節點,則選擇其中乙個作為源節點並重複上述過程

是一種典型的盲目搜尋,如果不進行優化,dfs效率很低,一般要根據題意進行剪枝

dfs實現時一般用到遞迴,使用系統堆疊

void dfs(int v)

}

2、廣度優先搜尋bfs

是從任意節點v開始,一次搜尋其可以擴充套件的每乙個節點v1,v2。。。

當一層節點全部搜尋完之後,再依次搜尋第乙個可擴充套件節點的所有節點

知道所有節點均被訪問,演算法終止。

bfs和樹的層序遍歷很像,搜尋順序具有明顯的層次性,一般用佇列實現

注意:先訪問頂點,再把頂點入隊,訪問完該頂點的所有鄰接頂點時,再出第一次訪問的節點,接下來就是重複上述步驟

void bfs(int v)

w = nextadj(v); //求下乙個鄰接點,無鄰接點時返回-1 }}

}

bfs常用於解決最優可行解的問題,類似最小步數、最短步數等

3. 啟發式搜尋:

是在搜尋過程中加入了與問題有關的啟發式資訊,用於指導搜尋朝著最有希望的方向進行,掃除不必要的搜尋過程,加速問題求解並得到最優解。

由於啟發式資訊根據問題不同而異,因此需要分析問題的條件,尋找可以改變搜尋順序和剪枝的條件

A 搜尋演算法

啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...

A 搜尋演算法

a 演算法是基於bfs的一種入門級啟發式搜尋演算法,就是將bfs的佇列改為基於估價的優先佇列,可以快速地找到答案。優先隊列為小根堆 while 優先佇列不為空 取出隊頭並擴充套件 將擴充套件節點以估價值 當前值為優先順序入隊 endwhile估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...

搜尋演算法小結

搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題的部分和所有的可能情況,從而求出問題的解的一種方法。常用的搜尋演算法有 一.回溯法 回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種 走不通就掉頭 思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最...