ACM算法回顾搜索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM算法回顾搜索相关的知识,希望对你有一定的参考价值。

  • 今天主要回顾一下几个搜索
    • DFS  ——Depth First Search
    • BFS  ——Breadth First Search
    • A* 
    • 迭代优先搜索

今天DFS和BFS的实现就不细讲了

我们先直接看A*算法的实现(python风格为主...带一点伪代码)

 1 def A_star_search
 2     q = PriorityQueue()
 3     #优先队列,顺便起到open表的作用
 4     q.put(qnode)
 5     came_from = {}
 6     #came_from为记录拓展过程的链表
 7     cost_so_far = {}
 8     #cost_so_far[p]为起点到节点p目前已知花费
 9     came_from[start_state] = None
10     cost_so_far[start_state] = 0
11 
12     while not q.empty():
13         cur_state = q.get()
14         if cur_state == goal_state:
15             break
16         #假设用邻接表存储,用边权矩阵原理类似
17         for nxt in G.neighbour(cur_state):
18             new_cost = cost_so_far[cur_state] + G.cost(cur_state, nxt)
19             if nxt not in cost_so_far or new_cost < cost_so_far[nxt]
20                 cost_so_far[nxt] = new_cost
21                 priority = new_cost + heuristic(goal_state, nxt)
22                 q.put(qnode(....including "priority", "nxt"))
23                 came_from[nxt] = cur_state
24 
25     return came_from, cost_so_far

 

核心思想在已知代价g的基础上引入估价函数h,由f=g+h确定搜索的顺序

无论是DFS还是BFS还是启发式搜索,关键在于,搜索中扩展顺序的确定

DFS和BFS都不在乎边权,而都是以层次为划分进行搜索,DFS的搜索顺序是深层节点优先,BFS的搜索顺序是同层节点优先

而A*搜索主要考虑边权和代价,由已知代价评估出“最有可能成为答案”的节点进行拓展

以上是关于ACM算法回顾搜索的主要内容,如果未能解决你的问题,请参考以下文章

从搜索文档中查找最小片段的算法?

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]

退役贴再见了ACM,再会了算法竞赛

退役贴再见了ACM,再会了算法竞赛

退役贴再见了ACM,再会了算法竞赛

繁凡的 ACM 退役记(一名普通算法竞赛选手与博主的竞赛生涯回忆录)凡是过往,皆为序章