2017中南大学人工智能实验报告.docx_第1页
2017中南大学人工智能实验报告.docx_第2页
2017中南大学人工智能实验报告.docx_第3页
2017中南大学人工智能实验报告.docx_第4页
2017中南大学人工智能实验报告.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

“人工智能”实验报告专 业: 班 级: 学 号: 姓 名: 2017年4月 日实验一 搜索策略(一)实验内容1.熟悉和掌握启发式搜索的定义、估价函数和算法过程;比较不同算法的性能。2.修改八数码问题或路径规划问题的源程序,改变其启发函数定义,观察结果的变化,分析原因。(二)实验思路1.利用已有程序“search.jar”,利用已有的“简单搜索树”图或自行构建一个图,选择DFS/BFS/Lowest Cost First/Best-First/Heuristic Depth First/A*等不同的搜索策略,观察程序运行中,OPEN表和CLOSED表的变化,观察搜索过程的变化,理解各个算法的原理。2.任选八数码问题或路径规划问题的源程序,思考程序如何解决该问题,并对其启发函数进行修改,观察结果的变化,并分析原因(三)程序清单此处我选择了路径规划问题:由于篇幅原因,只附上启发函数的定义部分。原启发函数:float MapSearchNode:GoalDistanceEstimate( MapSearchNode &nodeGoal )float xd = fabs(float(float)x - (float)nodeGoal.x);float yd = fabs(float(float)y - (float)nodeGoal.y);return (xd + yd);第一次修改后的启发函数:float MapSearchNode:GoalDistanceEstimate( MapSearchNode &nodeGoal )float xd = fabs(float(float)x - (float)nodeGoal.x);float yd = fabs(float(float)y - (float)nodeGoal.y);float d=sqrt(xd*xd+yd*yd);return d;第二次修改后的启发函数:float MapSearchNode:GoalDistanceEstimate( MapSearchNode &nodeGoal )float xd = fabs(float(float)x - (float)nodeGoal.x);float yd = fabs(float(float)y - (float)nodeGoal.y);float d=3*sqrt(xd*xd+yd*yd);return d;第三次修改后的启发函数:float MapSearchNode:GoalDistanceEstimate( MapSearchNode &nodeGoal )float xd = fabs(float(float)x - (float)nodeGoal.x);float yd = fabs(float(float)y - (float)nodeGoal.y);float d=xd*xd+yd*yd;return d;(四)运行结果说明1.首先对实验内容1进行说明图一图一展示A*算法的搜索过程(此处的g(n),h(n)由系统自动给定),绿色表示可拓展节点(在OPEN表内),灰色表示已扩展结点(CLOSED表),没有颜色表示未入表,红色代表当前路径由课上学习我们易知f(n)= g(n)+h(n)下面我们通过改变g(n),h(n)来验证上式是否成立。图二图二为图一的放大图,我们可以看出f(Node1)= g(Node1) +h(Node1)=26.9+56.8=83.7f(Node2)= g(Node2) +h(Node2)=34.2+31.5=65.7显然f(Node1) f(Node2),因此由A*算法,我们选择Node2图三在图三中,我修改了Node2的启发值,其他不变f(Node1)= g(Node1) +h(Node1)=26.9+56.8=83.7f(Node2)= g(Node2) +h(Node2)=34.2+100.0=134.2显然f(Node1)f(Node2),因此由A*算法,我们选择Node1 图四在图四中,我修改了Node2的当前路径值,其他不变f(Node1)= g(Node1) +h(Node1)=26.9+56.8=83.7f(Node2)= g(Node2) +h(Node2)=100.0+31.5=131.5显然f(Node1)3后搜索次数表现良好,为什么我们不把sqrt函数去掉,采用平方后的欧几里得距离呢?这样不是省去了平方根的耗时计算吗?我认为这样有一个很严重的问题,它会导致启发式函数的估价值过高,也就是h(n)过高,有退化成Gready Best-First-Search的危险实验二 推理技术(一)实验内容对已有的产生式系统(默认的例子)进行演示,同时可以更改其规则库或(和)事实库,进行正反向推理,了解其推理过程和机制。自己建造产生式系统(包括规则库和事实库),然后进行推理,即可以自己输入任何的规则和事实,并基于这种规则和事实进行推理。这为学生亲手建造产生式系统并进行推理提供了一种有效的实验环境。(二)实验思路 利用已有程序”Tree.jar”,读取现有知识数据库,对默认的例子进行演示,同时改变其规则库,了解其推理过程(三)程序清单 本实验不需要编程(四)运行结果说明图八图八展示了推理成功的结果,程序进行的是逆向链接推理。首先假设这一只动物是虎。为了检验这个假设,根据规则,要求虎是哺乳动物,食肉动物,黄褐色且身上有黑色条纹。那么我们首先检验这个动物是否是哺乳动物,由规则库,是哺乳动物的动物必须有毛发,或者有奶。我们可以发现将哺乳动物替换成有毛发和有奶都无法继续执行下去。由规则库,我们观察可知虎是哺乳动物,因此消去这一条件。接下来只剩下了是肉食动物,是黄褐色,身上有黑色条纹。我们都可以在规则库中发现这些子句,故可以顺利消解,生成NIL,即推理成功图九-1图九-1展示了推理失败的结果从假设该动物是长颈鹿开始,最终无法得到结果,因为规则库没有相应子句可供消解。 图九-2图九-2展示了此时规则库中相应子句的情况,可以发现子句前有%存在使得子句无法被使用。那么现在我们可以对规则库进行修改,使得该推理成功。图十-1图十-1展示了经过修改规则库后,成功的结果图十-2图十-2表示修改规则库后的情况,我们可以与图九-2对比,显然仅仅修改了“%”即可。实验三 神经网络(一)实验内容1.通过BP网络各项参数的不同设置,观察BP算法的学习效果。观察比较BP网络 拓朴结构及其它各项参数变化对于训练结果的影响。观察并分析不同训练数据对相同拓朴结构的BP网络建模的影响。2.编写简单的感知器训练算法,实现简单的逻辑运算(与、或)(二)实验思路1. 利用已有程序“neural.jar”,通过载入已有BP网络,观察BP算法的学习效果,比较各项参数变化对于训练结果的影响。2.根据课上学习内容,编写简单的感知器训练算法。(三)程序清单 #include #include using namespace std;const unsigned int nTests =4; /训练数据的数量const unsigned int nInputs =2; /输入端的数量const double alpha =0.3; /学习参数double weight1nInputs=0.0;double weight2nInputs=0.0;double b=-0.8; /阈值设为-0.8struct slp double inputsnInputs; double output;/计算输出值double compute(double *inputs,double * weights,double b) double sum =0.0; for (int i = 0 ; i nInputs; +i) sum += weightsi*inputsi; /bias sum +=b; return sum;int main() /* *正确的“与”操作,“或”操作的训练数据,也就是所谓的“target” */slp yunTests = 0.0,0.0,0.0, 0.0,1.0,0.0, 1.0,0.0,0.0, 1.0,1.0,1.0;slp huonTests = 0.0,0.0,0.0, 0.0,1.0,1.0, 1.0,0.0,1.0, 1.0,1.0,1.0; bool bLearningOK = false; int count1=0; /感知器“与”操作学习算法 while(!bLearningOK) bLearningOK = true; for (int i = 0 ; i 0) weight10=weight10+alpha*(yui.output-output)*yui.inputs0; weight11=weight11+alpha*(yui.output-output)*yui.inputs1; output = compute(yui.inputs,weight1,b); count1 +; if(count1 500) cout请重设参数endl; exit(0); if(i=3) while(output500) cout请重设参数=0) /cout500) cout请重设参数endl; exit(0); for (int i = 1 ; i 4 ; i+) double output = compute(huoi.inputs,weight2,b); while(output500) cout请重设参数endl; exit(0); cout学习数据:endl; for(int w = 0 ; w nInputs ; +w) coutyu_weightw:weight1w endl; coutn; for (int i = 0 ;i nTests ; +i) coutyu_rightresult:yui.outputt; coutyu_caculateresult: compute(yui.inputs,weight1,b)endl; for(int w = 0 ; w nInputs ; +w) couthuo_weightw:weight2w endl; coutn; for (int i = 0 ;i nTests ; +i) couthuo_rightresult:huoi.outputt; couthuo_caculateresult: compute(huoi.inputs,weight2,b)endl; coutendl学习完毕,请输入两个值:test0test1; double yu_result;double huo_result; if(compute(test,weight1,b)0) yu_result=1; else yu_result=0; if(compute(test,weight2,b)0) huo_result=1; else huo_result=0; cout与操作结果:yu_resultendl; cout或操作结果:huo_resultendl; return 0;(四)运行结果说明1.先对第一个实验内容进行说明,此处我选择了异或问题进行实验图十一 图十一展示了未经训练的情况。未经训练我们可以很容易的发现,其值固定在0.30左右,也就是说程序初始权重应该为0,0,阈值为0.3左右;未经训练结果显然是错误的图十二图十二展示了经过训练后,误差率的变化情况。可以发现,训练50次后,误差率在0.7左右,训练100次后误差率在0.6左右,训练200次后误差率已经降到了比较

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论