目录
1. 问题
考虑下面这个问题:
我们要找到从Arad到Bucharest的路,最好是最短的路:
2. 算法
这是一个无向有环图,
可以采用最佳优先搜索:
最佳优先搜索的算法可以参考维基百科:
伪代码如下:
// Pseudocode for Best First Search
Best-First-Search(Graph g, Node start)
1) Create an empty PriorityQueue
PriorityQueue pq;
2) Insert "start" in pq.
pq.insert(start)
3) Until PriorityQueue is empty
u = PriorityQueue.DeleteMin
If u is the goal
Exit
Else
Foreach neighbor v of u
If v "Unvisited"
Mark v "Visited"
pq.insert(v)
Mark u "Examined"
End procedure
如果你熟悉广度优先搜索,那么上面的代码也没什么难度。
该算法最关键的点是如何构造优先队列中的“优先”策略,一种简单的办法就是选取当前所有访问点中最近的相邻点:
procedure GBS(start, target) is:
mark start as visited
add start to queue
while queue is not empty do:
current_node ← vertex of queue with min distance to target
remove current_node from queue
foreach neighbor n of current_node do:
if n not in visited then:
if n is target:
return n
else:
mark n as visited
add n to queue
return failure
显然上面的BFS是一种贪婪算法,每