人工智能实验报告.docx
- 文档编号:33724
- 上传时间:2022-10-01
- 格式:DOCX
- 页数:37
- 大小:186.49KB
人工智能实验报告.docx
《人工智能实验报告.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告.docx(37页珍藏版)》请在冰豆网上搜索。
人工智能实验报告
实验一:
知识表示方法
一、实验目的
状态空间表示法是人工智能领域最基本的知识表示方法之一,也是进一步学习状态空间搜索策略的基础,本实验通过牧师与野人渡河的问题,强化学生对知识表示的了解和应用,为人工智能后续环节的课程奠定基础。
二、问题描述
有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:
2
SuccessedorFailed?
:
Successed
OptimalProcedure:
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:
:
list
StateendState;
boolmove(State*nowState,Boat*boat);//进行一次决策
State*findInList(std:
:
list
voidprint(State*endState);//打印结果
public:
staticvoidShowInfo();
RiverCrossing(intn,intc);
boolsolve();//求解问题
};
RiverCrossing.cpp
#include"RiverCrossing.h"
#include
#include
#include
usingnamespacestd;
//类静态变量定义
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);
}
//重载+符号,表示船开到此岸
StateState:
:
operator+(Boat&boat)
{
Stateret(iPastor+boat.pastor,iSavage+boat.savage,iBoatAtSide+1);
ret.pPrevious=this;
returnret;
}
//重载-符号,表示船从此岸开走
StateState:
:
operator-(Boat&boat)
{
Stateret(iPastor-boat.pastor,iSavage-boat.savage,iBoatAtSide-1);
ret.pPrevious=this;
returnret;
}
//重载==符号,比较两个节点是否是相同的状态
boolState:
:
operator==(State&state)
{
return(this->iPastor==state.iPastor&&this->iSavage==state.iSavage&&this->iBoatAtSide==state.iBoatAtSide);
}
/*=======================Methodsforclass"RiverCrossing"=======================*/
//显示信息
voidRiverCrossing:
:
ShowInfo()
{
cout<<"************************************************"< cout<<"牧师与野人过河问题求解"< cout<<"by1040501211陈嘉生"< cout<<"************************************************"< } //构造函数 RiverCrossing: : RiverCrossing(intn,intc) : endState(0,0,0) { State: : n=n; Boat: : c=c; } //解决问题 boolRiverCrossing: : solve() { openList.push_back(newState(State: : n,State: : n,1)); while(! openList.empty()){ //获取一个状态为当前状态 State*nowState=openList.front(); openList.pop_front(); closeList.push_back(nowState); //从当前状态开始决策 if(nowState->iBoatAtSide==1){//船在此岸 //过河的人越多越好,且野人优先 intcount=nowState->getTotalCount(); count=(Boat: : c>=count? count: Boat: : c); for(intcapticy=count;capticy>=1;--capticy){ for(inti=0;i<=capticy;++i){ Boatboat(i,capticy-i); if(move(nowState,&boat)) returntrue; } } }elseif(nowState->iBoatAtSide==0){//船在彼岸 //把船开回来的人要最少,且牧师优先 for(intcapticy=1;capticy<=Boat: : c;++capticy){ for(inti=0;i<=capticy;++i){ Boatboat(capticy-i,i); if(move(nowState,&boat)) returntrue; } } } } print(NULL); returnfalse; } //实施一步决策,将得到的新状态添加到列表,返回是否达到目标状态 boolRiverCrossing: : move(State*nowState,Boat*boat) { //获得下一个状态 State*des
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 实验 报告