江苏科技大学实验报告(2012/2013学年第2学期)课程名称:人工智能学生姓名:陈嘉生学生学号:1040501211院系:数理学院专业:信息与计算科学2013年5月18日实验一:知识表示方法一、实验目的状态空间表示法是人工智能领域最基本的知识表示方法之一,也是进一步学习状态空间搜索策略的基础,本实验通过牧师与野人渡河的问题,强化学生对知识表示的了解和应用,为人工智能后续环节的课程奠定基础。二、问题描述有n个牧师和n个野人准备渡河,但只有一条能容纳c个人的小船,为了防止野人侵犯牧师,要求无论在何处,牧师的人数不得少于野人的人数(除非牧师人数为0),且假定野人与牧师都会划船,试设计一个算法,确定他们能否渡过河去,若能,则给出小船来回次数最少的最佳方案。三、基本要求输入:牧师人数(即野人人数):n;小船一次最多载人量:c。输出:若问题无解,则显示Failed,否则,显示Successed输出一组最佳方案。用三元组(X1,X2,X3)表示渡河过程中的状态。并用箭头连接相邻状态以表示迁移过程:初始状态->中间状态->目标状态。例:当输入n=2,c=2时,输出:221->110->211->010->021->000其中:X1表示起始岸上的牧师人数;X2表示起始岸上的野人人数;X3表示小船现在位置(1表示起始岸,0表示目的岸)。要求:写出算法的设计思想和源程序,并以图形用户界面实现人机交互,进行输入和输出结果,如:Pleaseinputn:2Pleaseinputc:2SuccessedorFailed?:SuccessedOptimalProcedure:221->110->211->010->021->000四、实验组织运行要求本实验采用集中授课形式,每个同学独立完成上述实验要求。五、实验条件每人一台计算机独立完成实验。六、实验代码Main.cpp#include
#include"RiverCrossing.h"usingnamespacestd;//主函数voidmain(){RiverCrossing::ShowInfo();intn,c;cout<<"Pleaseinputn:";cin>>n;cout<<"Pleaseinputc:";cin>>c;RiverCrossingriverCrossing(n,c);riverCrossing.solve();system("pause");}RiverCrossing.h#pragmaonce#include//船classBoat{public:staticintc;intpastor;//牧师intsavage;//野人Boat(intpastor,intsavage);};//河岸状态classState{public:staticintn;intiPastor;//牧师数量intiSavage;//野人数量intiBoatAtSide;//船所在河岸State*pPrevious;//前一个状态State(intpastor,intsavage,intboatAtSide);intgetTotalCount();//获得此岸总人数boolcheck();//检查人数是否符合实际boolisSafe();//检查是否安全Stateoperator+(Boat&boat);Stateoperator-(Boat&boat);booloperator==(State&state);};//过河问题classRiverCrossing{private:std::listopenList,closeList;StateendState;boolmove(State*nowState,Boat*boat);//进行一次决策State*findInList(std::list&listToCheck,State&state);//检查某状态节点是否在列表中voidprint(State*endState);//打印结果public:staticvoidShowInfo();RiverCrossing(intn,intc);boolsolve();//求解问题};RiverCrossing.cpp#include"RiverCrossing.h"#include#include#includeusingnamespacestd;//类静态变量定义intState::n=0;intBoat::c=0;/*=========================Methodsforclass"Boat"=========================*/Boat::Boat(intpastor,intsavage){this->pastor=pastor;this->savage=savage;}/*=========================Methodsforclass"State"=========================*///构造函数State::State(intpastor,intsavage,intboatAtSide){this->iPastor=pastor;this->iSavage=savage;this->iBoatAtSide=boatAtSide;this->pPrevious=NULL;}//获取此岸总人数intState::getTotalCount(){returniPastor+iSavage;}//检查人数是否在0到n之间boolState::check(){return(iPastor>=0&&iPastor<=n&&iSavage>=0&&iSavage<=n);}//按照规则检查牧师得否安全boolState::isSafe(){//此岸的安全:x1==0||x1>=x2//彼岸的安全:(n-x1)==0||(n-x1)>=(n-x2)//将上述条件联立后得到如下条件return(iPastor==0||iPastor==n||iPastor==iSavage);}//重载+符号,表示船开到此岸St...