剪枝
Alpha-beta 剪枝是一种搜索算法,用以减少极小化极大算法(Minimax 算法)搜索树的节点数。这是一种对抗性搜索算法,主要应用于机器游玩的二人游戏(如井字棋、象棋、围棋)。当算法评估出其策略的后续走法比之前策略还差时,就会停止计算该策略的后续发展。该算法和极小化极大算法所得结论相同,但剪去了不影响最终决定的分枝。
双向 BFS
从 begin -> end 遍历和从 end -> begin同时进行,当待遍历的队列哪个短先遍历哪个。结束条件是,双向BFS遍历碰头。
启发式搜索
启发式函数:h(n),它用来评价哪些结点最有希望是我们要找的结点。h(n) 会返回一个非负实数,也可以认为是从结点 n 的目标结点路径的估计成本。
启发式函数是一种告知搜索方向的方法。它提供了一种明智的方法来猜测哪个邻居 结点会导向一个目标。
A*搜索算法
A* 搜索算法(A* search algorithm)是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或网络游戏的BOT的移动计算上。
该算法综合了最良优先搜索和Dijkstra算法的优点:在进行启发式搜索提高算法效率的同时,可以保证找到一条最优路径(基于评估函数)。
在此算法中,如果以 g(n) 表示从起点到任意顶点 n 的实际距离, h(n) 表示任意顶点 n 到目标顶点的估算距离(根据所采用的评估函数的不同而变化),那么A* 算法的估算函数为:
f(n) = g(n) + h(n)}
这个公式遵循以下特性:
- 如果 g(n) 为0,即只计算任意顶点 n 到目标的评估函数 h(n),而不计算起点到顶点 n的距离,则算法转化为使用贪心策略的最良优先搜索,速度最快,但可能得不出最优解;
- 如果 h(n) 不大于顶点 n 到目标顶点的实际距离,则一定可以求出最优解,而且 h(n) 越小,需要计算的节点越多,算法效率越低,常见的评估函数有——欧几里得距离、曼哈顿距离、切比雪夫距离;
- 如果 h(n) 为0,即只需求出起点到任意顶点 n 的最短路径 g(n),而不计算任何评估函数 h(n),则转化为单源最短路径问题,即Dijkstra算法,此时需要计算最多的顶点;
A*代码模板
def AstarSearch(graph, start, end):
pq = collections.priority_queue() # 优先级 —> 估价函数
pq.append([start])
visited.add(start)
while pq:
node = pq.pop() # can we add more intelligence here ?
visited.add(node)
process(node)
nodes = generate_related_nodes(node)
unvisited = [node for node in nodes if node not in visited]
pq.push(unvisited)
网友评论