人工智能AI复习——02_search-1

人工智能AI复习——02_search-1

文章目录

  • 人工智能AI复习——02_search-1
  • 前言
  • 一个简单例子:traveling on a graph
  • 一、搜索中的关键概念
  • 二、通用搜索算法
  • 三、无信息搜索(uniformed search)
    • **Breadth-first search**
    • **Depth-first search**
    • 结合DFS和BFS的优良性能
    • 接下来我们再考虑成本的问题
    • 从目标往回找
    • 前驱分支因子可能会小于后驱分支因子
    • 还有可能两头寻找
    • 重复状态可能导致的


前言

  • 我们想采取一些行动来改变世界的状态(但由行为引起的变化完全是可以预料到的)
  • 我们试着采取一系列的行动引导我们达到目标状态(可能是最小化行动的次数,也可能是最小化行动的总成本)
  • 不需要在现实生活中执行行动的同时找到最小解决方案(让所有事都在意料之中)

一个简单例子:traveling on a graph

人工智能AI复习——02_search-1_第1张图片
目标一:从开始节点到达目标节点
树的节点和状态事不同的
人工智能AI复习——02_search-1_第2张图片
整颗搜索树如下:
人工智能AI复习——02_search-1_第3张图片
目标二:遍历图中所有节点
eg:目前在状态A,已经遍历过B,C
最大情况可能n*2^(n-1),可以转换为一张图
人工智能AI复习——02_search-1_第4张图片

一、搜索中的关键概念

  • 我们可能处于的状态集(如初始状态,目标状态等等)
  • 对于每一个状态,我们可以采取的一系列行动(每个行动可能导致进入一个新的状态,通常由继承函数来定义。eg:给定一个状态,生成从它可以到达的所有状态)
  • 成本函数决定了每个行动的成本(或者路径,即行动序列)
  • 解决方案:从初始状态到目标状态的路径(一般来说,是最小成本解决方法)

经典例子:8-puzzle问题

二、通用搜索算法

Frontier 生成了但未扩展的节点集

  1. frontier:={初始状态节点}
  2. 循环:
    • 如果frontier是空的,则宣布失败
    • 从frontier中选择并移除一个node v
    • 检查v是否是目标节点,如果是,宣布成功了
    • 如果不是,扩展v,将生成的节点插入frontier

搜索问题的关键:我们下一个应该扩展哪个生成的节点?

三、无信息搜索(uniformed search)

  • 给定一个状态,我们只知道他是否是目标状态
  • 不能说一个非目标状态比另一个非目标状态更好
  • 只能盲目的遍历状态空间,希望以某种方式到达某个目标状态也被叫做blind search,但是blind不意味着无系统

Breadth-first search

广度优先搜索的性质

  • 节点扩展顺序与节点的生成顺序相同(Frontier可以作为FIFO队列进行维护)
  • BFS是有完整解的:如果问题有解决方案,那么BFS一定能找到
  • BFS找到的解决方案是最浅的,但不一定是最优的
  • 如果每个节点有b个继承者(branching factor),某个解决方案在深度d,那么frontier大小将至少在某一点b^d。(需要非常大的时间和空间)

Depth-first search

深度优先搜索

  • Frontier可以作为后进先出(LIFO)队列进行维护,一个堆栈。
  • 也非常容易实现递归
  • DFS(节点)
    如果目标节点返回的是解决方法
    对每个节点的后继者(successor)返回DFS(successor)除非他失败
    返回失败
  • 不完整的(他可能会循环到非目标状态)
  • 可能找到解决方法,但可能不是最优节点也可能不是最浅节点
  • 如果每个节点都有b个successor,我们搜索最多到深度m,frontier的最大深度为bm(有着相对友好的空间需求,存储frontier几乎不需要存储时间)
  • 时间需求:依旧需要遍历每一个节点;uninformed search是不可避免的

结合DFS和BFS的优良性能

  • 有限深度DFS:如同DFS,但保证绝不会比d走的更深
  • 迭代深化DFS:调用深度为0的DFS,如果不成,调用深度为1的,再不成,调用深度为2的,等等。
  • 他是完整的,能找到最浅解的
  • 空间需求和DFS一样
  • 因为重复努力所以看起来像是浪费时间,实际上并不浪费,因为每次都在最深处db+(d-1)b2+(d-2)3+……+b^d

接下来我们再考虑成本的问题

  • BFS会找到最浅的解决方案,因为他总是在最浅的节点上工作
  • 类似的想法:总是在优先处理成本最低的节点(统一成本搜索)
  • 将会找到最优的解决方案(假设成本沿路径至少增加恒定的数量)
  • 往往会走很多小步
  • 如果最优成本为C,并且每一步成本至少增加L,我们可以深入C/L
  • 类似于BFS的内存问题

从目标往回找

  • 有时可以从目标往回搜索(迷宫问题,8-迷,抵达F点,如何遍历所有点)
  • 这样需要计算的是前任而非继任
  • 意义是什么呢?

前驱分支因子可能会小于后驱分支因子

如:
人工智能AI复习——02_search-1_第5张图片

还有可能两头寻找

	![在这里插入图片描述](https://img-blog.csdnimg.cn/7658125525984863b1b7b66aec6fd935.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAa29tb3JlYmltbXk=,size_20,color_FFFFFF,t_70,g_se,x_16)

从开始和目标节点一起平行寻找可能更快
两边同时寻找可能更快O(b^(d/2))

  • 双向搜索需要知道边界是否相交
  • 需要在frontier中保留至少一个边界
  • 除此之外可以在任意一颗树上做各种搜索,并得到相应的最优性等的保证
  • 无法向后搜索的情况
    很难计算前任
    前任的分支因子过多
    或有太多目标状态

重复状态可能导致的

  • 重复的状态会导致不完整或者巨大的运行时间
  • 可以通过保留以前访问过的state名单来避免该情况
    如果通往同一state的新道路成本更大,就不要走这条路
    导致时间、空间的权衡
  • “忘记历史的算法注定会重复历史”

你可能感兴趣的:(人工智能)