人工智能实验报告.docx

上传人:b****3 文档编号:10286253 上传时间:2023-05-24 格式:DOCX 页数:16 大小:503.92KB
下载 相关 举报
人工智能实验报告.docx_第1页
第1页 / 共16页
人工智能实验报告.docx_第2页
第2页 / 共16页
人工智能实验报告.docx_第3页
第3页 / 共16页
人工智能实验报告.docx_第4页
第4页 / 共16页
人工智能实验报告.docx_第5页
第5页 / 共16页
人工智能实验报告.docx_第6页
第6页 / 共16页
人工智能实验报告.docx_第7页
第7页 / 共16页
人工智能实验报告.docx_第8页
第8页 / 共16页
人工智能实验报告.docx_第9页
第9页 / 共16页
人工智能实验报告.docx_第10页
第10页 / 共16页
人工智能实验报告.docx_第11页
第11页 / 共16页
人工智能实验报告.docx_第12页
第12页 / 共16页
人工智能实验报告.docx_第13页
第13页 / 共16页
人工智能实验报告.docx_第14页
第14页 / 共16页
人工智能实验报告.docx_第15页
第15页 / 共16页
人工智能实验报告.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

人工智能实验报告.docx

《人工智能实验报告.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告.docx(16页珍藏版)》请在冰点文库上搜索。

人工智能实验报告.docx

人工智能实验报告

人工智能实验报告

201131001XX3XXXX

一、专家系统实验

Ø实验目的

1.理解并掌握基于规则系统的表示与推理

2.学会编写小型的生产式系统,理解正向推理和反向推理的过程以及两者的区别

3.学会设计简单的人机交互界面

Ø实验内容

动物识别专家系统是流行的专家系统实验模型,它用产生式规则来表示知识,共15条规则、可以识别七种动物,这些规则既少又简单,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则。

Ø实验环境

硬件环境:

微型计算机;

软件环境:

Windows或其他操作系统,任选一种网络编程语言和数据库管理系统;

Ø实验要求

系统架构使用B/S模式,用选定的网络编程语言建立推理机,用选定的数据库管理系统建立知识库和综合数据库,通过数据库管理系统与网络编程语言之间的接口实现推理机对知识库和综合数据库的访问,开发一个具有解析功能的基于Web的不精确推理专家系统。

Ø实验效果

Ø实验代码

⏹实验原理

动物识别专家系统是流行的专家系统实验模型,它用产生式规则来表示知识,共15条规则、可以识别七种动物,这些规则既少又简单,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则。

动物识别15条规则:

规则1:

如果:

动物有毛发

则:

该动物是哺乳动物

规则2:

如果:

动物能产奶

则:

该单位是哺乳动物

规则3:

如果:

该动物有羽毛

则:

该动物是鸟

规则4:

如果:

动物会飞,且会下蛋

则:

该动物是鸟

规则5:

如果:

动物吃肉

则:

该动物是肉食动物

规则6:

如果:

动物有犬齿,且有爪,且眼盯前方

则:

该动物是食肉动物

规则7:

如果:

动物是哺乳动物,且有蹄

则:

该动物是有蹄动物

规则8:

如果:

动物是哺乳动物,且是反刍动物

则:

该动物是有蹄动物

规则9:

如果:

动物是哺乳动物,且是食肉动物,且是黄褐色的,且有暗斑点

则:

该动物是豹

规则10:

如果:

如果:

动物是黄褐色的,且是哺乳动物,且是食肉,且有黑条纹

则:

该动物是虎

规则11:

如果:

动物有暗斑点,且有长腿,且有长脖子,且是有蹄类

则:

该动物是长颈鹿

规则12:

如果:

动物有黑条纹,且是有蹄类动物

则:

该动物是斑马

规则13:

如果:

动物有长腿,且有长脖子,且是黑色的,且是鸟,且不会飞

则:

该动物是鸵鸟

规则14:

如果:

动物是鸟,且不会飞,且会游泳,且是黑色的

则:

该动物是企鹅

规则15:

如果:

动物是鸟,且善飞

则:

该动物是信天翁

⏹核心代码

你的傻瓜动物识别系统

傻瓜动物识别系统

请输入特征一:

请输入特征二:

请输入特征三:

请输入特征四:

functionCheck(f){

if(f.password1.value===""){

alert("条件一不能为空");

returnfalse;

}

returntrue;

}

