【人工智能】1.问题求解:状态空间图和盲目搜索

什么是问题求解?问题求解可以理解为利用知识,尽可能有效的找到问题的解,或者最优解的过程,主要包括:
1)问题描述方法:状态空间法,与或树表示法;
2)搜索方法(搜索策略):盲目搜索,启发式搜索。

一、状态空间问题描述

1.问题表示

1)初始状态集合:当前所处的环境的集合。
2)操作符集合:把一个问题从一个状态变换为另一个状态的动作集合。
3)目标测试函数:确定一个状态是否是目标。
4)路径费用函数:从一个状态到另一个状态的代价等。

2.状态空间法

状态空间法是以状态算符为基础来表示和求解问题的。
1)状态:状态用于描述问题求解过程中任一时刻状况的数据结构,用一组变量的有序组合表示:SK=(SK0,SK1,…)
2)操作符(算符):把问题从一种状态变换为另一种状态的手段。走步、过程、规则、数学算子、运算符号或逻辑符号。
3)状态空间:(S,F,G)表示,其中S为初始状态的集合,F是操作符的集合;G是目标状态的集合。
4)状态空间图:用状态标识节点,用操作标识有向边,有向边的方向由操作的施加对象状态指向操作的结果状态。

3.二阶汉诺塔问题的表示

二阶汉诺塔问题:设有1、2、3三根钢针,在1号钢针上穿有A、B两个金片,A小于B,A位于B的上面。要求把这两个金片全部移到另一根钢针上,而且规定每次只能移动一片,任何时刻都不能使B位于A的上面
1)状态:SK=(SK0,SK1),SK0表示A所在的钢针号,SK1表示B所在的钢针号:在这里插入图片描述
2)操作:A(i, j)表示把金片A从i号钢针移到j号钢针;B(i, j)表示把金片B从i号钢针移到j号钢针。
在这里插入图片描述
3)组成状态空间图:
在这里插入图片描述

二、盲目搜索

1.什么是搜索

人工智能所要解决的问题大部分是结构不良非结构化的问题,对这样的问题一般不存在成熟的求解算法可供利用,而只能是利用已有的知识一步步地摸索着前进。
搜索就是:根据实际问题,不断寻找可用知识确定推理路线,从而构造一条代价尽可能的少的路线,而问题又能得到圆满的解决

2.什么是盲目搜索

预先规定好控制策略进行搜索,在搜索过程中获取的中间信息不影响或改变控制策略,由于搜索总是按预先规定的路线进行,没有考虑到问题本身的特性,所以这种搜索具有盲目性,效率不高,不便于复杂问题的求解。
尽管盲目搜索的性能不如启发式搜索,但由于启发式搜索需要抽取与问题本身有关的特征信息,而这种特征信息的抽取往往又比较困难,因此盲目搜索仍不失为一种有用的搜索策略。

3.问题求解的性能

1)完备性:是否能找到解
2)最优性:找到最优解
3)时间复杂度:找到一个解花费时间
4)空间复杂度:需多少存储空间

4.一般的图搜索

1)基本思想:
先把问题的初始状态作为当前扩展节点对其进行扩展,生成一组子节点,然后检查问题的目标状态是否出现在这些子节点中。若出现,则搜索成功,找到了该问题的解;若没出现,则再按照某种搜索策略从已生成的子节点中选择一个节点作为当前扩展节点。重复上述过程,直到目标状态出现在子节点中或者没有可供扩展的节点为止。
2)数据结构:
Open表:
用于存放刚生成的节点,由于这些节点还没有进行扩
展,因此 也称为未扩展节点表;
Closed表:
用于存放已经扩展的节点,因此Closed表也称为已扩展节
点表。
在这里插入图片描述
3)搜索过程
①把初始节点S0放入OPEN表,并建立目前只包含S0的图,记为G。
②检查OPEN表是否为空,若为空则问题无解,退出。
③把OPEN表的第一个节点取出放入CLOSED表,并记该节点为节点n。
④考察节点n是否为目标节点。若是,则求得了问题的解,退出。
⑤扩展节点n,生成一组子节点。把其中不是节点n先辈的那些子节点记作集合M,并把这些子节点作为节点n的子节点加入G中。
针对M中子节点的不同情况,分别进行如下处理
A、对于那些未曾在G中出现过的M成员设置一个指向父节点(即节点n)的指针,并把它们放入OPEN表。
B、对于那些先前已在G中出现过的M成员,确定是否需要修改它指向父节点的指针(计算是否需要修改,涉及到节点和路径的代价,每次计算都要从S0算到目标节点)
C、对于那些先前已在G中出现并且已经扩展了的M成员,确定是否需要修改其后继节点指向父节点的指针(对于C这种情况,针对的是已扩展节点的后继节点不只一个父节点时,到后继节点的总代价可能因为B中修改而变化。即对于C这种情况,要先进行B的修改。)
按某种搜索策略对OPEN表中的节点进行排序
⑧转第(2)步。

5.关于一般图搜索的说明

