笔试算法题(48):简介 - A*搜索算法(A Star Search Algorithm)
A*搜索算法(A Star Search Algorithm)
A*算法主要用于在二维平面上寻找两个点之间的最短路径。在从起始点到目标点的过程中有很多个状态空间,DFS和BFS没有任何启发策略所以穷举所有的状 态空间,不适合仅需对局部进行搜索的应用。启发式搜索的关键在于:当前节点在选择下一步节点的时候,可以通过一个启发函数进行选择,选择到达终点代价最小 的节点作为下一步节点。A*的启发函数构造为:
f(n)=g(n)+h(n)
f(n)是可选的下一个节点的代 价,g(n)表示从start点到n点的代价,h(n)表示从n点到end点的代价;但是h(n)是无法预知的,(如果将BFS看作一种A*的话,其 h(n)恒定为0,g(n)表示到起始点的层数)所以A*算法将当n点到end点的直线距离作为h(n)的估值,显然只能无限接近实际最优解。
A*算法维护两张表OPEN和CLOSED,OPEN保存所有可探测但是还没有访问的节点,CLOSED保存素有已经访问的节点;启发函数就当前在 OPEN表中的节点进行排序,按照代价从低到高排列,每次选择代价最小的节点进行访问;当前访问的节点会根据簿记信息更新代价信息,并且将其直接连接的子 节点访问OPEN表中,最后将当前节点放入CLOSED表;A*算法开始于将start点放入OPEN表,结束于找到end点,或者OPEN表为 空,CLOSED表已经包含所有可访问节点。
程序实现中g(n)表示在抽象的状态空间中start点到n点的深度,h(n)表示在实际地图中n点所在地图位置到end点地图位置的直线距离,伪代码如下:
function A*(start,goal)
closedset := the empty set
// closedset存储已经访问过的节点
openset := {start}
//openset存储已经探测到但还未访问的节点,初始化时放入start点
came_from := the empty map
//came_from存储最短路径 g_score[start] :=
//g_score[u]存储当前当u点到start点的最小代价
h_score[start] := heuristic_cost_estimate(start, goal)
//h_score[u]存储当前u点到goal点的最小代价
f_score[start] := g_score[start] + h_score[start]
//f_score[u]存储当前u点在整个状态空间中的代价 while openset is not empty
current := the node in openset having the lowest f_score[] value
//从当前openset中选取具有最小f_score的节点current
if current = goal
return reconstruct_path(came_from, came_from[goal])
//判定如果是goal点,则结束
remove current from openset
add current to closedset
//判定如果不是goal点,则将current点从openset中移到closedset
for each neighbor in neighbor_nodes(current)
//遍历current直接相连的节点neighbor
//如果neighbor已经处理过一次(在closedset中),则跳过
if neighbor in closedset
continue
tentative_g_score := g_score[current] + dist_between(current,neighbor)
//利用当前current点的g_score重新计算neighbor的g_score
if neighbor not in openset
//如果neighbor是新探测到的节点(没有在openset中),创建新节点
add neighbor to openset
h_score[neighbor] := heuristic_cost_estimate(neighbor, goal)
tentative_is_better := true
else if tentative_g_score < g_score[neighbor]
//如果neighbor已经探测到,并且当前g_socre[current]有更小的代价
tentative_is_better := true
else
tentative_is_better := false
//更新neighbor的代价
if tentative_is_better = true
came_from[neighbor] := current
g_score[neighbor] := tentative_g_score
f_score[neighbor] := g_score[neighbor] + h_score[neighbor] return failure function reconstruct_path(came_from, current_node)
if came_from[current_node] is set
p := reconstruct_path(came_from, came_from[current_node])
return (p + current_node)
else
return current_node
笔试算法题(48):简介 - A*搜索算法(A Star Search Algorithm)的更多相关文章
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
- LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree
这是悦乐书的第197次更新,第203篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第59题(顺位题号是235).给定二叉搜索树(BST),找到BST中两个给定节点的最低共 ...
- 笔试算法题(52):简介 - KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm)
议题:KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm) 分析: KMP算法用于在一个主串中找出特定的字符或者模式串.现在假设主串为长度n的数组T ...
- 笔试算法题(50):简介 - 广度优先 & 深度优先 & 最小生成树算法
广度优先搜索&深度优先搜索(Breadth First Search & Depth First Search) BFS优缺点: 同一层的所有节点都会加入队列,所以耗用大量空间: 仅能 ...
- 笔试算法题(45):简介 - AC自动机(Aho-Corasick Automation)
议题:AC自动机(Aho-Corasick Automation) 分析: 此算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一:一个常见的例子就是给定N个单词,给定包含M个字符的文章,要求 ...
- 笔试算法题(44):简介 - 动态规划(Dynamic Programming)
议题:动态规划(Dynamic Programming) 分析: DP主要用于解决包含重叠子问题(Overlapping Subproblems)的最优化问题,其基本策略是将原问题分解为相似的子问题, ...
- 笔试算法题(46):简介 - 二叉堆 & 二项树 & 二项堆 & 斐波那契堆
二叉堆(Binary Heap) 二叉堆是完全二叉树(或者近似完全二叉树):其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者 ...
- 笔试算法题(51):简介 - 红黑树(RedBlack Tree)
红黑树(Red-Black Tree) 红黑树是一种BST,但是每个节点上增加一个存储位表示该节点的颜色(R或者B):通过对任何一条从root到leaf的路径上节点着色方式的显示,红黑树确保所有路径的 ...
- 笔试算法题(47):简介 - B树 & B+树 & B*树
B树(B-Tree) 1970年由R. Bayer和E. Mccreight提出的一种适用于外查找的树,一种由BST推广到多叉查找的平衡查找树,由于磁盘的操作速度远小于存储器的读写速度,所以要求在尽量 ...
随机推荐
- UVa 12718 Dromicpalin Substrings (暴力)
题意:给定一个序列,问你它有多少上连续的子串,能够重排后是一个回文串. 析:直接暴力,n 比较小不会超时. 代码如下: #pragma comment(linker, "/STACK:102 ...
- E20180324-hm
popover 弹出框 archive v. 存档; n. 档案文件; 档案室;
- E20180303-hm-xa
overlap n. 重叠部分; 覆盖物,涂盖层; [数] 交叠,相交; vt. 重叠; 与…部分相同; stride n. 步幅; 大步,阔步; 进展; 一跨(的宽度); vt. 跨过; 大踏步 ...
- 解决 iphone5 4 inch 屏 app黑边问题
你需要一张640*1138的预加载图(launch image).在工程>TARGETS 中添加,系统将自动将其重命名为Default-568h@2x.png.
- LBP特征 学习笔记
这几天一直在做人脸识别的项目,有用到LBP特征,但是毫无头绪,师姐这几天也比较忙,没有时间来指导我,随自己找相应的介绍LBP的博文来看,现在总算有了一个大体的思路了,就写下来吧 注:参考博文: 目标检 ...
- 洛谷 P1600 天天爱跑步
https://www.luogu.org/problemnew/show/P1600 (仅做记录) 自己的假方法: 每一次跑从a到b:设l=lca(a,b)对于以下产生贡献: a到l的链上所有的点( ...
- jmeter(六)关联
话说LoadRunner有的一些功能,比如:参数化.检查点.集合点.关联,Jmeter也都有这些功能,只是功能可能稍弱一些,今天就关联来讲解一下. JMeter的关联方法有两种:后置处理器-正则表达式 ...
- sdut1933WHUgirls(dp)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1933 矩形的dp一般挺类似 大的矩形都是由小 ...
- [ BZOJ 2038 ] Hose
\(\\\) Description 给出一个数列,多次询问,每次给出一个区间 \([l_i,r_i]\) ,问在区间中随意选两个位置不同的数,是同一个数的概率有多大. \(n,m\le 5\time ...
- 学习笔记 第十四章 使用CSS3动画
第14章 使用CSS3动画 [学习重点] 设计2D动画 设计3D动画 设计过渡动画 设计帧动画 能够使用CSS3动画功能设计页面特效样式 14.1 设计2D动画 CSS2D Transform表 ...