<%

Listlist=(List)request.getAttribute("list");

if(list==null||list.size()<1){

out.print("");

}else{

for(Regularregular:

list){

%>

<%=regular.getResult()%>

<%=regular.getTest()%>

<%

}

}

%>

Ø实验总结

通过这次课程设计我对专业课的学习有了更加深刻的认识,让我知道了学无止境的道理。

我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座峰的后面还有更高的山峰在等着你。

挫折是一份财富,经历是一份拥有。

这次课程设计必将成为我人生旅途上一段美好的回忆。

以后我要更加努力学好每门专业课,让自己拥有更多的知识,才能解决更多问题。

二、五子棋实验

Ø实验目的

理解和掌握博弈树的启发式搜索过程和a-B剪枝技术,能够使用某程序语言开发一个五子棋博弈游戏;

Ø实验环境

在微型计算机上,任选一种编程语言;

Ø实验要求

设计一个15行15列棋盘,要求自行给出估价函数,按极大极小搜索方法,并采用a-B剪枝技术;

采用人机对弈的方式,对弈双方设置不同的颜色的棋子,一方走完一方后,等待对方走步,对弈过程的每个棋局都在屏幕上显示出来。

当某一方在横、竖或斜方向上先有5个棋子连成一线时,该方为赢。

Ø实验效果

Ø实验代码

⏹防守策略

落子的考虑不单单要从进攻考虑,还要从防守考虑。

这一细节的实现其实就是让计算机从玩家棋盘布局分析战况,然后找出对玩家最有利的落子位置。

整个过程如下:

for(m=0;m<572;m++)

{if(m_Player[i][j][m])//暂时更改玩家信息

{temp1[n]=m;

m_Player[i][j][m]=false;

temp2[n]=m_Win[0][m];

m_Win[0][m]=-1;

n++;}}

ptempTable[i][j]=0;

pi=i;

pj=j;

while(SearchBlank(i,j,ptempTable))

{ptempTable[i][j]=2;//标记已被查找

step.color=m_pTable->GetColor();

step.x=i;

step.y=j;

ptemp=GiveScore(step);

if(pscore>ptemp)//此时为玩家下子,运用极

pscore=ptemp;}小极大法时应选取最小值