1)状态空间搜索有通用性,之后的各种搜索策略都是特例,主要体现在Open表中节点排序不同,另外对于广搜这种一层一层的搜索,代价相同的情况下,也不涉及指针的修改。
2)一个节点经过一个算符只生产一个子节点,但是因为对于这个节点来说有很多个算符,此时就会有一组子节点,其中就有可能有父节点,祖父节点等,此时不能将这些先辈节点作为当前扩展节点的子节点。除此之外的节点记为集合M,加入图G中。
3)依据代价修改指针(表中的父节点)。
4)注意:搜索得到的图G和状态空间图时不一样的,由搜索图中所有节点以及反向指针构成的集合是搜索树
5)到目标节点的反向指针构成路径。
6)盲目搜索仅适用于状态空间是树状结构的问题,因此对于盲目搜索而言,不会出现修改指针的情况,每个子节点都是第一次出现的。

三、广度优先搜索

1.基本思想

从初始节点S0开始,逐层地对节点进行扩展并考察它是否为目标节点,在第n层的节点没有全部扩展并考察之前,不对第n+1层的节点进行扩展。OPEN表中的节点总是按进入的先后顺序排列,先进入的节点排在前面,后进入的排在后面。

2.搜索过程

①把初始节点S0放入OPEN表。
②如果OPEN表为空,则问题无解,退出。
③把OPEN表的第一个节点(记为节点n)取出放入CLOSED表。
④考察节点n是否为目标节点。若是,则求得了问题的解,退出。
⑤若节点n不可扩展,则转第②步。
⑥扩展节点n,将其子节点(不含先辈节点)放入OPEN表的尾部,并为每一个子节点都配置指向父节点的指针,然后转第②步。

3.优劣

①缺点:盲目性较大,当目标节点距离初始节点较远时将会产生许多无用节点,搜索效率低。而且写出Open表可以发现,若目标节点已经被扩展出来,但是没有判断(判断和扩展时在将节点放入Close表时进行的),在执行到判断目标节点的时候,多余已经执行了很多扩展的操作。
②优点:只要问题有解,用广度优先搜索总可以得到解,而且得到的是路径最短的解。

四、深度优先搜索

1.基本思想

从初始节点S0开始扩展,若没有得到目标节点,则选择最后产生的子节点进行扩展,若还是不能到达目标节点,则再对刚才最后产生的子节点进行扩展,一直如此向下搜索。当到达某个子节点,且该子节点既不是目标节点又不能继续扩展时,才选择其兄弟节点进行考察。

2.搜索过程

①把初始节点S0放入OPEN表。
②如果OPEN表为空,则问题无解,退出。
③把OPEN表的第一个节点(记为节点n)取出放入CLOSED表。
④考察节点n是否为目标节点。若是,则求得了问题的解,退出。
⑤若节点n不可扩展,则转第②步。
⑥扩展节点n,将其子节点放入到OPEN表的首部,并为其配置指向父节点的指针,然后转第②步。

3.深度优先局限性

深度优先相当于对优先某一个分支进行搜索,如果这个分支上没有解,或者时无限分支,那么就很难得到解或者根本得不到解,解得到了解有可能不是最优解。并不是一种完备的搜索算法。

4.有界深度优先搜索

1)对深度优先搜索引入搜索深度的界限(设为dm),当搜索深度达到了深度界限,而尚未出现目标节点时,就换一个分支进行搜索。搜索过程如下:
①把初始节点S0放入OPEN表中,置S0的深度d(S0)=0。
②如果OPEN表为空,则问题无解,退出。
③把OPEN表中的第一个节点(记为节点n)取出放入CLOSED表。
④考察节点n是否为目标节点。若是,则求得了问题的解,退出。
如果节点n的深度d(n)=dm,则转第②步。
⑥若节点n不可扩展,则转第②步。
⑦扩展节点n,将其子节点放入OPEN表的首部,并为其配置指向父节点的指针,并指定每一个子节点的深度为d(n)+1然后转第②步。
2)优化:
dm的选择:
先任意给定一个较小的数作为dm,然后进行上述的有界深度优先搜索,当搜索达到了指定的深度界限dm仍未发现目标节点,并且CLOSED表中仍有待扩展节点时,就将这些节点送回OPEN表。
最优解:
为找到最优解,可增设一个表(R),每找到一个目标节点后,就把它放入到R的前面,并令dm等于该目标节点所对应的路径长度,然后继续搜索。由于后求得的解的路径长度不会超过先求得的解的路径长度,所以最后求得的解一定是最优解。
在这里插入图片描述
例如如果S3和S5是目标节点,找到S3后,取Dm=3,R表中增加S3,继续搜索;找到S5,取Dm=2,R表中增加S5,解为S5。

五、代价树搜索

1.代价计算

1)代价树:边上标有代价(或费用)的树称为代价树。
2)代价树中,用c(x1,x2)表示从父节点x1到子节点x2的代价。
3)用g(x)表示从初始节点S0到节点x的代价。
4)代价计算公式:g(x2)=g(x1)+c(x1,x2)

2.代价树的广搜和深搜

代价树的搜索也只是Open表内的排序不一样,要先计算代价,然后根据一定规则进行排序。
1)广度搜索:OPEN表中的节点在任一时刻都是按其代价从小至大排序的,代价小的节点排在前面,代价大的节点排在后面,而不管节点在代价树中处于什么位置上。
2)深度搜索:刚扩展出的子节点中选一个代价最小的节点送入CLOSED表进行考察

  • 12
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值