人工智能实验报告知识表示方法及应用.docx
- 文档编号:8894271
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:12
- 大小:522.05KB
人工智能实验报告知识表示方法及应用.docx
《人工智能实验报告知识表示方法及应用.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告知识表示方法及应用.docx(12页珍藏版)》请在冰豆网上搜索。
人工智能实验报告知识表示方法及应用
人工智能上机实验报告
实验名称:
知识表示方法及应用实验日期2016年12月3日
1.实验目的:
(1)在掌握状态空间搜索策略的基础上,理解知识表示的方法。
(2)能够应用知识表示方法,解决实际问题。
2.实验内容:
(1)M-C问题描述
有n个牧师和n个野人准备渡河,但只有一条能容纳c个人的小船,为了防止野人侵犯牧师,要求无论在何处,牧师的人数不得少于野人的人数(除非牧师人数为0),且假定野人与牧师都会划船,试设计一个算法,确定他们能否渡过河去,若能,则给出小船来回次数最少的最佳方案。
(2)基本要求:
1.输入:
牧师人数(即野人人数):
n;小船一次最多载人量:
c。
2.输出:
若问题无解,则显示Failed,否则,显示Successed输出一组最佳方案。
用三元组(X1,X2,X3)表示渡河过程中的状态。
并用箭头连接相邻状态以表示迁移过程:
初始状态->中间状态->目标状态。
3.例:
当输入n=2,c=2时,输出:
221->110->211->010->021->000
4.其中:
X1表示起始岸上的牧师人数;X2表示起始岸上的野人人数;X3表示小船现在位置(1表示起始岸,0表示目的岸)。
5.要求:
写出算法的设计思想和源程序,并以图形用户界面实现人机交互,进行输入和输出结果,如:
Pleaseinputn:
2Pleaseinputc:
2
SuccessedorFailed?
:
Successed
OptimalProcedure:
221->110->211->010->021->000
3.算法设计
packagecn.xiaoyangege.mvc.yerenguohe;
//CrossRiverQuestion.java
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Scanner;
publicclassCrossRiverQuestion{
publicstaticvoidmain(String[]args){
Scannerscanner=newScanner(System.in);
intn=0;
intc=0;
Stringns=null;
Stringcs=null;
booleanflag;
do{
flag=false;
System.out.print("Pleaseinputn:
");
ns=scanner.nextLine();
System.out.print("Pleaseinputc:
");
cs=scanner.nextLine();
try{
n=Integer.(ns);
c=Integer.(cs);
}catch(NumberFormatExceptione){
System.out.println("输入不合法。
");
flag=true;
continue;
}
if(!
flag&&(n<0||c<0)){
System.out.println("输入不合法。
");
flag=true;
}
}while(flag);
scanner.close();
CrossRiverQuestionq=newCrossRiverQuestion(n,c);
q.solveQuestion();
}
privateintpeoNum;
privateintsavageNum;
privateList
publicList
Noden=newNode(peoNum,savageNum,0,0,0,newArrayList
0,0);
booleandfsResult=dfs(n);
System.out.print("SucceedorFailed?
:
");
if(dfsResult){
System.out.println("Succeed.");
System.out.print("OptimalProcedure:
");
resultList.add(0,n);
for(Nodenode:
resultList){
System.out.print(node.getLeftPeo()+""+node.getLeftSavage()
+""+(1-node.getCURR_STATE())+"-->");
}
System.out.println("End");
returnresultList;
}else{
System.out.println("Failed.");
}
returnnull;
}
publicCrossRiverQuestion(intpeoNum,intsavageNum){
super();
this.peoNum=peoNum;
this.savageNum=savageNum;
}
privatebooleandfs(Noden){
if(n.hasVisited()){
returnfalse;
}
n.addCheckSum();
if(n.getLeftPeo()==0&&n.getLeftSavage()==0){
returntrue;
}
if(n.getLeftPeo()<0||n.getRightPeo()<0||n.getLeftSavage()<0
||n.getRightSavage()<0){
returnfalse;
}
if(n.getLeftPeo()
returnfalse;
}
if(n.getRightPeo()
returnfalse;
}
if(n.getCURR_STATE()==n.getStateBoatLeft()){
Noden1=newNode(n.getLeftPeo()-1,n.getLeftSavage()-1,
n.getRightPeo()+1,n.getRightSavage()+1,
n.getStateBoatRight(),n.getNodesCheckSum(),1,1);
if(dfs(n1)){
resultList.add(0,n1);
returntrue;
}
Noden4=newNode(n.getLeftPeo()-2,n.getLeftSavage(),
n.getRightPeo()+2,n.getRightSavage(),
n.getStateBoatRight(),n.getNodesCheckSum(),2,0);
if(dfs(n4)){
resultList.add(0,n4);
returntrue;
}
Noden5=newNode(n.getLeftPeo(),n.getLeftSavage()-2,
n.getRightPeo(),n.getRightSavage()+2,
n.getStateBoatRight(),n.getNodesCheckSum(),0,2);
if(dfs(n5)){
resultList.add(0,n5);
returntrue;
}
}else{
Noden6=newNode(n.getLeftPeo(),n.getLeftSavage()+1,
n.getRightPeo(),n.getRightSavage()-1,
n.getStateBoatLeft(),n.getNodesCheckSum(),0,1);
if(dfs(n6)){
resultList.add(0,n6);
returntrue;
}
Noden7=newNode(n.getLeftPeo()+1,n.getLeftSavage(),
n.getRightPeo()-1,n.getRightSavage(),
n.getStateBoatLeft(),n.getNodesCheckSum(),1,0);
if(dfs(n7)){
resultList.add(0,n7);
returntrue;
}
Noden1=newNode(n.getLeftPeo()+1,n.getLeftSavage()+1,
n.getRightPeo()-1,n.getRightSavage()-1,
n.getStateBoatLeft(),n.getNodesCheckSum(),1,1);
if(dfs(n1)){
resultList.add(0,n1);
returntrue;
}
Noden4=newNode(n.getLeftPeo()+2,n.getLeftSavage(),
n.getRightPeo()-2,n.getRightSavage(),
n.getStateBoatLeft(),n.getNodesCheckSum(),2,0);
if(dfs(n4)){
resultList.add(0,n4);
returntrue;
}
Noden5=newNode(n.getLeftPeo(),n.getLeftSavage()+2,
n.getRightPeo(),n.getRightSavage()-2,
n.getStateBoatLeft(),n.getNodesCheckSum(),0,2);
if(dfs(n5)){
resultList.add(0,n5);
returntrue;
}
}
returnfalse;
}
publicList
returnresultList;
}
}
classNode{
privateList
privateintleftPeo;
privateintrightPeo;
privateintleftSavage;
privateintrightSavage;
privateintCURR_STATE=0;
privateintonBoatPeoNum=0;
privateintonBoatSavageNum=0;
privatefinalintSTATE_BOAT_LEFT=0;
privatefinalintSTATE_BOAT_RIGHT=1;
publicNode(intleftPeo,intleftSavage,intrightPeo,intrightSavage,
intstate,List
intonBoatSavageNum){
CURR_STATE=state;
this.leftPeo=leftPeo;
this.leftSavage=leftSavage;
this.rightPeo=rightPeo;
this.rightSavage=rightSavage;
nodesCheckSum.addAll(checkSumList);
this.onBoatPeoNum=onBoatPeoNum;
this.onBoatSavageNum=onBoatSavageNum;
}
publicintgetLeftPeo(){
returnleftPeo;
}
publicvoidsetLeftPeo(intleftPeo){
this.leftPeo=leftPeo;
}
publicintgetRightPeo(){
returnrightPeo;
}
publicvoidsetRightPeo(intrightPeo){
this.rightPeo=rightPeo;
}
publicintgetLeftSavage(){
returnleftSavage;
}
publicvoidsetLeftSavage(intleftSavage){
this.leftSavage=leftSavage;
}
publicintgetRightSavage(){
returnrightSavage;
}
publicvoidsetRightSavage(intrightSavage){
this.rightSavage=rightSavage;
}
@Override
publicStringtoString(){
returnleftPeo+","+leftSavage+","+rightPeo+","+rightSavage
+","+CURR_STATE;
}
publicintgetCURR_STATE(){
returnCURR_STATE;
}
publicvoidsetCURR_STATE(intcURR_STATE){
CURR_STATE=cURR_STATE;
}
publicintgetStateBoatLeft(){
returnSTATE_BOAT_LEFT;
}
publicintgetStateBoatRight(){
returnSTATE_BOAT_RIGHT;
}
publicintcalcCheckSum(){
return1*getCURR_STATE()+10*getLeftPeo()+100*getLeftSavage()
+1000*getRightPeo()+10000*getRightSavage();
}
publicvoidaddCheckSum(){
intcheckSum=calcCheckSum();
nodesCheckSum.add(checkSum);
}
publicbooleanhasVisited(){
intsum=calcCheckSum();
for(IntegercheckSum:
nodesCheckSum){
if(checkSum==sum){
returntrue;
}
}
returnfalse;
}
publicList
returnnodesCheckSum;
}
publicintgetOnBoatPeoNum(){
returnonBoatPeoNum;
}
publicvoidsetOnBoatPeoNum(intonBoatPeoNum){
this.onBoatPeoNum=onBoatPeoNum;
}
publicintgetOnBoatSavageNum(){
returnonBoatSavageNum;
}
publicvoidsetOnBoatSavageNum(intonBoatSavageNum){
this.onBoatSavageNum=onBoatSavageNum;
}
}
4.程序调试
(实验数据记录——根据程序要求输入几组不同数据,记录程序运行结果,并分析结果,分析程序运行中出现的主要错误。
或对其他程序环境的使用情况的记录。
注:
必须认真书写)
错误:
当输入不合法时,程序会抛出异常而终止运行。
于是改进程序如下:
5.讨论
(通过实验的一些体会、学会的知识和技能等)
(1)若代码所要实现的功能较多或者程序较为复杂,可先设计好程序的整体框架,画出流程图,然后依次编写代码分别实现上述功能,最后将各部分代码按照顺序结合起来,对各个参数稍加调试,便可得到清晰正确的程序。
(2)在用到循环或者递归等算法时,很容易出现对某一界限界定不明导致程序无法正常运行,而且这些疏漏之处往往是简短几步中不容易发现的,这就需要细心、耐心地梳理清楚各条脉络,找出问题所在。
(3)在编写程序时,应在方便的情况下尽可能使用同一种变量进行各步的运算,减少不必要的变量定义,以免造成代码过于混乱。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 实验 报告 知识 表示 方法 应用