问题求解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排列 有限无圈图的树搜索,有限图的图搜索(简单)

这篇博客写的比较简陋,后期我会再补充一些例子的,最近比较忙,很多事情蜂拥而至,耽误了写博客的任务。

人工智能学习笔记(三)有信息搜索相关推荐

  1. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  2. MOOC人工智能原理学习笔记4——有信息搜索

    Informed Search 有信息搜索 有信息搜索亦被称为启发式搜索.这类策略采用超出问题本身定义的.问题特有的知识,因此能够找到比无信息搜索更有效的解. ① Evaluation functio ...

  3. python3常用模块_Python学习笔记三(常用模块)

    Python 学习笔记三 (常用模块) 1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称( ...

  4. 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 个重要概念 ...

  5. MySQL学习笔记(三)查询

    写在前面:本篇为作者自学总结,学习内容为课堂所学和网络学习笔记汇总,对于内容引用部分在文中和文末注明. 文章仅供参考,如需深入了解,请查阅MySQL参考手册.附上下载链接: 链接:https://pa ...

  6. 项目管理学习笔记二:信息系统服务管理

    项目管理学习笔记二:信息系统服务管理 2010-10-22 09:56:33 标签:信息系统 笔记 项目管理 服务 学习 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文 ...

  7. ROS学习笔记三:创建ROS软件包

    ,# ROS学习笔记三:创建ROS软件包 catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 这个软件包必须包含一个catkin编译文件package.xml(man ...

  8. Python学习笔记三之编程练习:循环、迭代器与函数

    Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...

  9. Spring框架学习笔记(三)(AOP,事务管理)

    Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...

  10. SurfaceFlinger学习笔记(三)之SurfaceFlinger进程

    概述 本系列是基于android Q 即android10 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFling ...

最新文章

  1. 关于服务器端控件的attributes属性的奇怪问题
  2. 【C++】log(n)斐波那契数列计算
  3. 微信遇到特殊服务器,解决微信网页授权,出现errcode:40163,errmsg:codebeenused,看似微信访问了2次这个回调接口的问题...
  4. 2路由策略_route-map(执行路由策略)
  5. 通过这些简单的步骤从头开始学习Java
  6. 精通Quartz-入门-Job
  7. Python 数据分析三剑客之 Matplotlib(十一):最常用最有价值的 50 个图表
  8. py导入包异常跳出_python~异常处理及包
  9. 总结Verilog中always语句的使用
  10. 怎样做网站,需要考虑的几个seo因素
  11. Linux虚拟存储系统
  12. 深度 ghost linux系统,用Ghost实现Linux系统的备份
  13. 寻找肇事汽车车牌号C语言,北京交通大学C语言综合程序的设计(黄宇班).doc
  14. 链接脚本(Linker Script)用法解析(一) 关键字SECTIONS与MEMORY
  15. 3分钟阿里云商标智能注册申请及申请流程图文详解
  16. 分布式架构中的八大谬误
  17. 瑞士央行2022年巨亏1320亿瑞士法郎
  18. 图像处理之细化算法(Thinning Algorithm)C++实现
  19. 数据预处理-Excel 两列合并为一列中间加空格
  20. 学堂在线《工程伦理》第八章课后习题及答案(仅供参考)

热门文章

  1. 复制英文和中文PDF文字到word并去除回车符
  2. 'Sheet1$' 不是一个有效名称的解决方法
  3. Linux启动/停止/重启防火墙
  4. 国家天地图API 创建面 覆盖物
  5. Java生成sitemap网站地图
  6. 推荐一个可以在电脑上玩所有下载渠道手游的安卓模拟器
  7. android listview仿iphone通讯录ios 3dTouch
  8. 翻译—使用Python分析离散心率信号–第2部分
  9. Unity3d之设计模式(二)工厂模式
  10. stm32 app 连上阿里云