A 演算法 啟發式的廣度優先搜尋

2021-06-27 17:55:42 字數 2262 閱讀 3720

一.a*演算法

a*演算法與普通的bfs不同的點在於,bfs始終是以當前節點到初始節點的距離為基準,每次都選取較小值進行擴充套件。而a*演算法則是通過乙個估價函式f(x) = g(x) + h(x),每次都已這個值為基準,選取較小的值進行擴充套件。

二.估價函式

f(x) = g(x) + h(x)

f(x)是我們最後估計出來的值,不是真實值,這個值越**明我們從當前狀態進行擴充套件就會更快地到達目標狀態

g(x)是當前節點到初始節點的距離,也就是bfs中的那個值,這個值是真實值,是我們通過一步一步擴充套件出來的值

h(x)是從當前節點到目標節點的距離(估計值),這個我們通過預估可以幫助我們在選擇下一步擴充套件的節點的時候有乙個偏向,會讓我們更加偏向於更快地更直接地找到目標節點

從這個式子當中我們可以看出,普通的bfs也是a*演算法的一種,他的h(x) = 0.

三.估價函式的影響

設h(x)為我們的估計函式,h'(x)為實際從當前節點到目標節點的值。

如果滿足h(x) < h'(x)的話,我們的搜尋範圍大,效率慢,但是一定能找到最優解法。bfs的估價函式是0,永遠都小於h'(x),但是由於這個估價函式太小,所以沒有任何指導作用。所以很慢。

如果滿足h(x) = h'(x)的話,我們的搜尋過程會按照最優解的路徑來走,這時我們一定能找到最優解,而且搜尋效率是最高的。當兩個函式永遠相等的時候我們可以發現我們的搜尋變成了具有準確性的搜尋,而不再是具有某一偏向的搜尋,他會直接指示我們找到答案,當然這也只是最理想狀態,如果我們知道這個函式之後就能直接推理出答案。

如果滿足h(x) <= h'(x)的話,某些情況下效率要比單純小於快很多。

如果滿足h(x) > h'(x)的話,這時搜尋範圍很小,效率非常高, 但是最後的結果不一定能找到最有解。

h(x)相當於對於我們的決策提供了有價值的資訊,當我們掌握一部分資訊的時候(《的情況),可以一定程度上幫助我們找到最優解,當我們準確地掌握所有資訊的時候(=的情況),我們就可以很準卻地推理出來最優的解。當我們準確地掌握了一些資訊的時候,還掌握了一些錯誤的資訊(>的情況),這就導致我們可能會做出錯誤的決定(認為搜尋出來的解始終為最優解),但是有一點是肯定的,不管我們獲得的資訊當中有無錯誤資訊,資訊越多我們作出決策就越快。這也就是為什麼a*比較快。所以演算法的重點全部都再估價函式當中。

四.常用估價函式

常用圖搜尋的估價函式,曼哈頓距離(常用),使用代價常數修正的歐幾里得距離,對角距離(先通過乙個對角線移動到和目標點在同一條平行於座標軸的直線,再進行歐幾里得距離)。

五.例題說明

解題思路:這裡的估價函式為:

1.當前狀態下不在本位的數字數量

2 1 3

4 5 6

7 8這時不在本位的數量為2

2.當前狀態下每乙個數字當前位置距離原本位置的曼哈頓距離的和

8 2 3

4 5 6

7 1這是h(x) = 3 + 3 = 6

其中第二個估價函式更加好,應為對於估價函式來說每乙個狀態都對應這乙個估價函式值,那麼相當於你把所有的狀態雜湊在了這個函式的值域當中,首先第乙個函式的值域較小,第二個函式的值域較大,雜湊更加充分,說明在第乙個函式那裡狀態a和狀態b的函式值相等,表示提供了相等的資訊量,而在第二個函式的時候,a比b的資訊量可能更高。也就是對於同乙個估價函式值來說,裡面包含的狀態中最後解的差異的個數越小越好。

上**,如果上面那一段話不懂的話可能就是我表述不太好。。。。。

我這裡用十進位制進行了壓縮,有點開腦洞。。也有人用康托展開進行雜湊,個人感覺也不錯。

#include#include#include#include#includeusing namespace std;

struct node

node(int ss, int iidx, string sseq)

};int pp[10] = ;

mapans;

string put[4] = ;

int dir[9][4] = ,,,,,,,,};

int geta(int s, int idx)

int change(int s, int a, int b)

void bfs()}}

}char ac[100];

int main()*/

while(gets(ac))

if(ac[i] == 'x')

}if(ans[s] == "yes")

else if(ans[s] == "")

else

printf("\n");}}

return 0;

}

A 演算法(啟發式搜尋)

a 演算法,a a star 演算法是一種靜態路網中求解最短路徑最有效的直接搜尋方法,也是解決許多搜尋問題的有效演算法。演算法中的距離估算值與實際值越接近,最終搜尋速度越快。別稱 啟發式搜尋 表示式 f n g n h n f n g n h n f n g n h n 公式表示為 f n g n ...

啟發式搜尋

啟發式搜尋 heuristically search 又稱為有資訊搜尋 informed search 它是利用問題擁有的啟發資訊來引導搜尋,達到減少搜尋範圍 降低問題複雜度的目的,這種利用啟發資訊的搜尋過程稱為啟發式搜尋。例題 八數碼問題 運用優先佇列,根據目前已經確定的位置算出目前的價值,並匯入...

啟發式搜尋

啟發式搜尋 啟發式搜尋就是在狀態空間中的搜尋對每乙個搜尋的位置進行評估,得到最好的位置,再從這個位置進行搜尋直到目標。這樣可以省略大量無謂的搜尋路徑,提高了效率。在啟發式搜尋中,對位置的估價是十分重要的。採用了不同的估價可以有不同的效果。在啟發式搜尋中,我們每次找到當前 最有希望是最短路徑 的狀態進...