人工智能实验报告

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机科学与技术1341901301 陈敏

实验一:知识表示方法

一、实验目的

状态空间表示法是人工智能领域最基本的知识表示方法之一,也是进一步学习状态空间搜索策略的基础,本实验通过牧师与野人渡河的问题,强化学生对知识表示的了解和应用,为人工智能后续环节的课程奠定基础。

二、问题描述

有n个牧师和n个野人准备渡河,但只有一条能容纳c个人的小船,为了防止野人侵犯牧师,要求无论在何处,牧师的人数不得少于野人的人数(除非牧师人数为0),且假定野人与牧师都会划船,试设计一个算法,确定他们能否渡过河去,若能,则给出小船来回次数最少的最佳方案。

三、基本要求

输入:牧师人数(即野人人数):n;小船一次最多载人量:c。

输出:若问题无解,则显示Failed,否则,显示Successed输出一组最佳方案。用三元

组(X

1, X

2

, X

3

)表示渡河过程中的状态。并用箭头连接相邻状态以表示迁移过程:初始状态->

中间状态->目标状态。

例:当输入n=2,c=2时,输出:221->110->211->010->021->000

其中:X

1表示起始岸上的牧师人数;X

2

表示起始岸上的野人人数;X

3

表示小船现在位置(1表

示起始岸,0表示目的岸)。

要求:写出算法的设计思想和源程序,并以图形用户界面实现人机交互,进行输入和输出结果,如:

Please input n: 2 Please input c: 2

Successed or Failed?: Successed

Optimal Procedure: 221->110->211->010->021->000

四、算法描述

(1)算法基本思想的文字描述;

从初始状态S(n,n,1)出发,形成的有合法且未达状态S11、S12、……、Sli 。再分别从

S11、S12、……、Sli 出发形成所有合法而未达状态S111、S112、…… 、Sli1、Sli2、Sli ……

最终达到目标(0,0,0)(有解),或者找不到合法而未达状态(无解)。若有解,则从目标返

回找前趋状态,前趋状态的前趋状态……直到初始状态。

(2)判别(X1,X2,X3)为合法状态条件:X1=0或X1=n 或X1=X2。

(3)数据结构:

1 栈STACK ,记下“已达”状态及踪迹,并兼作队列。

2 STATE[X1][X2]=

(4)算法基本思想的具体实现:

1

初始化:置STATE[N+1][N+1][2]中的有状态为“未达”

置队列STACK 空,cond 为当前是否已达到目标: cond=

cond 置初值

2 以S (n,n,1)为始点,置STATE 为“已达”。S 入队列STACK

3 while (队列STACK 空且未达到目标时)

A{ 取出队头元素地址=>p1,队头元素出队列

B while (未达到目标,且P1有可达、合法、且未到达过的相邻顶点Q )

if (Q=(000) 则{cond=1,Q 入队列}

否则 {置QW 为“已达”,Q 入队列} /* B 可用函数COMBINE 实现 */

4 if (cond=1)则按队列中前趋指针指示的次序依次输出序列,否则输出“渡河失败”。

5 COMBINE 函数的功能等价于从数量不等的物品,分别选出1件、2件、……C 件物品的所

有组合,同时对每一种组合确定其合法性。

COMBINE ( )

{ 1 栈SP 初始化(SP 存放已放入物品序号),NUM 为已取出物品个数,NUM=0,i 为准备取出

物品序号,i<=1。

2 do {

while (未达到目标,且所有物品还未取尽,且NUM

{若该种物品已取尽,则取下一种,i++;

取出第i 种物品中一件来,该物来序号(即i )进栈,NUM++;

判断该状态合法否?! /* 用函数dicision 实现 */

0 已达 1 未达 0 未达目标

1 已达到目标

}

if (未达到目标,且栈SP不空)

{则读栈SP=>i,将第种物品放回一件:NUM--:退栈;i++;}

}while(未达到目标,且并非所有情况均已列举完)

}

dicision ( )

{ if (当前状态(x1,x2,x3)合法且未达)

则(x1,x2,x3)及前趋指针入队列STACK;

if ((x1,x2,x3)==0,0,0)) 则 cond=1;

}

五、源程序

#include

typedef struct node

{

int np; /* The normal people's number at start shore. */

int mp; /* The mad people's number at start shore. */

int shore; /* '0'=end shore,'1'=start shore */

int track; /* The track of the point */

}NODE;

NODE stack[80]; /* The massage from stack[1]*/

int state[80][80][2],n,c,front,back,cond;

void dicision(int t[])

{

int a[4],i;

for(i=0;i<4;i++) a[i]=t[i];

if(a[2]==1)

{

a[0]=n-a[0];

a[1]=n-a[1];

}

if((a[0]==0||a[0]==n||a[0]==a[1]) && state[a[0]][a[1]][a[2]]==1)

{

back++;

stack[back].np=a[0];

stack[back].mp=a[1];

stack[back].shore=a[2];

相关文档
最新文档