MC牧师过河问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能上机实验报告
学号:姓名:所在系:信息学院班级:
实验名称:实验日期2016年12月3日
实验指导教师实验机房A401
------------------------------------------------------------------------------------------------------ 1.实验目的:
(1)在掌握状态空间搜索策略的基础上,理解知识表示的方法。
(2)能够应用知识表示方法,解决实际问题
2. 实验内容:
(1)M-C问题描述
有n个牧师和n个野人准备渡河,但只有一条能容纳c个人的小船,为了防止野人侵犯牧师,要求无论在何处,牧师的人数不得少于野人的人数(除非牧师人数为0),且假定野人与牧师都会划船,试设计一个算法,确定他们能否渡过河去,若能,则给出小船来回次数最少的最佳方案。
3.算法设计(编程思路或流程图或源代码)
#include
#include
#include
#define maxloop 100 /* 最大层数,对于不同的扩展方法自动调整取值*/
#define pristnum 3 /*初始化时设定有3个野人3个牧师,实际可以改动*/
#define slavenum 3
struct SPQ
{ int sr,pr; /* 船运行一个来回后河右岸的野人、牧师的人数*/
int sl,pl; /* 船运行一个来回后河左岸的野人、牧师的人数*/
int ssr,spr; /* 回来(由左向右时)船上的人数*/
int sst,spt; /* 去时(由右向左时)船上的人数*/
int loop; /* 本结点所在的层数*/
struct SPQ *upnode ,*nextnode;/* 本结点的父结点和同层的下一个结点的地址*/
}spq;
int loopnum;/* 记录总的扩展次数*/
int openednum;/* 记录已扩展节点个数*/
int unopenednum;/* 记录待扩展节点个数*/
int resultnum;
struct SPQ *opened;
struct SPQ *oend;
struct SPQ *unopened;
struct SPQ *uend;
struct SPQ *result;
void initiate();
void releasemem();
void showresult();
void addtoopened(struct SPQ *ntx);
int search();
void goon();
int stretch(struct SPQ* ntx);
void recorder();
void addtoopened(struct SPQ *ntx) /*扩展节点*/ {
unopened = unopened -> nextnode; unopenednum--;
if (openednum == 0 )
oend = opened = ntx;
oend -> nextnode = ntx;
oend = ntx;
openednum++;
}
void recorder()
{
int i , loop;
struct SPQ *newnode;
struct SPQ *ntx;
loop = oend -> loop;
ntx = oend;
resultnum = 0;
for( i = 0 ; i <= loop ; i++ )
{
newnode = (struct SPQ*) malloc (sizeof(spq));
if(newnode==NULL)
{
printf("\n内存不够!\n");
exit(0);
}
newnode -> sr = ntx -> sr;
newnode -> pr = ntx -> pr;
newnode -> sl = ntx -> sl;
newnode -> pl = ntx -> pl;
newnode -> sst = ntx -> sst;
newnode -> spt = ntx -> spt; newnode -> ssr = ntx -> ssr; newnode -> spr = ntx -> spr; newnode -> nextnode = NULL;
ntx = ntx -> upnode;
if(i == 0)
result = newnode;
newnode -> nextnode = result; result = newnode;
resultnum++;
}
}
void releasemem()
{
int i;
struct SPQ* nodefree;
for ( i = 1 ; i < openednum ; i++ ) {
nodefree = opened;
opened = opened -> nextnode;
free(nodefree);
}
for ( i = 0 ; i < unopenednum ; i++ ) {
nodefree = unopened;
unopened = unopened -> nextnode; free(nodefree);
}
}
void showresult() /*显示*/
{
int i;
int fsr , fpr ; /* 在右岸上的人数*/ int fsl , fpl ; /* 在左岸上的人数*/ struct SPQ* nodefree;
printf("%d个牧师",result -> pr); printf("%d个野人",result -> sr); printf("%d个牧师",result -> pl); printf("%d个野人",result -> sl); for ( i = 1 ; i < resultnum ; i++ ) {