高级搜索

作者: 云莉6 | 来源:发表于2020-04-27 15:51 被阅读0次

    剪枝

    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)
    

    相关文章

      网友评论

        本文标题:高级搜索

        本文链接:https://www.haomeiwen.com/subject/pmtuwhtx.html