MC牧师过河问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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++ ) {

相关文档
最新文档