许多工业与科学计算问题都可以转化为在图中寻路问题。启发式的寻路方法将问题表示为一个图,然后利用问题本身的信息,来加速解的搜索过程。一个典型的例子是有一些通路连接若干城市,找出从指定起点城市到指定终点城市的路径。但是有些问题不存在如此明显的事先定义好的图,它们的图是隐式图,也就是说,问题给定了搜索起点与一系列操作,对起点进行这些操作得到了它的后继结点,以及该操作的代价,对这些后继结点不断地重复操作,就得到了一个带权的有向图,隐式图就定义好了。

对于解决最小路径问题,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'有如下三种情况:

  1. 邻结点在CLOSED集中,说明它已被检测过,如果cost<g(n'),那么说明找到了一条通过n到达n'更近的路径,更新g(n')为cost, n'的父结点为n,把邻结点从CLOSED集中删去,并把它重新放入OPEN集中(因为同样都是到达n',h(n')是一样的,g(n')小必然能带来更小的f(n')),如果cost>=g(n'),则跳过该邻结点。
  2. 邻结点在OPEN集中,说明它之前被拓展过,如果cost<g(n'),那么说明找到了一条通过n到达n'更近的路径,更新g(n')为cost, n'的父结点为n,邻结点仍留在OPEN集中。如果cost>=g(n'),则跳过该邻结点。
  3. 邻结点不在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*算法研究的更多相关文章

  1. July-程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典原创系列集锦与总结

    程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大经典原创系列集锦与总结 http://blog.csdn.net/v_july_v/article/details/6543438

  2. Akamai在内容分发网络中的算法研究(翻译总结)

    作者 | 钱坤 钱坤,腾讯后台开发工程师,从事领域为流媒体CDN相关,参与腾讯TVideo平台开发维护. 原文是<Algorithmic Nuggets in Content Delivery& ...

  3. 经典算法研究系列:二、Dijkstra 算法初探

    July   二零一一年一月 本文主要参考:算法导论 第二版.维基百科. 一.Dijkstra 算法的介绍 Dijkstra 算法,又叫迪科斯彻算法(Dijkstra),算法解决的是有向图中单个源点到 ...

  4. 静态频繁子图挖掘算法用于动态网络——gSpan算法研究

    摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的 ...

  5. sauvola二值化算法研究

    sauvola二值化算法研究   sauvola是一种考虑局部均值亮度的图像二值化方法, 以局部均值为基准在根据标准差做些微调.算法实现上一般用积分图方法 来实现.这个方法能很好的解决全局阈值方法的短 ...

  6. 蜂窝网络TDOA定位方法的Fang算法研究及仿真纠错

    科学论文为我们提供科学方法,在解决实际问题中,能极大提高生产效率.但论文中一些失误则可能让使用者浪费大量时间.自己全部再推导那真不容易,怀疑的成本特别高,通常不会选择这条路.而如果真是它的问题,其它所 ...

  7. 硕毕论文_基于 3D 卷积神经网络的行为识别算法研究

    论文标题:基于 3D 卷积神经网络的行为识别算法研究 来源/作者机构情况: 中  国  地  质  大  学(北京),计算机学院,图像处理方向 解决问题/主要思想贡献: 1. 使用张量CP分解的原理, ...

  8. MugLife静态照片变3D动画算法研究

    原文:MugLife静态照片变3D动画算法研究 MugLife app是一款可以将静态照片变成3D动画的手机应用,如下效果图所示: 大家可以看到,这个静态图具有了类3D的动画特效,是不是很好玩? 这种 ...

  9. 人像美妆---妆容迁移算法研究(Makeup transfer)

    原文:人像美妆---妆容迁移算法研究(Makeup transfer) 对于人像美妆算法,现在的美妆相机.玩美彩妆之类的app已经做的比较成熟了,但是具体算法,基本网络上是杳无可查,今天本人介绍一种自 ...

  10. 搜索引擎算法研究专题六:HITS算法

    搜索引擎算法研究专题六:HITS算法 2017年12月19日 ⁄ 搜索技术 ⁄ 共 1240字 ⁄ 字号 小 中 大 ⁄ 评论关闭   HITS(Hyperlink-Induced Topic Sea ...

随机推荐

  1. CF-796C

    C. Bank Hacking time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  2. zz 堆空间与栈空间

    http://blog.sina.com.cn/s/blog_7321be1101013aua.htmlhttp://soft.chinabyte.com/os/51/12324551.shtmlht ...

  3. TypeScript完全解读(26课时)_17.装饰器

    实验性的特性,需要在tslint里面把这项设置为true 作用域类的声明方法.访问符.属性和参数上 使用@符号加一个名字来定义,名字必须是一个函数,或者求值后是一个函数 装饰器工厂,setPro当做一 ...

  4. IDL(Interactive Data Language——交互式数据语言)

    Interactive Data Language——交互式数据语言 目前,图像处理常用的ENVI就是用IDL开发的经典软件 广泛支持的平台: Microsoft Windows Open VMS S ...

  5. 设置a 标签打开新窗口新姿势

    设置页面中的所有a标签都打开新窗口 1,在写的时候就加上target="_blank" 2,在页头<head></head>里加上 <base tar ...

  6. 201621123016 《Java程序设计》第八周学习总结

    1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 ArrayList在调用contains方法时会调用indexOf方法得到 ...

  7. CF 429B B.Working out 四个角递推

    B. Working outtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutpu ...

  8. SQL 语句(原生)

    //查 //查询表里的所有数据 select * from 表名 //根据id等字段查询数据 select * from 表名 where 字段 = 值 or 字段 = 值 (例):select * ...

  9. IT兄弟连 JavaWeb教程 使用JSTL函数

    在JSTL Functions标签库中提供了一组常用的EL函数,主要用于处理字符串,在JSP中可以直接使用这些函数. 在JSP中使用Functions标签库,需要通过taglib指令引入该标签库: & ...

  10. cell内存优化

    UITableView的常用属性: 分割线颜色设置: 1> 设置separatorStyle: 分割线的颜色 方法:tableView.separatorStyle = UITableViewC ...