廣度優先演算法 最佳優先演算法 A 演算法尋路程式

2021-08-20 21:14:04 字數 1976 閱讀 7951

廣度優先演算法、最佳優先演算法、a*演算法尋路程式(c++)

廣度優先演算法、最佳優先演算法以及a*演算法原理上是比較相似的,均是通過佇列來尋找合適的路徑。breadthfs與bestfs是a*的特例,區別在於代價值f(n)的計算。

breadthfs(廣度優先演算法):

佇列結點及地圖的設計:

struct qnode

;

struct map

;

佇列的設計:

class queue

;

演算法:

1.  初始化地圖訪問量visit,並將起點加入佇列(x,y為起點座標,g=0,past=null,next=null),置起點visit為1;

2.  迴圈以下3,4步,直到search為空或search座標為終點座標;

3.  搜尋佇列search結點的相鄰結點,如果未訪問過且不是障礙,則將其插入佇列,置visit為1,past為search,g=search->g+k * 1/sqrt(2)(k為地形屬性,沼澤為2.5,草地為1,走直線則*1,走對角則*sqrt(2)),插入佇列中最後乙個p->g > g的結點後;

4.  search向後移動乙個結點;

5.  p=search,通過past向前迴圈,刪除past之後的結點直到p,令p=past,不斷重複過程直到p=起點(即head);

6.  剩餘佇列及為路徑。

bestfs(最佳優先演算法):

主要運用貪心演算法的思想,優先搜尋離終點近的點。

佇列結點的設計與breadthfs相似,只是將g(到起點距離)換為了h(到終點距離):

struct qnode

;

演算法也與breadthfs相同,將第三步計算統計量g改為計算h,通過h的值插入結點。

a*演算法:

結合了上述兩種方法,在演算法第三步,令f = h + g,通過f的值插入結點。

綜上我們可以定義乙個佇列用於三種演算法,結點定義如下:

struct qnode

;

演算法同上,將第三步更改如下:

3.  搜尋佇列search結點的相鄰結點,如果未訪問過且不是障礙,則將其插入佇列,置visit為1,past為search,g=search->g+k * 1/sqrt(2)(k為地形屬性,沼澤為2.5,草地為1,走直線則*1,走對角則*sqrt(2)),h=abs(x-end_x) + abs(y-end_y),如果為breadthfs,則f=g,如果為bestfs,則f=h,如果為a*,則f=g+h,插入佇列中最後乙個f (p)> g的結點後。

乙個用三種演算法尋路的程式,版本vs2015,語言c++,截圖如下:

廣度優先演算法(迷宮為自繪):

最佳優先演算法:

a*演算法尋路程式:

演算法 廣度優先演算法和深度優先演算法

廣度 bfs 和深度 dfs 優先演算法這倆個演算法是圖論裡面非常重要的兩個遍歷的方法。下面乙個例子迷宮計算,如下圖 解釋 所謂廣度,就是一層一層的,向下遍歷,層層堵截,看下面這幅圖,我們如果要是廣度優先遍歷的話,我們的結果是v1 v2 v3 v4 v5 v6 v7 v8。廣度優先搜尋的思想 訪問頂...

深度優先演算法和廣度優先演算法

圖形的深度優先搜尋法 void dfs int current 主程式 建立圖形後,將遍歷內容印出.void main 邊線陣列 int i for i 1 i 8 i creategraph node,20 建立圖形 printf 圖形的鄰接鍊錶內容 n for i 1 i 8 i printf ...

廣度優先演算法,深度優先演算法和DijKstra演算法

我們經常會碰到最短路徑問題,而最短路徑問題的解決方法多種多樣,廣度優先搜尋 bfs 深度優先搜尋 dfs 和dijkstra演算法貌似都能解決這個問題,這裡就簡單介紹一下這些演算法,分析一下它們的適用範圍。一 原理剖析 1 廣度優先搜尋 bfs 廣度優先搜尋依賴的是佇列解決問題。佇列中的每乙個節點需...