啟發式搜尋
啟發式搜尋就是在狀態空間中的搜尋對每乙個搜尋的位置進行評估,得到最好的位置,再從這個位置進行搜尋直到目標。這樣可以省略大量無謂的搜尋路徑,提高了效率。在啟發式搜尋中,對位置的估價是十分重要的。採用了不同的估價可以有不同的效果。
在啟發式搜尋中,我們每次找到當前「最有希望是最短路徑」的狀態進行擴充套件。對於每個狀態的我們用函式f來估計它是否有希望。f包含兩個部分:
f = g + hg:就是普通寬度優先搜尋中的從起始狀態到當前狀態的代價,
h:是乙個估計的值,表示從當前狀態到目標狀態估計的代價。
h是由我們自己設計的,h函式設計的好壞決定了啟發式演算法的效率。h值越大,演算法執行越快。
但是在設計評估函式時,需要注意乙個很重要的性質:評估函式的值一定要小於等於實際當前狀態到目標狀態的代價。
否則雖然你的程式執行速度加快,但是可能在搜尋過程中漏掉了最優解。相對的,只要評估函式的值小於等於實際當前狀態到目標狀態的代價,就一定能找到最優解
f:評估值和狀態值的總和。
同時在啟發式搜尋中將原來的乙個佇列變成了兩個佇列:openlist和closelist。
在openlist中的狀態,其f值還可能發生變化。而在closelist中的狀態,其f值一定不會再發生改變。
整個搜尋解的流程變為:
計算初始狀態的f值,並將其加入openlist
從openlist中取出f值最小的狀態u,並將u加入closelist。若u為目標狀態,結束搜尋;
對u進行擴充套件,假設其擴充套件的狀態為v:若v未出現過,計算v的f值並加入openlist;若v在openlist中,更新v的f值,取較小的乙個;若v在closelist中,拋棄該狀態。
若openlist為空,結束搜尋。否則回到2。
利用這個方法可以避免搜尋一些明顯會遠離目標狀態的狀態,從而縮小搜尋空間,早一步搜尋到目標結果。
在啟發式搜尋中,最重要的是評估函式的選取,乙個好的評估函式能夠更快的趨近於目標狀態。
啟發式搜尋在某些情況下並不一定好用,一方面取決於評估函式的選取,另乙個方面由於在選取狀態時也會有額外的開銷。而快速趨近目標結果所減少的時間,能否彌補這一部分開銷也是非常關鍵的。
所以根據題目選取合適的搜尋方法才是最重要的。
問題:八數碼求解的步數
偽**:
search(status):原始碼:start.status =status
start.g = 0
//實際步數
start.h =evaluate(start.status)
start.f = start.g +start.h
openlist.insert(start)
while (!openlist.isempty())
u =openlist.getminfstatus()
closelist.insert(u)
for v
isu.neighborstatus
if (v
inopenlist) then
//更新v的f值
if (v.f > v.h + u.g + 1
) then
v.f = v.h + u.g + 1
end if
else if (v
incloselist)
continue
else
v.g = u.g + 1
v.h =evaluate(v.status)
v.f = v.g +v.h
openlist.insert(v)
end if
end for
end while
#include #includeview code#include
#include
#include
#include
using
namespace
std;
struct
node
};node start;
int hash[15]; //
hash[i] 存 i! 1~9
int pos[2]= ,,,,,,,,}; //
0~8 的目標位置的座標
int to[4][2]=;
bool vis[500000
];
//判斷不可能的狀況
bool
check()
} }
if(cnt%2
)
return
false
;
return
true
; }
//康托
intsolve(node a)
ans = ans+hash[i*3+j]*cnt;
} }
return
ans;
} //
得到 h值 ,曼哈頓距離之和
intget_h(node a)
} return
ans;
}int
bfs()
} } int
main()}}
if(!check())
else cout
} return
0;
}
啟發式搜尋
啟發式搜尋 heuristically search 又稱為有資訊搜尋 informed search 它是利用問題擁有的啟發資訊來引導搜尋,達到減少搜尋範圍 降低問題複雜度的目的,這種利用啟發資訊的搜尋過程稱為啟發式搜尋。例題 八數碼問題 運用優先佇列,根據目前已經確定的位置算出目前的價值,並匯入...
ACM 啟發式搜尋
開篇 這篇文章介紹找最短路徑的一種演算法,它的字我比較喜歡 啟發式搜尋。這是用一般的搜素方法,類似窮舉的效果 下面的圖是用a 搜素的效果,也就是本文要介紹的演算法。可以看出,用a 演算法減少了許多計算量,它的效率有了顯著的提高。下面將為你解答上圖中的演算法是如何實現的。正文 搜尋區域介紹 圖中左邊的...
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 ...