a* 演算法是基於bfs的一種入門級啟發式搜尋演算法,就是將bfs的佇列改為基於估價的優先佇列,可以快速地找到答案。
/
/優先隊列為小根堆
while 優先佇列不為空
取出隊頭並擴充套件
將擴充套件節點以估價值+當前值為優先順序入隊
endwhile
估價函式越接近真實值演算法越優,但一定不能大於真實值,否則可能會一直進入錯誤的迭代而得到錯誤的答案(即真正可以迭代出答案的節點可能被一直壓在優先佇列中無法取出)。
特別的,當估價函式恒為0時,a* 演算法與普通的優先佇列優化bfs無異。
這裡使用a* 求k短路,但不是最優方法,因為a* 會擴充套件出很多無用節點。
/
/優先隊列為小根堆,以第二個成員變數為優先順序
//c[x]為x到所求節點的最短路
//w[x,y]為從x到y的邊權
while 優先佇列不為空
取出隊頭節點
cnt[x]+
+if x是所求節點 then
if cnt[x] =
= k then
返回 d
endifend
iffor y與x相連
if cnt[y] =
= k then
continue
endif
新建節點
節點入隊
next y
endwhile
洛谷p2483 【模板】k短路([sdoi2010]魔法豬學院)
這道題a會被卡第11個點的空間,a可得92分(共12個時間點)。
這道題需在程式中計算出k的最大值
m ax
=e/c
[1
]max \left \ = e/c[1]
max=e/
c[1]
c[1]是從第乙個元素到第n個元素的最短路。
每次求出第i短路時將e減去該短路長度,若某次取出節點的已求得的路徑長度大於e則演算法返回。
A 搜尋演算法
啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...
搜尋演算法小結
搜尋演算法是利用計算機的高效能來有目的的窮舉乙個問題的部分和所有的可能情況,從而求出問題的解的一種方法。常用的搜尋演算法有 一.回溯法 回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種 走不通就掉頭 思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最...
爬山搜尋演算法
1.爬山法 hill climbing 爬山法是向值增加的方向持續移動到簡單迴圈過程,演算法在到達乙個 峰頂 時終止,此時相鄰狀態中沒有比該 峰頂 更高的值。爬山法不維護搜尋樹,當前節點只需要記錄當前狀態及其目標函式值 爬山法不會前瞻與當前狀態不直接相鄰的狀態的值 就像健忘的人在大霧中試圖登頂珠峰一...