人工智能57657238doc.docx
- 文档编号:14909522
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:25
- 大小:366.39KB
人工智能57657238doc.docx
《人工智能57657238doc.docx》由会员分享,可在线阅读,更多相关《人工智能57657238doc.docx(25页珍藏版)》请在冰点文库上搜索。
人工智能57657238doc
真空吸尘器问题
一实验目的
在人工智能领域,有一个重要部分,是研究智能化智能体的。
智能体可以被视为通过传感器感知所处环境并通过执行器对该环境产生作用的东西。
本实验分析真空吸尘器这个简单反射型智能体、环境以及它们之间的关系。
验证该吸尘器是否是理性智能体(行为表现尽可能好的智能体)。
二实验内容
1.智能体的描述
智能体可以被视为通过传感器感知所处环境并通过执行器对该环境产生作用的东西。
人类智能体具有眼睛、耳朵和其它器官作为传感器,也具有手、腿和身体的其它部位作为执行器。
机器人智能体则可能用摄像头、红歪测距仪作为传感器,各种马达作为执行器。
简单放射型智能体直接对感知信息做出反应。
图2—1智能体通过传感器和执行器与环境进行交互
2.真空吸尘器的描述
真空吸尘器属于简单智能体的一种,真空吸尘器世界只有两个地点:
A地点和B地点。
一个吸尘器智能体可以感知它处于哪个方格中,以及该地点是否有灰尘。
它可以选择向左移动,向右移动,吸取灰尘,或者什么也不做。
机器人所处位置有两种选择,要么在A,要么在B。
A、B两地点的状态分别有两种,干净或脏。
A、B两地具体状态及吸尘器的行动如下表:
序号
吸尘器所处位置
A地点状态
B地点状态
吸尘器的行动情况
1
A
干净
干净
没有地点需要清扫,吸尘器不动
2
A
干净
脏
清扫B地点,吸尘器不动
3
A
脏
干净
清扫A地点,吸尘器不动
4
A
脏
脏
先清扫A地点,再到达B地点,并清扫B地点
5
B
干净
干净
没有地点需要清扫
6
B
脏
干净
清扫A地点,吸尘器不动
7
B
干净
脏
清扫B地点,吸尘器不动
8
B
脏
脏
先清扫B地点,再到达A地点,并清扫A地点
表2—1A、B两地具体状态及吸尘器的行动
3.开发环境
所使用的软件:
VC++6.0
程序说明:
在程序中吸尘器所处位置用1、2表示,分别表示A、B两地。
A、B两地的状态用0、1表示,分别表示干净不需要清扫、脏需要清扫。
通过吸尘器对环境的判断得知A、B两地干净与否,再来回移动进行清扫。
4.吸尘器程序流程图
图2—2程序流程图
三实验结果分析
图3—1状态一
图3—1状态二
图3—1状态三
图3—1状态四
图3—1状态五
图3—1状态六
图3—1状态七
图3—1状态八
四收获与心得
本实验通过对简单智能体——真空吸尘器的研究,使我加深了对智能体、环境、性能度量等概念的理解。
通过传感器的感知可以得到环境的感知信息,智能体通过感知到的信息进行判断,再通过执行器行动,然后引起状态的变化,再反馈给环境。
在这个过程中,性能度量即智能体成功程度标准的具体化是重要的。
吸尘器是一个简单的反射型智能体,它通过传感器感知外面的环境是什么情况的,然后我们点一下“确定”按钮即执行器,执行行动,之后把状态反馈给环境。
由此可见,环境的变化引起智能体行动的变化,反过来,智能体的行动对环境也会产生影响,它们是联系在一起的。
这个程序的开发环境是VC++6.0,这也使我对VC软件的编程环境、编程方法等有了进一步的了解。
完成人工智能作业的同时,也学了一些VC的知识,这对我以后的学习会有很大帮助,也增强学VC的信心。
收获的同时,我也发现了自己学习中的不足,在以后的学习生活中一定改正。
另外,在实验的过程中,我得到了老师耐心细致的指导和同学热心的帮助,在这里对她们表示感谢!
八数码问题
一“八数码问题”的描述
八数码问题一般描述:
在3×3的方格棋盘上,分别放置标有数字1、2、3、4、5、6、7、8的八张牌,第九张牌不标数字,记为空格,空格用0表示,空格周围的棋子可以移动到空格中。
给定一种初始状态和目标状态,通过移动空格,使得棋盘从初始状态向目标状态转换(其中操作空格可用的操作有:
左移、上移、右移、下移,但不能移出棋盘之外),通过搜索策略寻找从初始状态到目标状态的解路径。
二“八数码问题”是否有解的判断
1.“八数码问题”是否有解的判断的目的:
有的八数码排列顺序是无解的,如果再进行搜索就会浪费很多时间,最终还得不到结果。
为了避免无解的情况下盲目搜索,判断是否有解是必要的。
2.八数码问题有解无解的结论:
一个状态表示成一维的形式,求出除0之外所有数字的逆序数之和,也就是每个数字前面比它大的数字的个数的和,称为这个状态的逆序。
若两个状态的逆序奇偶性相同,则可相互到达,否则不可相互到达。
可以证明,八码问题有解的充分必要条件是两个状态的逆序列奇偶性相同。
为此,无解判定问题转化为计算两个状态的逆序列奇偶性问题,由于原始状态的逆序为0(偶数),则逆序为偶数的状态有解。
也就是说,逆序的奇偶将所有的状态分为了两个等价类,同一个等价类中的状态都可相互到达。
3.简要说明:
当左右移动空格时,逆序不变。
当上下移动空格时,相当于将一个数字向前(或向后)移动两格,跳过的这两个数字要么都比它大(小),逆序可能±2;要么一个较大一个较小,逆序不变。
所以可得结论:
只要是相互可达的两个状态,它们的逆序奇偶性相同。
三“八数码问题”的搜索方法原理
搜索是人工智能中的一个基本问题,也是模拟仿真中研究的一般性问题,是推理不可分割的一部分。
现实世界中的大多数问题都是结构不良或非结构化的问题,一般不存在现成的求解方法,而只能利用已有的知识一步步地摸索着前进。
解决八数码问题的常用方法为图搜索法,可用无信息搜索算法(包括广度优先搜索、代价一致搜索、深度优先搜索、深度有限搜索、迭代深入搜索、双向搜索)和有信息搜索算法(包括贪婪最佳优先搜索、A*算法、递归最佳优先搜索)实现,其中A*算法又因评价函数的不同而有着不同的搜索时间。
1.无信息搜索(盲目搜索Uninformedsearch),即问题中提供的定义之外没有任何关于状态的附加信息。
可以做的事情只能是生成后继,并区分目标状态与非目标状态。
(1)广度优先搜索(BroadthFirstSearch,BFS):
首先扩展根节点,接着扩展根节点的所有后继,然后再扩展它们的后继,依此类推。
通常,在下一层的任何节点扩展之前搜索树上层深度的所有节点都已经扩展过了。
图2—1广度优先搜索搜索顺序
该算法可以使用FIFO队列实现,初始时将开始结点放入队列中,每次取队头结点,判断是否为终结点,不是则将其所有子结点放入队列尾,直到队列为空或者找到目标结点为止。
如果目标结点在深度d,那么该算法扩展完深度小于d的结点后就将找到目标结点。
而且,显然这是最优的。
容易观察到,在根节点的第一子层有b个结点,第二子层有b2,然后b3,以此类推。
在最坏情况下,我们将扩展为目标结点前的所有结点,在d+1层扩展bd+1-b个,那么将总共扩展:
b+b2+b3+……+bd+(bd+1-b)=O(bd+1)
由此可见,该算法的空间要求是相当高的。
广度优先搜索算法伪代码描述如下(队列实现):
StatusBFS(){
Push_back(begin);
do{
CurrentState=Top();
Pop();
if(Solution(CurrentState))
returnSuccess;
foreachsuccessorofCurrentStatedo
if(!
Exist(successor))
Push_back(successor);
}while(!
Empty());
ReturnNoAnswer;
}
(2)深度优先搜索(DepthFirstSearch,DFS):
总是扩展搜索树当前边缘中最深的节点。
搜索直接推进到搜索树的最深层,那里的节点没有后继节点。
当那些节点扩展完之后,它们被从边缘中去掉,然后搜索算法“向上回到”下一个还有未扩展后继节点的稍浅的节点。
图2—2深度优先搜索搜索顺序
深度优先算法伪代码描述如下(堆栈实现):
StatusDFS(){
Push(begin);
do{
CurrentState=Pop();
if(Solution(CurrentState))
returnSuccess;
foreachsuccessorofCurrentStatedo
if(!
Exist(successor))
Push(successor);
}while(!
Empty());
returnNoAnswer;
}
(3)深度有限搜索:
(DepthLimitedSearch,DLS):
无边界的搜索树问题可以通过对深度优先搜索提供一个预先设定的深度限制L来解决。
就是说,深度为L的节点被当作没有后继的节点对待。
2.有信息搜索,是一种在问题本身定义之外还利用问题的特定知识的搜索策略—如何能够比无信息的搜索策略更有效地找到解。
A*搜索算法:
最佳优先搜索最广为人知的形式称为A*搜索,它把到达节点的耗散g(n)和从该节点到目标节点的消耗h(n)结合起来,对节点进行评价:
f(n)=g(n)+h(n)。
因此,此搜索策略是基于每个扩展点的评价函数进行选择,即评选出最佳的节点扩展搜索。
A*算法属于一种启发式搜索,它扩展结点的次序类似于广度优先搜索,但不同的是每生成一个子结点需要计算估价函数f,以估算起始结点的约束经过该结点至达目标结点的最佳路径代价;每当扩展结点时,意是在所有待扩展结点中选择具有最小f值的结点做为扩展对象,以便使搜索尽量沿最有希望的方向进行。
A*算法只要求产生问题的全部状态空间的部分结点及关系,就可以求解问题了,搜索效率较高。
A*搜索算法伪代码描述如下(优先队列实现-priority_queue):
StatusGreedy-Search(){
priority_queueQ;
begin.f=h(begin);
Q.Push_back(begin);
do{
CurrentState=Q.Top();
Q.Pop();
if(Solution(CurrentState))
returnSuccess;
foreachsuccessorofCurrentStatedo
if(!
Exist(successor)){
successor.f=successor.g+h(successor);
Q.Push_back(successor);
}
}while(!
Q.Empty());
returnNoAnswer;
}
四所用程序相关说明
1.使用软件:
VC++6.0
2.具体内容:
在这个程序中,分别用广度优先、深度优先和A*算法实现了八数码问题,初始状态值和目标状态值自己任意设定,空格周围的棋子可以移动到空格中,一步一步往下进行,直至达到目标状态,搜索过程中的每一步都有显示,这样更便于理解每一步的运行情况。
另外,此程序除了实现了八数码问题求解外,还推广应用于16数码问题,即在4×4的方格棋盘上,分别放置标有数字1、2、3、4、5、6、7、8、9、A、B、C、D、E、F的十五张牌,第十六张牌不标数字,记为空格,空格用0表示,空格周围的棋子可以移动到空格中。
五实验结果分析
1.实验结果图如下:
图5-1广度优先搜索算法(无解情况)
图5-2广度优先搜索算法(八数码)
图5-3广度优先搜索算法(十六数码)
图5-4深度优先搜索算法(无解情况)
图5-5深度优先搜索算法(八数码)
图5-6深度优先搜索算法(十六数码)
图5-7A*搜索算法(无解情况)
图5-8A*搜索算法(八数码)
图5-9A*搜索算法(十六数码)
2.三种算法的优缺点简评:
三种算法在一定条件下均可得到八数码问题的解。
前两种是经典的无信息(盲目)搜索算法,后一种是经典的有信息(启发式)搜索算法。
从本文的实验可以看出,广度优先搜索是一种完备策略,即只要问题有解,它就一定可以找到解。
并且,广度优先搜索找到的解,还一定是路径最短的解。
这些都是广度优先搜索的优点。
当然,广度优先搜索也存在很多缺点,主要缺点是盲目性较大,尤其是当目标行点距初始节点较远时,将产生许多无用的节点,因此其搜索效率较低,虽然相对于计算机飞速发展的运算速度来讲,这已经不是关键问题,但仍是下一步有待改进的方面。
对于八数码问题,深度优先搜索对内存的需求很少,它的缺点是它有可能错误地选择一条分支并且沿着一条很长的(甚至是无限的)路径一直走下去,因此,它是不完备的,不是最优的,一般不能保证得到最优解。
A*搜索是完备的,与使用无信息搜索相比,使用好的启发式还是能节省大量的时间和空间。
但它又与其启发式函数息息相关,无法保证得到最优解。
A*算法可以消耗较少的空间解决问题,但是由于每次选择均需要寻找评价函数最小的节点,因此当深度增加相应的节点数目增加时,A*算法在时间上并不占优势。
然而,A*算法总可以在有限的时间内得到问题的解。
结束语
本实验旨在讨论八数码(及十六数码)难题几种不同的实现方法,并且通过程序对它们进行比较、分析和讨论,总结出三种算法的优缺点。
通过对本课题的探讨,使我对人工智能这一领域有了更深的了解和认识。
虽然我只是讨论了人工智能的一个核心部分——搜索,及一个主要应用领域——问题求解(主要针对八数码难题),但在这个过程中还是取得了很大的收获。
实验中还存在许多不足,有待于今后的进一步改进。
另外,在这两个实验的过程中,我得到了老师耐心的指导和同学们热心的帮助,在这里对她们表示深深的感谢!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 57657238 doc
![提示](https://static.bingdoc.com/images/bang_tan.gif)