A* 算法是启发式搜索算法中的经典,经常应用于图搜索、路径搜索和规划中。这里以八数码问题状态空间图的搜索为例,初步介绍以A*算法为代表的启发式搜索。

搜索算法可分为两大类:无信息的搜索算法和有信息的搜索算法。无信息的搜索又称盲目搜索,其特点是只要问题状态可以形式化表示,原则上就可用使用无信息的搜索,无信息搜索有如下常见的几种搜索策略:广度优先搜索、代价一致搜索、深度优先搜索、深度有限搜索、迭代深入优先搜索、双向搜索。我们说DFS和BFS都是蛮力搜索,因为它们在搜索到一个结点时,在展开它的后续结点时,是对它们没有任何‘认识’的,它认为它的孩子们都是一样的‘优秀’,但事实并非如此,后续结点是有好有坏的。好,就是说它离目标结点‘近’,如果优先处理它,就会更快的找到目标结点,从而整体上提高搜索性能。
为了改善上面的算法,我们需要对展开后续结点时对子结点有所了解,这里需要一个估值函数,估值函数就是评价函数,它用来评价子结点的好坏,因为准确评价是不可能的,所以称为估值。这就是我们所谓的有信息搜索。如果估值函数只考虑结点的某种性能上的价值,而不考虑深度,比较有名的就是有序搜索(Ordered-Search),它着重看好能否找出解,而不看解离起始结点的距离(深度)。如果估值函数考虑了深度,或者是带权距离(从起始结点到目标结点的距离加权和),那就是A* 如果不考虑深度,就是说不要求最少步数,移动一步就相当于向后多展开一层结点,深度多算一层,如果要求最少步数,那就需要用A*。简单的来说A*就是将估值函数分成两个部分,一个部分是路径价值,另一个部分是一般性启发价值,合在一起算估整个结点的价值。

一、启发性信息和估价函数

1.启发性信息:

启发式搜索是利用知识来引导搜索过程的,达到减少搜索范围的目标,使得尽量先走“最有希望的方向”,从而降低问题复杂度。这里就是要根据知识,设计启发性信息(启发函数),启发性信息可以:
1)帮助确定扩展节点的信息
2)有效地帮助决定哪些后继节点应被生成
3)能决定在扩展一个节点时哪些节点应从搜索树上被删除
启发性信息的设计至关重要,太弱可能就起不到效果,甚至退化为盲目搜索,太强就会可能导致找不到最优的解。

2.估价函数:

Evaluation Function:是一种对于节点“希望”的度量,表示这个节点在通向目标节点最佳路径上的“希望”或者概率,以此为指导选择优先扩展的节点。
估价函数的选取有很多方式:节点处于最佳路径上的概率;节点与目标节点集之间距离的度量或者差异的距离;根据状态优劣的打分等等。
注意:估价函数和之前提到的代价函数不一样,代价函数是预先知道的,而估价函数是根据知识预测得到的

二、启发式搜索过程(A和A*算法)

1.A算法

对于求解过程中,启发式搜索与盲目搜索的区别就在于对于OPEN表的重排,优先选择最优希望的节点扩展。
重排的依据就是:从起始节点到达该节点的耗散g(n)和从该节点到目标节点的消耗h(n)结合起来对节点进行评价,即

f(n)=g(n)+h(n)

2.A*算法

对于A算法中,g(n)和h(n),尤其是h(n)该如何选择呢,选择如果超过实际代价太多,也就是太强,可能会找不到解;太弱就会在搜索过程中,扩展一些多余的节点,对于具体问题要根据具体知识进行设计。这里定义如果对于所有的n都有h(n)≤h* (n),也称h(n)为h* (n)的下界,则是一种相对保守的搜索,但是这样是可纳的
采用h*(n)的下界h(n)为启发函数的A算法,称为A* 算法。当h=0时,A* 算法就变为有序搜索算法。
上图中,f*(n)=g*(n)+h*(n)是从s经过n到g的最优路径的实际代价,而g(n)和h(n)就分别是对实际代价的估计!
所以在设计估价函数时,要尽可能的使得和h(n)逼近h*(n),但又不超过h*(n),这样得到的时完备可纳的,有时复杂度最小的,但是如何知道有没有超过h*(n)呢?感觉还是需要具体问题具体分析。

