1、人工智能实验报告人工智能实验报告 201131001XX3 XXXX 一、 专家系统实验 实验目的1. 理解并掌握基于规则系统的表示与推理2. 学会编写小型的生产式系统,理解正向推理和反向推理的过程以及两者的区别3. 学会设计简单的人机交互界面 实验内容动物识别专家系统是流行的专家系统实验模型,它用产生式规则来表示知识,共15条规则、可以识别七种动物,这些规则既少又简单,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则。 实验环境硬件环境:微型计算机;软件环境:Windows或其他操作系统,任选一种网络编程语言和数据库管理系统; 实验要求系统架构使用B/S模式,用
2、选定的网络编程语言建立推理机,用选定的数据库管理系统建立知识库和综合数据库,通过数据库管理系统与网络编程语言之间的接口实现推理机对知识库和综合数据库的访问,开发一个具有解析功能的基于Web的不精确推理专家系统。 实验效果 实验代码 实验原理动物识别专家系统是流行的专家系统实验模型,它用产生式规则来表示知识,共15条规则、可以识别七种动物,这些规则既少又简单,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则。动物识别15条规则:规则1:如果:动物有毛发则 :该动物是哺乳动物规则2: 如果:动物能产奶 则 :该单位是哺乳动物规则3: 如果:该动物有羽毛 则 :该动物是
3、鸟规则4: 如果:动物会飞,且会下蛋 则 :该动物是鸟规则5: 如果:动物吃肉 则 :该动物是肉食动物规则6: 如果:动物有犬齿,且有爪,且眼盯前方则 :该动物是食肉动物规则7: 如果:动物是哺乳动物,且有蹄 则 :该动物是有蹄动物规则8: 如果:动物是哺乳动物,且是反刍动物 则 :该动物是有蹄动物规则9: 如果:动物是哺乳动物,且是食肉动物,且是黄褐色的,且有暗斑点 则 :该动物是豹规则10: 如果:如果:动物是黄褐色的,且是哺乳动物,且是食肉,且有黑条纹 则 :该动物是虎规则11: 如果:动物有暗斑点,且有长腿,且有长脖子,且是有蹄类 则 :该动物是长颈鹿规则12: 如果:动物有黑条纹,且
4、是有蹄类动物 则 :该动物是斑马规则13: 如果:动物有长腿,且有长脖子,且是黑色的,且是鸟,且不会飞 则 :该动物是鸵鸟规则14: 如果:动物是鸟,且不会飞,且会游泳,且是黑色的 则 :该动物是企鹅规则15: 如果:动物是鸟,且善飞 则 :该动物是信天翁 核心代码 你的傻瓜动物识别系统 傻瓜动物识别系统 请输入特征一: 请输入特征二: 请输入特征三: 请输入特征四: function Check(f) if(f.password1.value=) alert(条件一不能为空); return false; return true; % List list=(List)request.getA
5、ttribute(list); if(list=null|list.size() 实验总结通过这次课程设计我对专业课的学习有了更加深刻的认识,让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一段美好的回忆。以后我要更加努力学好每门专业课,让自己 拥有更多的知识,才能解决更多问题。二、 五子棋实验 实验目的理解和掌握博弈树的启发式搜索过程和a-B剪枝技术,能够使用某程序语言开发一个五子棋博弈游戏; 实验环境在微型计算机上,任选一种编程语言; 实验要求设计一个15行1
6、5列棋盘,要求自行给出估价函数,按极大极小搜索方法,并采用a-B剪枝技术;采用人机对弈的方式,对弈双方设置不同的颜色的棋子,一方走完一方后,等待对方走步,对弈过程的每个棋局都在屏幕上显示出来。当某一方在横、竖或斜方向上先有5个棋子连成一线时,该方为赢。 实验效果 实验代码 防守策略落子的考虑不单单要从进攻考虑,还要从防守考虑。这一细节的实现其实就是让计算机从玩家棋盘布局分析战况,然后找出对玩家最有利的落子位置。整个过程如下:for ( m = 0; m GetColor(); step.x = i; step.y = j; ptemp = GiveScore( step ); if ( psc
7、ore ptemp ) / 此时为玩家下子,运用极 pscore = ptemp; 小极大法时应选取最小值for ( m = 0; m cscore )cscore = ctemp + pscore; bestx = pi; besty = pj;在这之后,重新改变一下棋盘的状态(4.3)即可。 落子打分找到空位后,需要对这个点的落子进行打分,这个分数也就是这个坐标重要性的体现,代码如下:int COneGame:GiveScore( const STEP& stepPut )int i, nScore = 0; for ( i = 0; i GetColor() = stepPut.colo
8、r ) if ( m_PlayerstepPut.xstepPut.yi ) / 玩家下 switch ( m_Win0i ) case 1: nScore -= 5; break; case 2: nScore -= 50; break; case 3: nScore -= 500; break; case 4: nScore -= 5000; break; default: break; else if ( m_ComputerstepPut.xstepPut.yi ) / 计算机下 switch ( m_Win1i ) case 1: nScore += 5; break; case 2
9、: nScore += 50; break; case 3: nScore += 100; break; case 4: nScore += 10000; break; default: break; return nScore;如代码所示,考虑到攻守两方面的需要,所以将玩家落子给的分数置为负值。 查找棋盘空位在计算机落子之前,需要查找棋盘的空位,所以需要一个SearchBlank成员函数完成此项工作,此函数需要进行不重复的查找,也就是说,对已查找过的空位进行标记,并返回找到空位的坐标,其代码如下:bool COneGame:SearchBlank( int &i, int &j, int n
10、owTable15 )int x, y; for ( x = 0; x 15; x+ ) for ( y = 0; y 15; y+ ) if ( nowTablexy = -1 & nowTablexy != 2 ) i = x; j = y; return true;return false; 落子后处理每当一方落子后,都需要作如下处理: 如果己方此坐标的获胜组合仍为true,且仍有可能在此获胜组合处添加棋子,则将此获胜组合添加棋子数加1;如果对方此坐标的获胜组合仍为true,则将对方此坐标的获胜组合置为false,并将对方此获胜组合添加棋子数置为-1。 以玩家落子为例,代码为:for (
11、 i = 0; i 572; i+ )if ( m_PlayerstepPut.xstepPut.yi &m_Win0i != -1 ) / 修改状态变化 m_Win0i+; if ( m_ComputerstepPut.xstepPut.yi ) m_ComputerstepPut.xstepPut.yi = false; m_Win1i = -1; 获胜组合获胜组合是一个三维数组,它记录了所有获胜的情况。也就是说,参考于Win中的情况,对于每一个落子坐标,获胜的情况一共有15 * 11 * 2 + 11 * 11 * 2 = 572种,而对于每个坐标的获胜组合,应该设置一个1515572大
12、小的三维数组。 在拥有了这些获胜组合之后,就可以参照每个坐标的572种组合给自己的局面和玩家的局面进行打分,也就是根据当前盘面中某一方所拥有的获胜组合多少进行权值的估算,给出最有利于自己的一步落子坐标。在每次游戏初始化(Init)的时候,需要将每个坐标下可能的获胜组合都置为true。 由于是双方对弈,所以游戏的双方都需要一份获胜组合,也就是:bool m_Computer1515572; / 电脑获胜组合bool m_Player1515572; / 玩家获胜组合 判断胜负五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的横竖斜四个方向是否有连续的五个同色棋子出现,如图1: 图1 这个算
13、法就是Win函数。从设计的思想上,需要它接受一个棋子的参数,然后返回一个值,这个值来指示是否胜利,代码如下:int x, y; for ( y = 0; y 15; y+ ) / 判断横向 for ( x = 0; x 11; x+ ) if ( color = m_dataxy &color = m_datax + 1y &color = m_datax + 2y &color = m_datax + 3y &color = m_datax + 4y ) return TRUE; for ( y = 0; y 11; y+ ) / 判断纵向 for ( x = 0; x 15; x+ ) i
14、f ( color = m_dataxy &color = m_dataxy + 1 &color = m_dataxy + 2 &color = m_dataxy + 3 &color = m_dataxy + 4 ) return TRUE; for ( y = 0; y 11; y+ ) / 判断“”方向 for ( x = 0; x 11; x+ ) if ( color = m_dataxy &color = m_datax + 1y + 1 &color = m_datax + 2y + 2 &color = m_datax + 3y + 3 &color = m_datax +
15、4y + 4 ) return TRUE; for ( y = 0; y 11; y+ ) / 判断“/”方向 for ( x = 4; x 15; x+ ) if ( color = m_dataxy &color = m_datax - 1y + 1 &color = m_datax - 2y + 2 &color = m_datax - 3y + 3 &color = m_datax - 4y + 4 ) return TRUE;return FALSE; / 不满足胜利条件需要说明的一点是,由于搜索顺序是从左到右、自上而下,因此在每次循环的时候,都有一些坐标无需纳入考虑范围。例如对于横
16、向判断而言,由于右边界所限,因而所有横坐标大于等于11的点,都构不成达到五子连的条件,所以横坐标的循环上界也就定为11,这样就提高了搜索的速度。 实验总结在刚开始编写这个程序的时候,我幼稚地认为其中最重要的是博弈算法。但是头几天编写程序的时候却发现程序越写越不容易维护,可见是我走错了方向。后来我向几位真正的高手讨教,他们告诉我:我们的先人早已为我们准备好了各种精良可用的现成算法,我们所要做的就是拿来主义;但是代码的组织(架构)才是真正的核心部分,因此我们必须在编写代码之前选择一种最为合适的方法来组织这些代码,否则我们将会失去很多的时间和金钱。 而在编程的过程中我也体会到了一点:学一门课程最重要的就是实践。通过这段时间的实践我发现自己进步了不少,也渐渐理解人工智能算法相对于其它算法的优点所在。虽然这个五子棋软件还存在着一些不足,但自己毕竟从中学到了不少的东西,得到了不少的东西。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2