人工智能学习笔记(三)有信息搜索
问题求解agent
- 背景介绍
- 一、问题描述
- 二、A星算法和启发式函数(heuristic function)
- 三、可采纳性和一致性
- 1.可采纳性(admissible)
- 2.一致性(consistency)
- 四、代码
- 五、总结
背景介绍
上一节我们介绍了无信息搜索,这种搜索方式看上去挺无脑的,因为我们的搜索是毫无方向的。这节我们将来了解有信息搜索,这种搜索方式相比无信息搜索能更有策略、更高效的进行问题求解。这节我们会先了解启发式函数,然后学习A星搜索。
一、问题描述
所有问题描述跟上一节是相同的,这节的具体例子也跟上一节是相同的。
二、A星算法和启发式函数(heuristic function)
启发式函数的作用是评估出从给定状态到目标的成本。比如我们看上面的例子。从Arad 到Bucharest的直线距离的评估就是启发式函数要做的事,启发式函数给出了从Arad到Bucharest的最小路径代价。启发式函数是在搜索算法利用问题额外信息的最常见的形式。在本文中我们规定启发式函数所给出的评估非负,即h(n)>=0。若n是目标节点,则h(n)=0。
下面我们将讲解评估函数f(n)。
Evaluation function f(n) = g(n) + h(n)
- g(n)代表到目前为止到达n已经花费的成本
- h(n)代表从n到目标最接近的花费成本,这个成本是评估出来的,并不是实际的成本。
- f(n)代表穿过n到路径的成本,这个成本里有我们走到n时已经花费的成本,也有评估从n到目标预计花费的成本。
在实现A*算法时,我们需要使用一个能按照成本升序排列的FIFO队列。
A算法的前置知识已经讲完了,现在我们来讲讲什么是A算法。在搜索问题中,我们只需要最优解,然而在无信息搜索中我们并不能避免展开那些成本很高的路径。在A*搜索中,我们可以通过启发式函数来评估当前搜索路径的最小成本,从而避免继续扩展那些路径成本已经很高的路径了。
三、可采纳性和一致性
构建A算法的启发式函数是一个难点。为了让A算法的性能优越,我们需要让启发式函数符合两个特性——可采纳性(admissible)和一致性(consistency)。
1.可采纳性(admissible)
可采纳性是指启发函数不会过高估计到达目标的代价。因为g(n)是当前路径到达结点n的实际代价,而f(n)=g(n)+h(n),我们可以看出f(n)是永远不会超出经过结点n的解的实际成本的。如果h(n)给出的成本高于实际成本,A*算法将无法求出最优解。
2.一致性(consistency)
一致性条件一般作用于在图搜索中的A算法。如果对于每个结点n和通过任一行动a生成的n的每个后继节点n’,从结点n到达目标的估计代价不大于从n到n’的单步代价于从n’到达目标的估计代价之和: h(n)<=c(n,a,n’) + h(n’)。可能大家看到这段描述有点懵,我刚开始也不理解。这里我们画一个图来讲解。
整个路径是n是起点,经过n’到达终点G。我们在n点时f(n) = g(n)+h(n) = h(n).当我们到达了n’时f(n’) = g(n’)+h(n’) = c(n,a,n’)+h(n’).此时我们可以看出这其实是一个三角不等式。如果h(n)>c(n,a,n’)+h(n’)时,可采纳性不成立,A算法搜不出最优解。如果从n经过n’到达G比h(n)的成本小,这个三角形也不成立,此时相当于给h(n)规定了一个下界。如果h(n)给出的评估成本过小,那么A*算法会搜索很多多余的节点,启发式函数也就失去了意义。
四、代码
可能大家看到这里已经一头雾水了,这里我们给出代码,通过代码来分析上面我们提到的性质。
def astar_search(problem, h=None, display=False):"""A* search is best-first graph search with f(n) = g(n)+h(n).You need to specify the h function when you call astar_search, orelse in your Problem subclass."""h = memoize(h or problem.h, 'h')return best_first_graph_search(problem, lambda n: n.path_cost + h(n), display)def best_first_graph_search(problem, f, display=False):"""Search the nodes with the lowest f scores first.You specify the function f(node) that you want to minimize; for example,if f is a heuristic estimate to the goal, then we have greedy bestfirst search; if f is node.depth then we have breadth-first search.There is a subtlety: the line "f = memoize(f, 'f')" means that the fvalues will be cached on the nodes as they are computed. So after doinga best first search you can examine the f values of the path returned."""f = memoize(f, 'f')node = Node(problem.initial)frontier = PriorityQueue('min', f)frontier.append(node)explored = set()while frontier:node = frontier.pop()if problem.goal_test(node.state):if display:print(len(explored), "paths have been expanded and", len(frontier), "paths remain in the frontier")return nodeexplored.add(node.state)for child in node.expand(problem):if child.state not in explored and child not in frontier:frontier.append(child)elif child in frontier:if f(child) < frontier[child]:del frontier[child]frontier.append(child)return None
五、总结
最后,我们联系上一节的内容对这些搜索算法的使用场景和策略进行总结。
策略 | 解决方案 | 使用场景 | 队列 | 算法与状态空间 |
---|---|---|---|---|
DFS | 任意的 | 存在许多解 | LIFO | 有限无圈图的树搜索,有限无圈图的递归算法,为有限图添加循环检测 |
BFS | 最短的 | 解的步骤很短 | FIFO | 树搜索,图搜索(简单)可以提高性能 |
UC(一致代价搜索) | 最优的 | 缺乏良好的可采纳启发式函数 | 优先级队列通过g排序 | 树搜索,图搜索(简单)的等步成本,任意步长成本的图搜索(最优)且不会重复扩展 |
A* | 最优的 | 存在良好的可采纳启发式函数 | 优先级队列通过f排列 | 树搜索和可采纳启发式,可采纳启发式的图搜索(最优)(一致性启发式不需要重复扩展) |
贪心 | 通常都很好 | 好的(不可采纳性)启发式函数 | 优先级队列通过h排列 | 有限无圈图的树搜索,有限图的图搜索(简单) |
这篇博客写的比较简陋,后期我会再补充一些例子的,最近比较忙,很多事情蜂拥而至,耽误了写博客的任务。
人工智能学习笔记(三)有信息搜索相关推荐
- iView学习笔记(三):表格搜索,过滤及隐藏列操作
iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...
- MOOC人工智能原理学习笔记4——有信息搜索
Informed Search 有信息搜索 有信息搜索亦被称为启发式搜索.这类策略采用超出问题本身定义的.问题特有的知识,因此能够找到比无信息搜索更有效的解. ① Evaluation functio ...
- python3常用模块_Python学习笔记三(常用模块)
Python 学习笔记三 (常用模块) 1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称( ...
- K8S 学习笔记三 核心技术 Helm nfs prometheus grafana 高可用集群部署 容器部署流程
K8S 学习笔记三 核心技术 2.13 Helm 2.13.1 Helm 引入 2.13.2 使用 Helm 可以解决哪些问题 2.13.3 Helm 概述 2.13.4 Helm 的 3 个重要概念 ...
- MySQL学习笔记(三)查询
写在前面:本篇为作者自学总结,学习内容为课堂所学和网络学习笔记汇总,对于内容引用部分在文中和文末注明. 文章仅供参考,如需深入了解,请查阅MySQL参考手册.附上下载链接: 链接:https://pa ...
- 项目管理学习笔记二:信息系统服务管理
项目管理学习笔记二:信息系统服务管理 2010-10-22 09:56:33 标签:信息系统 笔记 项目管理 服务 学习 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文 ...
- ROS学习笔记三:创建ROS软件包
,# ROS学习笔记三:创建ROS软件包 catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 这个软件包必须包含一个catkin编译文件package.xml(man ...
- Python学习笔记三之编程练习:循环、迭代器与函数
Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...
- Spring框架学习笔记(三)(AOP,事务管理)
Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...
- SurfaceFlinger学习笔记(三)之SurfaceFlinger进程
概述 本系列是基于android Q 即android10 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFling ...
最新文章
- 关于服务器端控件的attributes属性的奇怪问题
- 【C++】log(n)斐波那契数列计算
- 微信遇到特殊服务器,解决微信网页授权,出现errcode:40163,errmsg:codebeenused,看似微信访问了2次这个回调接口的问题...
- 2路由策略_route-map(执行路由策略)
- 通过这些简单的步骤从头开始学习Java
- 精通Quartz-入门-Job
- Python 数据分析三剑客之 Matplotlib(十一):最常用最有价值的 50 个图表
- py导入包异常跳出_python~异常处理及包
- 总结Verilog中always语句的使用
- 怎样做网站,需要考虑的几个seo因素
- Linux虚拟存储系统
- 深度 ghost linux系统,用Ghost实现Linux系统的备份
- 寻找肇事汽车车牌号C语言,北京交通大学C语言综合程序的设计(黄宇班).doc
- 链接脚本(Linker Script)用法解析(一) 关键字SECTIONS与MEMORY
- 3分钟阿里云商标智能注册申请及申请流程图文详解
- 分布式架构中的八大谬误
- 瑞士央行2022年巨亏1320亿瑞士法郎
- 图像处理之细化算法(Thinning Algorithm)C++实现
- 数据预处理-Excel 两列合并为一列中间加空格
- 学堂在线《工程伦理》第八章课后习题及答案(仅供参考)