3.求解过程描述

搜索过程大致和盲目搜索一样,只是在OPEN表排序不同,其中涉及到的排序算法,去重算法等都会影响算法的效率。

对于上面图中“调整亲子关系和指针”:
1)如果j既不在OPEN表中,也不在CLOSED表中,则用估价函数f把它添入OPEN表,从j加一指向父辈节点i的指针。
2)如果j已在OPEN表或CLOSED表上,则比较刚刚对j计算过的f值和前面计算过的该节点在表中的f值.。如果新的f值较小,则作以下几种操作:
a. 以此新值取代旧值
b.从j指向i, 而不是指向它的父辈节点
c.如果节点j在CLOSED表中, 则把它移回OPEN表

4.八数码问题设计估价函数

这里以之前提到的八数码问题为例:
1)估价函数1:f(n)=d(n)+w(n)
d(n)为n的深度
w(n)为不在位的棋子数
这样w(n)≤h*(n),是满足A* 算法的限制条件,所有一定能找到最优解,但是这样设计估价函数并不是最优的。
2)估价函数2:f(n)=d(n)+p(n)
p(n)为不在位的棋子与其目标位置的距离之和
这样p(n)≤h*(n),也是满足A* 算法的限制条件。
w(n)是不在位的棋子数,不够贴切,错误选用节点加以扩展,而p(n)是更接近于h*(n)的h(n),其值是节点n与目标状态节点相比较,每个错位棋子在假设不受阻拦的情况下,移动到目标状态相应位置所需走步的总和。p(n)不仅考虑了错位因素,还考虑了错位的距离(移动次数),也就是启发性信息更多了。

5.启发式搜索特点和实际工程应用

1)对于启发性信息:设对同一个问题定义了两个A* 算法A1和A2,若A2比A1有较多的启发信息,即对所有非目标节点有h2(n) > h1(n),则在具有一条从s到t的路径的隐含图上,搜索结束时,由A2所扩展的每一个节点,也必定由A1所扩展,即A1扩展的节点数至少和A2一样多
2)在实际应用中理论上是设计接近、又总是≤h*(n)的h(n),但是这种设计往往也要消耗大量的时间,如果h(n)本身设计的复杂,每次计算时消耗在h(n)上的复制度也就会增加,使得求解变慢。
3)对于搜索深度和启发性信息的权衡:

f(n) = g(n) + wh(n)

搜索图的浅层时,让w取较大值,突出启发式函数的作用,加速向纵深方向搜索。
搜索到较深的层次时,让w取较小值,以使g(n)所占权重大,并确保wh(n)≤h* (n),引导搜索向横广方向发展,寻找到较短的解答路径。

