人工智能实验报告Word文档下载推荐.docx
《人工智能实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告Word文档下载推荐.docx(37页珍藏版)》请在冰豆网上搜索。
021->
000
其中:
X1表示起始岸上的牧师人数;
X2表示起始岸上的野人人数;
X3表示小船现在位置(1表示起始岸,0表示目的岸)。
要求:
写出算法的设计思想和源程序,并以图形用户界面实现人机交互,进行输入和输出结果,如:
Pleaseinputn:
2Pleaseinputc:
2
SuccessedorFailed?
:
Successed
OptimalProcedure:
221->
四、实验组织运行要求
本实验采用集中授课形式,每个同学独立完成上述实验要求。
五、实验条件
每人一台计算机独立完成实验。
六、实验代码
Main.cpp
#include<
iostream>
#include"
RiverCrossing.h"
usingnamespacestd;
//主函数
voidmain()
{
RiverCrossing:
ShowInfo();
intn,c;
cout<
<
"
"
;
cin>
>
n;
Pleaseinputc:
c;
RiverCrossingriverCrossing(n,c);
riverCrossing.solve();
system("
pause"
);
}
RiverCrossing.h
#pragmaonce
list>
//船
classBoat
public:
staticintc;
intpastor;
//牧师
intsavage;
//野人
Boat(intpastor,intsavage);
};
//河岸状态
classState
staticintn;
intiPastor;
//牧师数量
intiSavage;
//野人数量
intiBoatAtSide;
//船所在河岸
State*pPrevious;
//前一个状态
State(intpastor,intsavage,intboatAtSide);
intgetTotalCount();
//获得此岸总人数
boolcheck();
//检查人数是否符合实际
boolisSafe();
//检查是否安全
Stateoperator+(Boat&
boat);
Stateoperator-(Boat&
booloperator==(State&
state);
//过河问题
classRiverCrossing
private:
std:
list<
State*>
openList,closeList;
StateendState;
boolmove(State*nowState,Boat*boat);
//进行一次决策
State*findInList(std:
&
listToCheck,State&
//检查某状态节点是否在列表中
voidprint(State*endState);
//打印结果
staticvoidShowInfo();
RiverCrossing(intn,intc);
boolsolve();
//求解问题
RiverCrossing.cpp
stack>
algorithm>
//类静态变量定义
intState:
n=0;
intBoat:
c=0;
/*=========================Methodsforclass"
Boat"
=========================*/
Boat:
Boat(intpastor,intsavage)
this->
pastor=pastor;
savage=savage;
State"
//构造函数
State:
State(intpastor,intsavage,intboatAtSide)
iPastor=pastor;
iSavage=savage;
iBoatAtSide=boatAtSide;
pPrevious=NULL;
//获取此岸总人数
getTotalCount()
returniPastor+iSavage;
//检查人数是否在0到n之间
boolState:
check()
return(iPastor>
=0&
&
iPastor<
=n&
iSavage>
=0&
iSavage<
=n);
//按照规则检查牧师得否安全
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;
//重载-符号,表示船从此岸开走
operator-(Boat&
Stateret(iPastor-boat.pastor,iSavage-boat.savage,iBoatAtSide-1);
//重载==符号,比较两个节点是否是相同的状态
operator==(State&
state)
return(this->
iPastor==state.iPastor&
iSavage==state.iSavage&
iBoatAtSide==state.iBoatAtSide);
/*=======================Methodsforclass"
RiverCrossing"
=======================*/
//显示信息
voidRiverCrossing:
ShowInfo()
************************************************"
endl;
牧师与野人过河问题求解"
by1040501211陈嘉生"
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:
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:
++capticy){
Boatboat(capticy-i,i);
}
}
print(NULL);
returnfalse;
//实施一步决策,将得到的新状态添加到列表,返回是否达到目标状态
move(State*nowState,Boat*boat)
//获得下一个状态
State*des