人工智能实验报告知识表示方法及应用文档格式.docx
《人工智能实验报告知识表示方法及应用文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告知识表示方法及应用文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
110->
211->
010->
021->
000
4.其中:
X1表示起始岸上的牧师人数;
X2表示起始岸上的野人人数;
X3表示小船现在位置(1表示起始岸,0表示目的岸)。
5.要求:
写出算法的设计思想和源程序,并以图形用户界面实现人机交互,进行输入和输出结果,如:
Pleaseinputn:
2Pleaseinputc:
2
SuccessedorFailed?
:
Successed
OptimalProcedure:
221->
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("
"
);
ns=scanner.nextLine();
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)){
}while(flag);
scanner.close();
CrossRiverQuestionq=newCrossRiverQuestion(n,c);
q.solveQuestion();
}
privateintpeoNum;
privateintsavageNum;
privateList<
Node>
resultList=newArrayList<
();
publicList<
solveQuestion(){
Noden=newNode(peoNum,savageNum,0,0,0,newArrayList<
Integer>
(),
0,0);
booleandfsResult=dfs(n);
System.out.print("
SucceedorFailed?
"
if(dfsResult){
System.out.println("
Succeed."
resultList.add(0,n);
for(Nodenode:
resultList){
System.out.print(node.getLeftPeo()+"
+node.getLeftSavage()
+"
+(1-node.getCURR_STATE())+"
-->
End"
returnresultList;
}else{
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){
n.getLeftSavage()&
n.getLeftPeo()>
if(n.getRightPeo()<
n.getRightSavage()&
n.getRightPeo()>
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);
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);
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);
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);
Noden1=newNode(n.getLeftPeo()+1,n.getLeftSavage()+1,
n.getRightPeo()-1,n.getRightSavage()-1,
n.getStateBoatLeft(),n.getNodesCheckSum(),1,1);
Noden4=newNode(n.getLeftPeo()+2,n.getLeftSavage(),
n.getRightPeo()-2,n.getRightSavage(),
n.getStateBoatLeft(),n.getNodesCheckSum(),2,0);
Noden5=newNode(n.getLeftPeo(),n.getLeftSavage()+2,
n.getRightPeo(),n.getRightSavage()-2,
n.getStateBoatLeft(),n.getNodesCheckSum(),0,2);
returnfalse;
getResultList(){
returnresultList;
}
classNode{
nodesCheckSum=newArrayList<
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<
checkSumList,intonBoatPeoNum,
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){
publicintgetRightPeo(){
returnrightPeo;
publicvoidsetRightPeo(intrightPeo){
publicintgetLeftSavage(){
returnleftSavage;
publicvoidsetLeftSavage(intleftSavage){
publicintgetRightSavage(){
returnrightSavage;
publicvoidsetRightSavage(intrightSavage){
@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){
getNodesCheckSum(){
returnnodesCheckSum;
publicintgetOnBoatPeoNum(){
returnonBoatPeoNum;
publicvoidsetOnBoatPeoNum(intonBoatPeoNum){
publicintgetOnBoatSavageNum(){
returnonBoatSavageNum;
publicvoidsetOnBoatSavageNum(intonBoatSavageNum){
4.程序调试
(实验数据记录——根据程序要求输入几组不同数据,记录程序运行结果,并分析结果,分析程序运行中出现的主要错误。
或对其他程序环境的使用情况的记录。
注:
必须认真书写)
错误:
当输入不合法时,程序会抛出异常而终止运行。
于是改进程序如下:
5.讨论
(通过实验的一些体会、学会的知识和技能等)
(1)若代码所要实现的功能较多或者程序较为复杂,可先设计好程序的整体框架,画出流程图,然后依次编写代码分别实现上述功能,最后将各部分代码按照顺序结合起来,对各个参数稍加调试,便可得到清晰正确的程序。
(2)在用到循环或者递归等算法时,很容易出现对某一界限界定不明导致程序无法正常运行,而且这些疏漏之处往往是简短几步中不容易发现的,这就需要细心、耐心地梳理清楚各条脉络,找出问题所在。
(3)在编写程序时,应在方便的情况下尽可能使用同一种变量进行各步的运算,减少不必要的变量定义,以免造成代码过于混乱。