【人工智能】1.问题求解:启发式搜索算法相关推荐

  1. A*启发式搜索算法详解 人工智能

    A*启发式搜索算法详解 人工智能 我们尝试解决的问题是把一个游戏对象(game object)从出发点移动到目的地.路径搜索(Pathfinding)的目标是找到一条好的路径--避免障碍物.敌人,并把 ...

  2. 经典算法研究系列:八、再谈启发式搜索算法

     经典算法研究系列:八.再谈启发式搜索算法 作者:July   二零一一年二月十日 本文参考: I.  维基百科. II. 人工智能-09 启发式搜索. III.本BLOG内,经典算法研究系列:一.A ...

  3. 你必须会的启发式搜索算法--A*算法

    一.算法原理 A* 算法,就是解决在一个平面 grid地图中寻找起点到终点的最短路径问题的算法,类似于Dijkstra算法和BFS算法一样,属于广度优先搜索.实际上它还是一个启发式搜索算法,什么叫启发 ...

  4. 启发式搜索算法(A*算法)

    A算发:在bfs算法中,若对每个状态n都设定估价函数f(n)=g(n)+h(n),并且每次从开启列表中选节点 进行扩展时,都选取f值最小的节点,则该搜索算法为启发式搜索算法,又称A算法. g(n):从 ...

  5. 转载:改进的双向启发式搜索算法及其在车载导航仪中的应用

    非常感谢作者. 摘要:介绍单车辆路径规划的有关算法,针对车载导航仪的应用,对双向启动式搜索算法进行了改进和优化,提出了可靠有效的搜索终止条件和搜索切换标准,给出了改进算法的流程.最后给出了四种算法的实 ...

  6. 启发式搜索算法解决数独问题sudoku,附python实现

    定义 数独是源自18世纪瑞士的一种数学游戏.是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫(3*3)内的数字均含1 ...

  7. 遗传算法 一个模拟自然进化过程的启发式搜索算法

    关键字:遗传算法 遗传算法(Genetic Algorithm)是一种模拟自然界"自然选择"和"自然遗传"的启发式搜索算法,通过模拟自然进化过程搜索最优解的方法 ...

  8. 人工智能中的局部搜索算法

      在局部搜索算法中,我们不再关心从初始节点到目标节点之间的路径,而是考虑从当前节点出发,移动到它的邻近状态,直到到达合理的目标状态.相比于前面所说的无信息搜索算法和有信息搜索算法,局部搜索算法往往能 ...

  9. Python实现两地铁站路径查询 广度优先搜索BFS、启发式搜索算法

    操作思路及流程: 从网页获取数据 对数据进行处理 数据建图 搜索算法设计 数据获取 需要的Package: requests #准备了一个链接,通过requests来抓取页面的信息,并打印下 r = ...

最新文章

  1. android处理url中的特殊字符
  2. HTML5有哪些新特性、移除了哪些元素?
  3. 开发日记-20190519 关键词 Linux学习路径
  4. 更换mysql_安利给你,关于MySQL字符集乱码与解决方案
  5. python 40位的数减个位数_Python数据分析入门教程(五):数据运算
  6. 使用Javascript来创建一个响应式的超酷360度全景图片查看幻灯效果
  7. 图片区域帧差法识别物体_matlab
  8. Flutter学习 — 用占位符淡入淡出的显示图片
  9. 举个栗子看如何做MySQL 内核深度优化 1
  10. 写给非网工的CCNA教程(4)聊聊ping命令后的原理(续)
  11. java基础--接口
  12. 机器视觉基础知识详解
  13. mac版百度网盘客户端
  14. new与delete动态分配和释放内存
  15. 中国文学通史之各个阶段介绍
  16. java 解决oracle US7ASCII编码,sql查询时
  17. 3D打印将对零售模式产生颠覆影响,能否抓住机遇
  18. Hashicorp Vault(金库)
  19. xms应用框架 - 基于.netcore
  20. C语言--if…if…和if…else if的区别

热门文章

  1. Win7安装.Net Framework 4.5.2失败最有效的解决方法
  2. 交换机和路由器技术-13-三层交换
  3. Java Web 实现文件多线程分片下载方案
  4. python BeautifulSoup的使用
  5. 面试官:IoC 和 DI 有什么区别?
  6. div的display和visible的区别
  7. MySQL inet aton函数_有个统计需求,需要对IP进行分类统计,Mysql提供了inet_aton()和inet_ntoa()函数进程处理。具体可以查看官方手册。INET_ATON(e...
  8. 天载优配提示商场存在两方面的问题
  9. 密码加盐原理及其实现
  10. 51单片机c语言延时计算软件,51单片机精确延时程序大集合+初值计算工具