for(m=0;m

{m_Player[pi][pj][temp1[m]]=true;//恢复玩家信息

m_Win[0][temp1[m]]=temp2[m];}

⏹选取最佳落子

在循环结束的时候,就可以根据攻、守两方面的打分综合地考虑落子位置了。

代码如下:

if(ctemp+pscore>cscore)

{cscore=ctemp+pscore;

bestx=pi;

besty=pj;}

在这之后,重新改变一下棋盘的状态(4.3)即可。

⏹落子打分

找到空位后,需要对这个点的落子进行打分,这个分数也就是这个坐标重要性的体现,代码如下:

intCOneGame:

:

GiveScore(constSTEP&stepPut)

{inti,nScore=0;

for(i=0;i<572;i++)

{if(m_pTable->GetColor()==stepPut.color)

{if(m_Player[stepPut.x][stepPut.y][i])//玩家下

{switch(m_Win[0][i])

{case1:

nScore-=5;

break;

case2:

nScore-=50;

break;

case3:

nScore-=500;

break;

case4:

nScore-=5000;

break;

default:

break;}}}

else

{if(m_Computer[stepPut.x][stepPut.y][i])//计算机下

{switch(m_Win[1][i])

{case1:

nScore+=5;

break;

case2:

nScore+=50;

break;

case3:

nScore+=100;

break;

case4:

nScore+=10000;

break;

default:

break;}}}}

returnnScore;

}

如代码所示,考虑到攻守两方面的需要,所以将玩家落子给的分数置为负值。

⏹查找棋盘空位

在计算机落子之前,需要查找棋盘的空位,所以需要一个SearchBlank成员函数完成此项工作,此函数需要进行不重复的查找,也就是说,对已查找过的空位进行标记,并返回找到空位的坐标,其代码如下:

boolCOneGame:

:

SearchBlank(int&i,int&j,intnowTable[][15])

{intx,y;

for(x=0;x<15;x++)

{for(y=0;y<15;y++)

{if(nowTable[x][y]==-1&&nowTable[x][y]!

=2)

{i=x;

j=y;

returntrue;}}}

returnfalse;}

⏹落子后处理

每当一方落子后,都需要作如下处理:

如果己方此坐标的获胜组合仍为true,且仍有可能在此获胜组合处添加棋子,则将此获胜组合添加棋子数加1;如果对方此坐标的获胜组合仍为true,则将对方此坐标的获胜组合置为false,并将对方此获胜组合添加棋子数置为-1。

以玩家落子为例,代码为:

for(i=0;i<572;i++)

{if(m_Player[stepPut.x][stepPut.y][i]&&m_Win[0][i]!

=-1)//修改状态变化

m_Win[0][i]++;

if(m_Computer[stepPut.x][stepPut.y][i])

{m_Computer[stepPut.x][stepPut.y][i]=false;

m_Win[1][i]=-1;}}

⏹获胜组合

获胜组合是一个三维数组,它记录了所有获胜的情况。

也就是说,参考于Win中的情况,对于每一个落子坐标,获胜的情况一共有15*11*2+11*11*2=572种,而对于每个坐标的获胜组合,应该设置一个[15][15][572]大小的三维数组。

在拥有了这些获胜组合之后,就可以参照每个坐标的572种组合给自己的局面和玩家的局面进行打分,也就是根据当前盘面中某一方所拥有的获胜组合多少进行权值的估算,给出最有利于自己的一步落子坐标。

在每次游戏初始化(Init)的时候,需要将每个坐标下可能的获胜组合都置为true。

由于是双方对弈,所以游戏的双方都需要一份获胜组合,也就是:

boolm_Computer[15][15][572];//电脑获胜组合

boolm_Player[15][15][572];//玩家获胜组合

⏹判断胜负

五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的横竖斜四个方向是否有连续的五个同色棋子出现,如图1:

图1

这个算法就是Win函数。

从设计的思想上,需要它接受一个棋子的参数,然后返回一个值,这个值来指示是否胜利,代码如下:

intx,y;

for(y=0;y<15;y++)//判断横向

{for(x=0;x<11;x++)

{if(color==m_data[x][y]&&color==m_data[x+1][y]&&color==m_data[x+2][y]&&color==m_data[x+3][y]&&color==m_data[x+4][y])

{returnTRUE;}}}

for(y=0;y<11;y++)//判断纵向

{for(x=0;x<15;x++)

{if(color==m_data[x][y]&&color==m_data[x][y+1]&&color==m_data[x][y+2]&&color==m_data[x][y+3]&&color==m_data[x][y+4])

{returnTRUE;}}}

for(y=0;y<11;y++)//判断“\”方向

{for(x=0;x<11;x++)

{if(color==m_data[x][y]&&color==m_data[x+1][y+1]&&color==m_data[x+2][y+2]&&color==m_data[x+3][y+3]&&color==m_data[x+4][y+4])

{returnTRUE;}}}

for(y=0;y<11;y++)//判断“/”方向

{for(x=4;x<15;x++)

{if(color==m_data[x][y]&&color==m_data[x-1][y+1]&&color==m_data[x-2][y+2]&&color==m_data[x-3][y+3]&&color==m_data[x-4][y+4])

{returnTRUE;}}}

returnFALSE;//不满足胜利条件

需要说明的一点是,由于搜索顺序是从左到右、自上而下,因此在每次循环的时候,都有一些坐标无需纳入考虑范围。

例如对于横向判断而言,由于右边界所限,因而所有横坐标大于等于11的点,都构不成达到五子连的条件,所以横坐标的循环上界也就定为11,这样就提高了搜索的速度。

Ø实验总结

在刚开始编写这个程序的时候,我幼稚地认为其中最重要的是博弈算法。

但是头几天编写程序的时候却发现程序越写越不容易维护,可见是我走错了方向。

后来我向几位真正的高手讨教,他们告诉我:

我们的先人早已为我们准备好了各种精良可用的现成算法,我们所要做的就是拿来主义;但是代码的组织(架构)才是真正的核心部分,因此我们必须在编写代码之前选择一种最为合适的方法来组织这些代码,否则我们将会失去很多的时间和金钱。

而在编程的过程中我也体会到了一点:

学一门课程最重要的就是实践。

通过这段时间的实践我发现自己进步了不少,也渐渐理解人工智能算法相对于其它算法的优点所在。

虽然这个五子棋软件还存在着一些不足,但自己毕竟从中学到了不少的东西,得到了不少的东西。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2