启发式搜索 (Heuristically Search)-【贪婪最佳优先搜索】和【A*搜索】
搜索是人工智能里面研究的一个核心问题,像强化学习其本质我也是理解为一种搜索算法,不过其用了一些值函数近似的方法,并做了进一步改良,使其功能更加强大。近些年来也有非常多学术研究者慢慢开始将两者融汇贯通发顶会了。比如像Goog
的planet
,Muzero
以及将熵用于蒙特卡洛树搜索中平衡探索和利用的关系等等。
启发式搜索
启发式搜索(Heuristically Search)又称为有信息搜索(Informed Search),它是利用问题拥有的启发信息来引导搜索,达到减少搜索范围、降低问题复杂度的目的,这种利用启发信息的搜索过程称为启发式搜索。其代表算法为:贪婪最佳优先搜索(Greedy best-first search)和A∗A^{*}A∗搜索。
人工智能中大量的问题都可以被描述为:在给定海量信息源以及一些约束条件和额外信息,我们需要找到问题所对应的答案。
问题的答案就在海量的信息源里面,关键就在于如何快速从信息源中学得模式,找到问题与答案的对应关系。这也是当今人工智能算法所研究的核心,越好的算法能够越快地找到对应的模式,找到更精准的模式关系,使其具备更强大的泛化能力。
问题描述
我们以寻找最优路径这个问题为例,如下图所示:
我们需要寻找到Arad
到Bucharest
这两个城市之间的一条最短路径。这里所谓的最短路径是一个泛称,依据具体问题本身而做相应地调整。比如时间最短、油耗最少、或者自定义函数做用户体验最佳等等。在本问题中指实际的距离。
模型建立
为了这个通俗的问题能够转化为算法可求解的问题,我们需要对这个问题建立一个基本的数学模型。大致定义如下五个变量:
- 状态:
在上述问题中,我们将每一个城市称之为一个状态。从起始城市转移到目标城市的过程就是从初始状态转移到终止状态的过程。
- 动作:
我们将从当前时刻转移到下一时刻所处的状态的操作称之为动作。在搜索算法中动作一般都是离散的。
- 状态转移:
从当前状态转移到下一时刻的状态我们称之为状态转移。有些城市之间不存在直接的连线,所以他们之间不存在状态转移。
- 路径:
路径是一系列状态的集合,对于这个问题而言就是从Arad
到Bucharest
所形成的一系列状态转移后得到的状态集合。
- 测试目标:
测试目标用于评估当前状态是否为所求解的目标状态。
Greedy Best-First Search
贪婪最佳优先搜索需要在搜索过程中利用所求解问题相关的辅助信息,这里给出的辅助信息为:任意一个城市与Bucharest
之间的直线距离。辅助信息必须是所求解问题以外的信息,不能是这个最短路径是啥。
除此之外在启发式搜索中我们还需要定义两个函数:
- 评价函数(evaluation function)
评价函数f(n)f(n)f(n)描述的是从当前节点nnn出发,根据评价函数来选择后续节点。这个评价函数就是怎么选择动作。
- 启发函数(heuristic function)
启发函数h(n)h(n)h(n)描述的是从计算节点nnn到目标节点之间所形成路径的最小代价值。这里将两点之间的直线距离作为启发函数。
在贪婪最佳优先搜索算法里面,评价函数f(n)f(n)f(n)等于启发函数h(n)h(n)h(n)。
- 举例:
从Arad
开始,与其相邻的有三个城市,将其扩展得到(b),依据评价函数,也就是启发函数选择Sibiu
,再将Sibiu
展开依次进行下去即可。
- 贪婪最佳优先搜索的不足:
- 贪婪最佳优先搜索不是最优的。经过
Sibiu
到Fagaras
到Buchares
t的路径(99+211 = 310)比经过Rimnicu Vilces
到Pitesti
到Bucharest
的路径(80+97+101 = 278 )要长32公里。 - 启发函数代价最小化这一目标会对错误的起点比较敏感。考虑从
Iasi
到Fagaras
的问题,由启发式建议须先扩展Neamt
,就是因为其离Fagaras
最近,导致其启发函数会较小,但是这是一条存在死循环路径。 - 贪婪最佳优先搜索也是不完备的。所谓不完备指的是它可能沿着一条无限的路径走下去而不回来做其他的选择尝试,因此无法找到最佳路径。
- 在最坏的情况下,贪婪最佳优先搜索的时间复杂度和空间复杂度都是O(bm)O(b^{m})O(bm)(这个就理解成计算机要循环迭代多少次吧),其中bbb是节点的分支因子数目、mmm是搜索空间的最大深度。
A∗A^{*}A∗算法
我们来回顾一下上述问题用贪婪最佳优先搜索存在问题的根本原因是什么:就是因为它的启发函数设计地不好,它启发函数取的是城市之间的直线距离,和实际的道路会有偏差,导致直线上这个方向是没有路的。由此我们需要提出一个更好的启发函数。A∗A^{*}A∗算法就这么被提出来了。
A∗A^{*}A∗算法-启发函数
在A∗A^{*}A∗算法里面,其评价函数由两部分组成,定义如下:
f(n)=g(n)+h(n)f(n)=g(n)+h(n) f(n)=g(n)+h(n)
- g(n)g(n)g(n)表示的是从起始节点到当前的节点nnn的开销的代价值;h(n)h(n)h(n)表示从当前节点nnn到目标节点路径中所估算的最小开销代价值。
由此我们可以知道,评估函数f(n)f(n)f(n)是由当前最小开销代价g(n)g(n)g(n),与后续最小开销代价h(n)h(n)h(n)的和。因此f(n)f(n)f(n)可视为经过节点nnn,具有最小开销代价值的路径。
那在新的评价函数中A∗A^{*}A∗算法是如何工作的呢?
为了保证A∗A^{*}A∗算法是最优(optimal)的(最优指的是不存在另外一个解法能得到比A∗A^{*}A∗算法所求得解法具有更小开销代价。),也即搜索出来的路径是最短路径,需要在启发函数h(n)h(n)h(n)上面下点功夫,需要启发函数h(n)h(n)h(n)满足两点:1. 可容的(admissible heuristic)和2. 一致的(consistency ,或者称为单调性)。
- 可容:
可容是专门针对启发函数而言的,即启发函数不会过高估计(over-estimate)从节点nnn到目标结点之间 的实际开销代价(即小于等于实际开销)。比如:可将两点之间的直线距离作为启发函数,从而保证其不会过高估计,保证其可容性。
- 一致性:
假设节点nnn的后续节点是n′n^{'}n′,则从nnn到目标节点之间的开销代价一定小于从nnn到n′n^{'}n′的开销再加上从n′n^{'}n′到目标节点之间的开销。如果用数学公式表达的话如下所示:
h(n)≤c(n,a,n′)+h(n′)h(n) \leq c(n,a,n^{'}) + h(n^{'}) h(n)≤c(n,a,n′)+h(n′)
其中的c(n,a,n′)c(n,a,n^{'})c(n,a,n′)指的是经过行动aaa所抵达后续节点n′n^{'}n′与之前节点nnn之间的开销代价。
举例
仍然从Arad
到Bucharest
为例,我们用A∗A^{*}A∗来寻找出这段距离。这里的评估函数f(n)f(n)f(n)由当前最小开销代价g(n)g(n)g(n)与后续最小开销代价h(n)h(n)h(n)两部分组成。Arad
与三个城市相邻,运用评估函数,选中Sibiu
,之后再依次展开即可得到上图。
到这里的话,其实就已经知道了整个A∗A^{*}A∗算法的工作流程,如果需要进一步了解相关知识以下知识点仅作参考:
1. Tree-search
的A∗A^{*}A∗算法中,如果启发函数h(n)h(n)h(n)是可容的,则A∗A^{*}A∗算法是最优的和完备的;在Graph-search
的A∗A^{*}A∗算法中,如果启发函数h(n)h(n)h(n)是一致的,A∗A^{*}A∗算法是最优的。
2. 如果函数满足一致性条件,则一定满足可容条件;反之不然。
3. 直线最短距离函数既是可容的,也是一致的。
4. 如果h(n)h(n)h(n)是一致的(单调的),那么f(n)f(n)f(n)一定是非递减的(non-decreasing)。
f(n′)=g(n′)+h(n′)=g(n)+c(n,a,n′)+h(n′)≥g(n)+h(n)=f(n)f(n^{'})=g(n^{'})+h(n^{'})=g(n)+c(n,a,n^{'})+h(n^{'}) \geq g(n) + h(n) = f(n) f(n′)=g(n′)+h(n′)=g(n)+c(n,a,n′)+h(n′)≥g(n)+h(n)=f(n)
参考资料
如果对这方面感兴趣的同学,进阶可参考如下:
- AI Planning MOOC
我的微信公众号名称:深度学习先进智能决策
微信公众号ID:MultiAgent1024
公众号介绍:主要研究深度学习、强化学习、机器博弈等相关内容!期待您的关注,欢迎一起学习交流进步!
启发式搜索 (Heuristically Search)-【贪婪最佳优先搜索】和【A*搜索】相关推荐
- [AI]贪婪最佳优先搜索 Greedy Best-First Search
贪婪最佳优先搜索 Greedy Best-First Search 一.算法原理 二.算法应用 三.算法性能 一.算法原理 所谓贪婪,即只扩展当前代价最小的节点(或者说离当前节点最近的点).这样做的缺 ...
- 【人工智能】— 有信息搜索、最佳优先搜索、贪心搜索、A*搜索
[人工智能]- 有信息搜索 无/有信息的搜索 Informed Search Algorithms Best-first search(最佳优先搜索) Greedy Search A* Search ...
- 启发式搜索(Informed Search)-贪婪算法GBS+A*算法
目录 写在前面 一.启发式搜索和启发式函数 二.贪婪算法(贪婪最佳优先搜索)greedy best-first search (GBS) 三.A*搜索(结合UCS和GBS) A*搜索算法结束的条件是什 ...
- 【读点论文】MnasNet: Platform-Aware Neural Architecture Search for Mobile,用神经网络搜索的方式来设计网络平衡精度与速度
MnasNet: Platform-Aware Neural Architecture Search for Mobile Abstract 为移动设备设计卷积神经网络(CNN)模型具有挑战性,因为移 ...
- 09-搜索前端开发-搜索页面
3 搜索前端开发 3.1 搜索页面 3.1.1 需求分析 上图是课程搜索前端的界面,用户通过前端向服务端发起搜索请求,搜索功能包括: 1.界面默认查询所有课程,并分页显示 2.通过一级分类和二分类搜索 ...
- PDF Search 10.3 PDF文档搜索工具
PDF Search for Mac是一款PDF文档搜索工具,它具有专为PDF文档开发的革命性搜索算法.它将使您能够立即在数千个文档中找到您要查找的内容.它是系统集成的.您可以直接从Spotlight ...
- Day13--搜索历史-清空搜索历史记录
1.清空搜索历史记录 我的操作: 1>在search中为'垃圾箱'小图标绑定一个事件: 2>效果图:
- 《Search the current site(站内搜索)》超实用的站内搜索工具
对特定网站进行站内搜索是找资源,查内容的必备技能, 但并不是所有网站都有站内搜索功能, 比如 当我在扯淡 (王垠的博客,界面简洁,观点有趣) , 就没有站内搜索功能. image 我们可以通过Sear ...
- 集成Elastic Search实现文档的全文搜索功能实战
技术选型 该领域已被Lucene独占,几乎无竞争对手. 但是直接使用Lucene非常复杂,因此出现了两个组件,一是solr,二是elastic search,elastic search流行度更高,但 ...
- javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)...
最后一例,搞得快.三天之内走了一次.. 下一步,面象对像的javascript编程. function Dictionary(){var items = {};this.has = function ...
最新文章
- 社会工程学到底有多可怕
- python 把带小数的浮点型字符串转换为整数的解决方案
- Jmeter初学(一)
- 《SAS编程与数据挖掘商业案例》学习笔记之二
- websocket wss_使用wss和HTTPS / TLS保护WebSocket的安全
- 读取配置文件工程src目录下配置文件封装,如sms_format.properties
- IS-IS详解(七)——IS-IS LSP报文详解
- lsb_release -a linux查看版本未找到命令
- 阿里云推出全球云网络人才赋能计划,打造云网络认证体系
- WPS关联EndNoteX9
- 大数据集群治理与数据治理(PPT)
- SDRAM-高手进阶,终极内存技术指南----学习笔记
- uWSGI, Gunicorn负载服务器怎么选
- 【Linux】特别篇--GTK界面设计
- 勇士大战恶魔?这款桌游明明是套高质量原创手办
- 3.JAVA NIO通道
- TIA Portal 功能实战(1):Get_Alarm:读取未决的报警
- 小王的摆烂日记之6月工作总结
- C语言标识符之关键字,预处理标识符和用户标识符的区别和关系
- springboot整合mybatis