A*算法研究
许多工业与科学计算问题都可以转化为在图中寻路问题。启发式的寻路方法将问题表示为一个图,然后利用问题本身的信息,来加速解的搜索过程。一个典型的例子是有一些通路连接若干城市,找出从指定起点城市到指定终点城市的路径。但是有些问题不存在如此明显的事先定义好的图,它们的图是隐式图,也就是说,问题给定了搜索起点与一系列操作,对起点进行这些操作得到了它的后继结点,以及该操作的代价,对这些后继结点不断地重复操作,就得到了一个带权的有向图,隐式图就定义好了。
对于解决最小路径问题,A*算法性能卓越。首先,对于任何有解路径,A*总能找到一条最佳路径,也就是说A*算法是可采纳的。其次,在保证能找到最佳路径的前提下,A*算法扩展了最少个数的结点,也就是说A*算法是最优的。
使用启发信息的一种重要方法就是估价函数。A*使用
来表示结点
的估价函数,它表示从起点到目标,经由结点
最小费用路径上的费用。它由
和
两部分组成,即
。其中
表示从初始结点到
的最佳解路径的费用,
表示从
到目标结点的最佳解路径的费用。但想要知道它们的精确值很难,我们可以使用
来估计
,使用
来估计
,
来估计
。
表示目前为止,从起始点到
的最小费用,因为日后可能找到更小的费用,所以有
。而在A*算法中,对
的估计通常是乐观的,比实际所需的费用要小,即有
。它们之间的关系可以用下图形象地表示:

