云莉的技术专题

高级搜索

2020-04-27  本文已影响0人  云莉6

剪枝

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)}

这个公式遵循以下特性:

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)
上一篇下一篇

猜你喜欢

热点阅读