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算法回顾搜索的主要内容,如果未能解决你的问题,请参考以下文章