注:黄色是估计值,黑色是最佳解路径费用
A*算法维护两个集合:OPEN 集和 CLOSED 集。OPEN 集包含待检测节点。初始状态的OPEN集仅包含一个元素:开始位置。CLOSED集包含已检测节点。初始状态的CLOSED集为空。从图形上来看,OPEN集是已访问区域的边界,CLOSED集是已访问区域的内部。每个节点还包含一个指向父节点的指针,以确定追踪关系。
算法有一个主循环,重复地从OPEN集中取最优节点n(即f值最小的节点)来检测。如果n是目标节点,那么算法结束;否则,将节点n从OPEN集删除,并添加到CLOSED集中,然后查看n的所有邻节点n'。cost= g(n) + movementcost(n, n')。n'有如下三种情况:
- 邻结点在CLOSED集中,说明它已被检测过,如果cost<g(n'),那么说明找到了一条通过n到达n'更近的路径,更新g(n')为cost, n'的父结点为n,把邻结点从CLOSED集中删去,并把它重新放入OPEN集中(因为同样都是到达n',h(n')是一样的,g(n')小必然能带来更小的f(n')),如果cost>=g(n'),则跳过该邻结点。
- 邻结点在OPEN集中,说明它之前被拓展过,如果cost<g(n'),那么说明找到了一条通过n到达n'更近的路径,更新g(n')为cost, n'的父结点为n,邻结点仍留在OPEN集中。如果cost>=g(n'),则跳过该邻结点。
- 邻结点不在CLOSED集或者OPEN集中,则加入OPEN集中。
算法用伪代码表示如下:
OPEN = priority queue containing START
CLOSED = empty set
while lowest rank in OPEN is not the GOAL:
current = remove lowest rank item from OPEN
add current to CLOSED
for neighbors of current:
cost = g(current) + movementcost(current, neighbor)
if neighbor in OPEN and cost less than g(neighbor):
remove neighbor from OPEN, because new path is better
if neighbor in CLOSED and cost less than g(neighbor): **
remove neighbor from CLOSED
if neighbor not in OPEN and neighbor not in CLOSED:
set g(neighbor) to cost
add neighbor to OPEN
set priority queue rank to g(neighbor) + h(neighbor)
set neighbor's parent to current
reconstruct reverse path from goal to start
by following parent pointers
在A*算法中,h(n)越大启发信息越多,但是有时计算启发信息本身的代价很高,例如计算
的开销较大,可以使用
来代替,(
总是成立)虽然会扩展多一些的结点,但是依旧是高效的。h(n)=0时,A*退化成了DIjkstra算法。
当
时,算法不再可采纳,不一定能找到最优解,但是能以较快的速度找到满意解,这在大多数时候是高效的。例如使用
来代替
。当h(n)很大时,A*变成了贪心算法。
所以要仔细选择h(n),在算法是否可采纳、搜索效率、计算开销之间权衡。
A*算法研究的更多相关文章
- July-程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典原创系列集锦与总结
程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大经典原创系列集锦与总结 http://blog.csdn.net/v_july_v/article/details/6543438
- Akamai在内容分发网络中的算法研究(翻译总结)
作者 | 钱坤 钱坤,腾讯后台开发工程师,从事领域为流媒体CDN相关,参与腾讯TVideo平台开发维护. 原文是<Algorithmic Nuggets in Content Delivery& ...
- 经典算法研究系列:二、Dijkstra 算法初探
July 二零一一年一月 本文主要参考:算法导论 第二版.维基百科. 一.Dijkstra 算法的介绍 Dijkstra 算法,又叫迪科斯彻算法(Dijkstra),算法解决的是有向图中单个源点到 ...
- 静态频繁子图挖掘算法用于动态网络——gSpan算法研究
摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的 ...
- sauvola二值化算法研究
sauvola二值化算法研究 sauvola是一种考虑局部均值亮度的图像二值化方法, 以局部均值为基准在根据标准差做些微调.算法实现上一般用积分图方法 来实现.这个方法能很好的解决全局阈值方法的短 ...
- 蜂窝网络TDOA定位方法的Fang算法研究及仿真纠错
科学论文为我们提供科学方法,在解决实际问题中,能极大提高生产效率.但论文中一些失误则可能让使用者浪费大量时间.自己全部再推导那真不容易,怀疑的成本特别高,通常不会选择这条路.而如果真是它的问题,其它所 ...
- 硕毕论文_基于 3D 卷积神经网络的行为识别算法研究
论文标题:基于 3D 卷积神经网络的行为识别算法研究 来源/作者机构情况: 中 国 地 质 大 学(北京),计算机学院,图像处理方向 解决问题/主要思想贡献: 1. 使用张量CP分解的原理, ...
- MugLife静态照片变3D动画算法研究
原文:MugLife静态照片变3D动画算法研究 MugLife app是一款可以将静态照片变成3D动画的手机应用,如下效果图所示: 大家可以看到,这个静态图具有了类3D的动画特效,是不是很好玩? 这种 ...
- 人像美妆---妆容迁移算法研究(Makeup transfer)
原文:人像美妆---妆容迁移算法研究(Makeup transfer) 对于人像美妆算法,现在的美妆相机.玩美彩妆之类的app已经做的比较成熟了,但是具体算法,基本网络上是杳无可查,今天本人介绍一种自 ...
- 搜索引擎算法研究专题六:HITS算法
搜索引擎算法研究专题六:HITS算法 2017年12月19日 ⁄ 搜索技术 ⁄ 共 1240字 ⁄ 字号 小 中 大 ⁄ 评论关闭 HITS(Hyperlink-Induced Topic Sea ...
随机推荐
- vue中使用chart.js
1,安装chart.js和vue-chart.js npm install chart.js --save npm install vue-chart.js --save 2,独立文件,方便修改 封装 ...
- 洛谷 - P3786 - 萃香抱西瓜 - 状压dp
重构一下就过了,不知道之前错在哪里. #include<bits/stdc++.h> using namespace std; typedef unsigned long long ull ...
- 分解gif图片并保存
/** Gif的步骤 1. 拿到Gifd的数据 2. 将Gif分解为一帧帧 3. 将单帧数据转为UIImage 4. 单帧图片保存 */ #import <ImageIO/ImageIO.h&g ...
- Swift3.0 数组(Array)
学习了数组的定义,创建,和元素的,增,删,改 //定义数组类型 var array1: Array<String> var array2:[String] //创建一个空数组,int类型元 ...
- OPENGL_三角形带GL_TRIANGLE_STRIP详解
使用三角形带原因:减少顶点传递,渲染时api向显卡传输数据量是瓶颈,用较好的传递方法传递一个三角形最少可以少于一个点. 点的顺序根据奇数,偶数不一样的原因:保持所有三角形法线在同一方向. 原文:htt ...
- [Xcode 实际操作]一、博主领进门-(5)检测运行中的模拟器在各个方向上的切换
目录:[Swift]Xcode实际操作 本文将演示Xcode的设备模拟器在各个方向上的切换和检测. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 检测运行中的模拟 ...
- [Xcode 实际操作]八、网络与多线程-(14)使用网址会话对象URLSession将地理坐标转换为地名
目录:[Swift]Xcode实际操作 本文将演示如果通过网址会话对象,将地理坐标转换为地名. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模式等优点. 在项目 ...
- js中 call() ,apply(),bing()方法三者的用法和区别
面试中经常会被问到的,或者做笔试题的时候也会有这样的问题,所以今天专门对这个问题做个总结: 先看个例子: var age = '19' var myObj = { name:'小赖', myAge:t ...
- noip2017普及组
过了这么久才来写博客,也是我这么一段时间都很低迷吧.... 老实来说,今年应该是要打提高组的...可还是打了普及组... 其实最猥琐的还是我连普及都写挂了,作为一个学了两年的人,图论,进阶dp都写过的 ...
- vue 脚手架 图片预加载
$('.back-img').onload =function(){ var img =new Image(); img.src = '../assets/dt-bj.png'; } 该组件内的图片加 ...