《人工智能》实验报告实验报告实验一实验名称:知识的表示与推理实验姓名:实验日期:年月日成绩:一、实验目的状态空间表示法是人工智能领域最基本的知识表示方法之一,也是进一步学习状态空间搜索策略的基础,本实验通过牧师与野人渡河的问题,强化学生对知识表示的了解和应用,为人工智能后续环节的课程奠定基础。二、实验设备PC,Matlab三、实验步骤实验内容:有n个牧师和n个野人准备渡河,但只有一条能容纳c个人的小船,为了防止野人侵犯牧师,要求无论在何处,牧师的人数不得少于野人的人数(除非牧师人数为0),且假定野人与牧师都会划船,试设计一个算法,确定他们能否渡过河去,若能,则给出小船来回次数最少的最佳方案。实验要求:输入:牧师人数(即野人人数):n;小船一次最多载人量:c。输出:若问题无解,则显示Failed,否则,显示Successed输出一组最佳方案。用三元组(X1,X2,X3)表示渡河过程中的状态。并用箭头连接相邻状态以表示迁移过程:初始状态-中间状态-目标状态。例:当输入n=2,c=2时,输出:221-200-211-010-021-000;其中:X1表示起始岸上的牧师人数;X2表示起始岸上的野人人数;X3表示小船现在位置(1表示起始岸,0表示目的岸)。要求:写出算法的设计思想和源程序,并以图形用户界面实现人机交互,进行输入和输出结果,如:Pleaseinputn:2Pleaseinputc:2OptimalProcedure:221-200-211-010-021-000SuccessedorFailed?:Successed实验原理:先来看看问题的初始状态和目标状态,假设和分为甲岸和乙岸:初始状态:甲岸,n野人,n牧师;乙岸,0野人,0牧师;船停在甲岸,船上有0个人;目标状态:甲岸,0野人,0牧师;乙岸,n野人,n牧师;船停在乙岸,船上有0个人;整个问题就抽象成了怎样从初始状态经中间的一系列状态达到目标状态。问题状态的改变是通过划船渡河来引发的,所以合理的渡河操作就成了通常所说的算符。以n=3、c=2为例,可以得出以下5个算符(按照渡船方向的不同,也可以理解为10个算符):渡1野人、渡1牧师、渡1野人1牧师、渡2野人、渡2牧师算符知道以后,剩下的核心问题就是搜索方法了,可以考虑采用深度优先搜索,通过一个函数找出下一步可以进行的渡河操作中的最优操作,如果没有找到则返回其父节点,看看是否有其它兄弟节点可以扩展,然后递规调用,一级一级的向后扩展。搜索中采用的一些规则如下:1、渡船优先规则:甲岸一次运走的人越多越好(即甲岸运多人优先),同时野人优先运走;乙岸一次运走的人越少越好(即乙岸运少人优先),同时牧师优先运走;2、不能重复上次渡船操作(通过链表中前一操作比较),避免进入死循环;3、任何时候河两边的野人和牧师数均分别大于等于0且小于等于3;4、由于只是找出最优解,所以当找到某一算符(当前最优先的)满足操作条件后,不再搜索其兄弟节点,而是直接载入链表。5、若扩展某节点a的时候,没有找到合适的子节点,则从链表中返回节点a的父节点b,从上次已经选择了的算符之后的算符中找最优先的算符继续扩展b。四、实验结果与分析MATLAB程序:function[]=guohe()globalnnode;n=2;solveNum=1;%问题的解法result=zeros(100,1);node=zeros(300,5);node(1,:)=[3,3,1,1,-1];%初始化%1左岸传教士数2左岸野人数3船(1为左岸,0为右岸)%4是否可扩展(1为可扩展)5父节点号(-1表示无父节点,即为初始节点)j=1;%forj=1:nwhile(1)ifjnbreakendifnode(j,4)==1%判断结点是否可扩展ifnode(j,3)==1%船在左岸if((node(j,1)==0)||(node(j,1)==3))&&(node(j,2)=1)forward(j,0,1);endif(node(j,1)==1&&node(j,2)==1||node(j,1)==3&&node(j,2)==2)forward(j,1,0);endif(node(j,1)=1&&node(j,1)==node(j,2))forward(j,1,1);endif(node(j,1)==0||node(j,1)==3)&&node(j,2)=2forward(j,0,2);endif(node(j,1)==2&&node(j,2)==2||node(j,1)==3&&node(j,2)==1)forward(j,2,0);endelseifnode(j,3)==0%船在右岸if((node(j,1)==0)||(node(j,1)==3))&&(node(j,2)=2)afterward(j,0,1);endif(node(j,1)==2&&node(j,2)==2||node(j,1)==0&&node(j,2)==1)afterward(j,1,0);endif(node(j,1)=2&&node(j,1)==node(j,2))afterward(j,1,1);endif(node(j,1)==0||node(j,1)==3)&&node(j,2)=1afterward(j,0,2);endif(node(j,1)==1&&node(j,2)==1||node(j,1)==0&&node(j,2)==2)afterward(j,2,0);endendendj=j+1;endfprintf('传教士野人过河问题\n');fort=1:nj=1;k=t;StepNum=1;ifnode(k,4)==-1while(k~=-1)result(j)=k;k=node(k,5);j=j+1;endj=j-1;fprintf('第%d种方法:\n',solveNum);whilej1BoatPriNum=node(result(j),1)-node(result(j-1),1);BoatWildNum=node(result(j),2)-node(result(j-1),2);ifnode(result(j),3)==1fprintf('第%d次:左岸到右岸,传教士过去%d人,野人过去%d人\n',...StepNum,abs(BoatPriNum),abs(BoatWildNum));StepNum=StepNum+1;endifnode(result(j),3)==0fprintf('第%d次:右岸到左岸,传教士过去%d人,野人过去%d人\n',...StepNum,abs(BoatPriNum),abs(BoatWildNum));StepNum=StepNum+1;endj=j-1;endpause(0.2);fprintf('\n');solveNum=solveNum+1;endendfprintf('问题结束');%%%从左岸到右岸,船上传教士x个,野人y个function[]=forward(z,x,y)globaln;globalnode;node(n,1)=node(z,1)-x;node(n,2)=node(z,2)-y;node(n,3)=0;r=search(z);if(~r)returnendnode(z,4)=0;node(n,4)=1;node(n,5)=z;s=destination();ifsnode(n,4)=-1;endn=n+1;%%%%从右岸到左岸,船上传教士x个,野人y个function[]=afterward(z,x,y)globaln;globalnode;node(n,1)=node(z,1)+x;node(n,2)=node(z,2)+y;node(n,3)=1;r=search(z);if(~r)returnendnode(z,4)=0;node(n,4)=1;node(n,5)=z;s=destination();ifsnode(n,4)=-1;endn=n+1;%%functionr=search(x)globalnnode;i=x;whilenode(i,5)~=-1ifnode(i,1)==node(n,1)&&node(i,2)==node(n,2)&&node(i,3)==node(n,3)r=0;returnendi=node(i,5);end%跟初始节点比较ifnode(i,1)==node(n,1)&&node(i,2)==node(n,2)&&node(i,3)==node(n,3)r=0;returnendr=1;%均不相同%%functions=destination()globalnnode;ifnode(n,1)==0&&node(n,2)==0&&node(n,3)==0s=1;returnends=0;实验结果:传教士野人过河问题第1种方法:第1次:左岸到右岸,传教士过去1人,野人过去1人第2次:右岸到左岸,传教士过去1人,野人过去0人第3次:左岸到右岸,传教士过去0人,野人过去2人第4次:右岸到左岸,传教士过去0人,野人过去1人第5次:左岸到右岸,传教士过去2人,野人过去0人第6次:右岸到左岸,传教士过去1人,野人过去1人第7次:左岸到右岸,传教士过去2人,野人过去0人第8次:右岸到左岸,传教士过去0人,野人过去1人第9次:左岸到右岸,传教士过去0人,野人过去2人第10次:右岸到左岸,传教士过去0人,野人过去1人第11次:左岸到右岸,传教士过去0人,野人过去2人第2种方法:第1次:左岸到右岸,传教士过去1人,野人过去1人第2次:右岸到左岸,传教士过去1人,野人过去0人第3次:左岸到右岸,传教士过去0人,野人过去2人第4次:右岸到左岸,传教士过去0人,野人过去1人第5次:左岸到右岸,传教士过去2人,野人过去0人第6次:右岸到左岸,传教士过去1人,野人过去1人第7次:左岸到右岸,传教士过去2人,野人过去0人第8次:右岸到左岸,传教士过去0人,野人过去1人第9次:左岸到右岸,传教士过去0人,野人过去2人第10次:右岸到左岸,传教士过去1人,野人过去0人第11次:左岸到右岸,传教士过去1人,野人过去1人第3种方法:第1次:左岸到右岸,传教士过去0人,野人过去2人第2次:右岸到左岸,传教士过去0人,野人过去1人第3次:左岸到右岸,传教士过去0人,野人过去2人第4次:右岸到左岸,传教士过去0人,野人过去1人第5次:左岸到右岸,传教士过去2人,野人过去0人第6次:右岸到左岸,传教士过去1人,野人过去1人第7次:左岸到右岸,传教士过去2人,野人过去0人第8次:右岸到左岸,传教士过去0人,野人过去1人第9次:左岸到右岸,传教士过去0人,野人过去2人第10次:右岸到左岸,传教士过去0人,野人过去1人第11次:左岸到右岸,传教士过去0人,野人过去2人第4种方法:第1次:左岸到右岸,传教士过去0人,野人过去2人第2次:右岸到左岸,传教士过去0人,野人过去1人第3次:左岸到右岸,传教士过去0人,野人过去2人第4次:右岸到左岸,传教士过去0人,野人过去1人第5次:左岸到右岸,传教士过去2人,野人过去0人第6次:右岸到左岸,传教士过去1人,野人过去1人第7次:左岸到右岸,传教士过去2人,野人过去0人第8次:右岸到左岸,传教士过去0人,野人过去1人第9次:左岸到右岸,传教士过去0人,野人过去2人第10次:右岸到左岸,传教士过去1人,野人过去0人第11次:左岸到右岸,传教士过去1人,野人过去1人从知识的表示和推理过程来看,过河问题共有四种方案。通过本次实验,对人工智能的经典问题的解决方法有了一定的了解。通过牧师与野人渡河的问题,强化了我对知识表示的了解和应用,而且这次试验也为进一步学习状态空间搜索策略和人工智能课程的后续学习奠定了基础。实验报告实验二实验名称:基于MATLAB的模糊推理系统设计姓名:实验日期:年月日成绩:一、实验目的理解模糊逻辑推理的原理及特点,熟练应用模糊推理