校园导航系统 农夫过河问题 图的遍历演示 数据结构课程设计(实验报告)

校园导航系统 农夫过河问题  图的遍历演示 数据结构课程设计(实验报告)
校园导航系统 农夫过河问题  图的遍历演示 数据结构课程设计(实验报告)

广东技术师范学院天河学院

数据结构与算法

课程设计报告

题目:校园导航系统

农夫过河问题

图的遍历演示

学号: 23 27____28 32 ___ __

班级: 移动121____ ____ _ __

小组成员:_李俊、刘锦浩、刘钦锐、潘文伟_ 指导教师: 蔡柳萍

所属系部: 计算机科学与技术系

目录

题目一:农夫过河 (3)

一、问题描述 (3)

二、基本要求 (2)

三、算法思想 (2)

四、数据结构 (2)

五、模块划分 (3)

六、源程序 (6)

七、测试数据 (7)

1)运行测试........................................................ 错误!未定义书签。题目二:校园导航. (7)

一、问题描述 (8)

二、基本要求 (8)

三、算法思想 (8)

四、模块划分 (8)

五、源程序 (10)

六、运行及测试情况 (17)

题目二:图的遍历演示 (6)

一、问题描述 (6)

二、基本要求 (6)

三、算法思想 (6)

四、模块划分 (6)

五、源程序 (9)

六、运行及测试情况 (27)

1、主界面 (27)

2、输入信息运行测试(部分数据) (29)

3、运行测试 (30)

课程设计总结 (33)

题目一:农夫过河

一、问题描述

有一个农夫带一条狼、一只羊和一棵白菜过河。如果没有农夫看管,则狼要吃羊,羊要吃白菜。但是船很小,只够农夫带一样东西过河。问农夫该如何解此难题?二、基本要求

1)编程实现农夫过河的过程;

2)执行结果中要体现过河的先后顺序

界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构

三、算法思想

求解这个问题的简单的方法是一步一步进行试探,每一步搜索所有可能的选择,对前一步合适的选择再考虑下一步的各种方案。要模拟农夫过河问题,首先需要对问题中每个角色的位置进行描述。一个很方便的办法是用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。用0表示农夫或者某东西在河的南岸,1表示在河的北岸。例如整数5(其二进制表示为0101) 表示农夫和白菜在河的南岸,而狼和羊在北岸。现在问题变成:从初始状态二进制0000(全部在河的南岸) 出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目标,并且在序列中的每一个状态都可以从前一状态到达。为避免瞎费功夫,要求在序列中不出现重复的状态。

四、数据结构

实现上述求解的搜索过程可以采用两种不同的策略:一种是广度优先(breadth_first) 搜索,另一种是深度优先(depth_first) 搜索。本书只介绍在广度优先搜索方法中采用的数据结构设计。广度优先就是在搜索过程中总是首先搜索下面一步的所有可能状态,再进一步考虑更后面的各种情况。要实现广度优先搜索,可以使用队列。把下一步所有可能的状态都列举出来,放在队列中,再顺序取出来分别进行处理,处理过程中把再下一步的状态放在队列里……。由于队列的操作遵循先进

先出的原则,在这个处理过程中,只有在前一步的所有情况都处理完后,才能开始后面一步各情况的处理。这样,具体算法中就需要用一个整数队列moveTo,它的每个元素表示一个可以安全到达的中间状态。另外还需要一个数据结构记录已被访问过的各个状态,以及已被发现的能够到达当前这个状态的路径。由于在这个问题的解决过程中需要列举的所有状态(二进制0000 -1111)一共16种,所以可以构造一个包含16个元素的整数顺序表来实现。顺序表的第i个元素记录状态i是否已被访问过,若已被访问过则在这个顺序表元素中记入前驱状态值,把这个顺序表叫做route。route 的每个分量初始值均为-1。route的一个元素具有非负值表示这个状态已访问过,或是正被考虑。最后可以利用route顺序表元素的值建立起正确的状态路径。于是得到农夫过河问题的广度优先算法。在具体应用时,采用链队和顺序队均可,为叙述的方便,不妨设为使用顺序队。

五、模块划分

1、void BA() //农夫从B岸到A岸

2、void xu() //初始化三样东西的位置

3、void f() //判断农夫的位置

4、int g() //判断羊的位置

5、void huan () //农夫返回

6、void AB() //农夫从A岸到B岸

六、源程序

#include

int s[100],t=0;

void BA(int a[4],int b[4]);

void xu(int a[4])

{ int i,j,k;

for(i=0;i<3;i++)

for(j=i+1;j<4;j++)if(a[i]

{ k=a[i]; a[i]=a[j]; a[j]=k;

}}

int f(int a[4],int x)

{ int i,j=0,b[4];

for(i=0;a[i];i++)

{ if(i==x)continue;

b[j]=a[i];

if(j&&b[j]==b[j-1]-1)return 1; j++; }

return 0;}

int g()

{ int i,r;

for(i=t-1;i>=t/2;i-=2)

{ for(r=0;r

if(s[t-r]!=s[i-r]) break;

if(r==t-i)break; }

if(i

else return 1;}

void huan(int a[4],int b[4],int x)

{ int i;

for(i=0;a[i]!=x;i++);

a[i]=0; b[3]=x; xu(a); xu(b);} void AB(int a[4],int b[4])

{ int i;

for(i=0;a[i-1]||i==0;i++)

{ if(f(a,i)) continue;

s[t]=a[i];

if(g()) continue;

huan(a,b,s[t]);

t++;

if(a[0]==0) break;

BA(a,b);

if(a[0]==0) break;

t--;

huan(b,a,s[t]);

}

}

void BA(int a[4],int b[4])

{ int i;

for(i=0;b[i-1]||i==0;i++)

{ if(f(b,i)) continue;

s[t]=b[i];

if(g()) continue;

huan(b,a,s[t]);

t++;

AB(a,b);

if(a[0]==0) break;

t--;

huan(a,b,s[t]); }}

void main()

{ int i,a[4]={3,2,1},b[4]={0};

AB(a,b);

for(i=0;i

{ if(i%2)printf("农夫从B岸到A岸:");

else printf("农夫从A岸到B岸:");

switch(s[i])

{ case 0:printf("什么都不带");break;

case 1:printf("把狼带过河");break;

case 2:printf("把羊带过河");break;

case 3:printf("把菜带过河");break;

}

printf("\n"); }

}

七、测试数据

1)、运行测试

题目二:校园导航

一、问题描述

设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。

二、基本要求

1)、基本要求:

(1)设计校园平面图,在校园景点选10个左右景点。以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等有关信息。

(2)为来访客人提供图中任意景点相关信息的查询。

(3)为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条最短路径。

2)、实现提示:一般情况下,校园的道路是双向通行的,可设计校园平面图是一个无向网。顶点和边均含有相关信息。

三、算法思想

本课设要求输入信息,按照提示要求输入所要查询的地点的信息和亮点之间的最短路径。系统有两个分为使用者模式和管理者模式,使用者模式下时为来访客人提供图中任意景点相关信息的查询,为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条最短路径。管理者模式则是管理员对地点信息的修改。

四、模块划分

void way(); //最短路径的输出函数

void shortestpath(); //寻找最短路径函数

void information(); //输出简介函数

void init(); //写入定点节点的信息函数

void Writeweight_adj(); //写入邻接矩阵权值函数

void map(); //现实地图函数

void Floyd(); //定义弗洛伊德算法求最短路径函数弗洛伊德算法求最短路径函数流程图

输出两点最短路径流程图

五、源程序

#include #include

#define Num 13/*测试使用十三个地点,直接定义*/

#define Maxedge 32760/*最大距离*/

typedef struct/*定义对各个地点信息存储的结构体类型*/

{

char name[13] ;

int number;

char introduce[100];

}vertex;

vertex ver[Num];/*定义结构体数组*/

int edge[Num][Num];

int shortest[Num][Num];

int path[Num][Num];

void map()/*天河学院平面图,给使用程序者以直观认识*/

{

printf("\t 广东技术师范学院天河学院平面图(括号内为相对应的数字编

号)\n\n");

printf(" 346总站(1)

\n");

printf(" | ┕┓

\n");

printf(" | ┕┑

\n");

printf(" | 三饭(7)———————————————————

\n");

printf(" | |\n");

printf(" 正门(2)———————————————————综合楼(6)

\n");

printf(" | ┕┑ /

\n");

printf(" | 图书馆(4)————————————经管楼(5)\n");

printf(" | | |

\n");

printf(" | 11栋教学楼(8) | \n");

printf(" | | | \n");

printf(" | 10栋教学楼(9)————————假草足球场(10)\n");

printf(" | ┃

\n");

printf(" | ┖校医室(13)

\n");

printf(" | | \n");

printf(" 蘑菇亭(3)————————一饭(11)——————二饭(12) \n");

}

void init()

{

int i,j;/*从39到78行,对平面图中的各个地点信息进行输入,运用strcpy

函数*/

ver[1].number =1;

strcpy(ver[1].name,"346总站");

strcpy(ver[1].introduce,"开往天河客运站,半个小时一班,周五六日10分钟

一班\n");

ver[2].number =2;

strcpy(ver[2].name,"正门");

strcpy(ver[2].introduce,"学院的正门\n");

ver[3].number =3;

strcpy(ver[3].name,"蘑菇亭");

strcpy(ver[3].introduce,"位于学院中门,最近正门施工,不能通行\n");

ver[4].number =4;

strcpy(ver[4].name,"图书馆");

strcpy(ver[4].introduce,"内有自习室,有WIFI,适合学习,泡妞,泡仔\n");

ver[5].number =5;

strcpy(ver[5].name,"经管楼");

strcpy(ver[5].introduce,"有各种移动课室,还有学术报告厅\n");

ver[6].number =6;

strcpy(ver[6].name,"综合楼");

strcpy(ver[6].introduce,"本学院最大的楼,各老师和领导的办公室,财务室等等\n");

ver[7].number =7;

strcpy(ver[7].name,"三饭");

strcpy(ver[7].introduce,"学院第三饭堂,内有空调,冬暖夏凉,味极鲜!\n");

ver[8].number =8;

strcpy(ver[8].name,"11栋教学楼");

strcpy(ver[8].introduce,"本院新建的教学楼,宏伟且富有科技感,比四合院好看多了,4楼为计算机系办\n");

ver[9].number =9;

strcpy(ver[9].name,"10栋教学楼");

strcpy(ver[9].introduce,"教学楼,面朝足球场,出暖花开,内有学生宿舍\n");

ver[10].number =10;

strcpy(ver[10].name,"假草足球场");

strcpy(ver[10].introduce,"白天练球,晚上约会的好地方,说了你也不懂\n");

ver[11].number =11;

strcpy(ver[11].name,"一饭");

strcpy(ver[11].introduce,"学院第一饭堂,旁边有个面包店,很多师姐出入的饭堂\n");

ver[12].number =12;

strcpy(ver[12].name,"二饭");

strcpy(ver[12].introduce,"很多师妹来这里吃饭,所以我经常来,不要告诉别人");

ver[13].number =13;

strcpy(ver[13].name,"校医室");

strcpy(ver[13].introduce,"校医室,每当我去校医室,医生都会叫我去医院检查一下再来,脑残的");

for(i=1;i<=Num;i++)/*对存储距离的距离矩阵取值进行初始化,全定义为最大*/

{

for(j=1;j<=Num;j++)

{

edge[i][j]=Maxedge;

}

}

for(i=1;i<=Num;i++)/*对存储距离的矩阵的取值进行正确赋值,由于我校均来回可达,顾对路径正反同时赋值*/

{

edge[i][i]=0;

}

edge[1][2]=edge[2][1]=500;

edge[2][3]=edge[3][2]=300;

edge[1][7]=edge[7][1]=280;

edge[6][7]=edge[7][6]=250;

edge[2][4]=edge[4][2]=300;

edge[2][6]=edge[6][2]=300;

edge[3][11]=edge[11][3]=200;

edge[4][5]=edge[5][4]=10;

edge[4][8]=edge[8][4]=200;

edge[5][6]=edge[6][5]=200;

edge[5][10]=edge[10][5]=10;

edge[8][9]=edge[9][8]=25;

edge[9][10]=edge[10][9]=50;

edge[10][13]=edge[13][10]=50;

edge[11][12]=edge[12][11]=105;

edge[12][13]=edge[13][12]=220;

}

char menu()/*菜单函数*/

{

char i;

printf("输入“s”以查询最短路径\n");

printf("输入“i”以查询信息\n");

printf("输入“e”以退出程序\n");

printf("请输入对应的英文小写字母,谢谢:\n\t");

scanf("%s",&i);

return i;

}

void information()/*输出简介函数*/

{

int i;

while(1)

{

printf("请输入查询地点的编号:\n\t");

scanf("%d",&i);

if(i<=Num&&i>=1)

{

printf("\n@名称:%s\n#简介:%s\n",ver[i].name,ver[i].introduce);

return;

}

else

{

printf("输入有误!");

}

}

}

void floyd()/*弗洛伊德算法*/

{

int i=1,j=1,k=1,l=1;

for(i=1;i<=Num;i++)

{

for(j=1;j<=Num;j++)

{

shortest[i][j]=edge[i][j];

path[i][j]=0;

}

}

for(k=1;k<=Num;k++)

{

for(i=1;i<=Num;i++)

{

for(j=1;j<=Num;j++)

{

if(shortest[i][j]>(shortest[i][k]+shortest[k][j]))

{

shortest[i][j]=(shortest[i][k]+shortest[k][j]);

path[i][j]=path[j][i]=k;

}

}

}

}

}

void way(int i,int j)/*最短路径的输出*/

{

int k=0,a=i,b=j;

if(shortest[i][j]!=Maxedge)

{

printf("\n%从%s到%s的最短路径为:\n",ver[i].name,ver[j].name);

printf("%s",ver[i].name);

while(path[i][j]!=0)

{

k=path[i][j];

while(path[i][k]!=0)

{

k=path[i][k];

}

printf("-到-%s",ver[k].name);

i=k;

}

printf("-到-%s;\n",ver[j].name );

printf("\n最短距离为:%d米。\n",shortest[a][b]);

printf("\n数据均为测试数据,与实际有误差,敬请谅解.\n\n");

}

else

printf("你的输入有误,请输入数字为0-13,中间用空格隔开!");

}

void shortestpath()/*寻找最短路径*/

{

int i=0,j=0;

while(1)

{

printf("请输入要查询的两点的编号(范围为0-13,中间用空格间隔)\n 否则需要重启本系统:");

scanf("%d%d",&i,&j);

if(i<=Num&&i>0&&j<=Num&&j>0)

{

floyd();

way(i,j);

return ;

}

}

}

int main()/*主函数*/

{

char i;

printf("\t\t欢迎使用广东技术师范学院天河学院导航系统(个人版)\n\n");

init();

map();/*输出地图,提示使用者*/

while (1)

{

i=menu();

switch(i)

{

case 's':shortestpath();break;

case 'i':information();break;

case 'e':printf("\n\n\n\t\t\t\t谢谢使用!\n\n\t 对本系统有什么建议可以发送邮箱到:827655592@https://www.360docs.net/doc/a73104118.html,");return(0);

default :printf("输入错误!\n");break;

}

}

}六、运行及测试情况

1、主菜单界面

地图通过文本保存,运行时再调用2、运行测试

1)信息查询测试:

人工智能实验一指导

实验1: Prolog语言程序设计 人工智能(AI)语言是一类适应于人工智能和知识工程领域的、具有符号处理和逻辑推理能力的计算机程序设计语言。能够用它来编写求解非数值计算、知识处理、推理、规划、决策等具有智能的各种复杂问题。 Prolog是当代最有影响的人工智能语言之一,由于该语言很适合表达人的思维和推理规则,在自然语言理解、机器定理证明、专家系统等方面得到了广泛的应用,已经成为人工智能应用领域的强有力的开发语言。 尽管Prolog语言有许多版本,但它们的核心部分都是一样的。Prolog的基本语句仅有三种,即事实、规则和目标三种类型的语句,且都用谓词表示,因而程序逻辑性强,方法简捷,清晰易懂。另一方面,Prolog是陈述性语言,一旦给它提交必要的事实和规则之后,Prolog就使用内部的演绎推理机制自动求解程序给定的目标,而不需要在程序中列出详细的求解步骤。 一、实验目的 1、加深学生对逻辑程序运行机理的理解。 2、掌握Prolog语言的特点、熟悉其编程环境。 3、为今后人工智能程序设计做好准备。 二、实验内容 1、编写一个描述亲属关系的Prolog程序,然后再给予出一些事实数据,建立一个小型演绎数据库。 提示:可以以父亲和母亲为基本关系(作为基本谓词),再由此来描述祖父、祖母、兄弟、姐妹以及其他所属关系。 2、编写一个路径查询程序,使其能输出图中所有路径。 提示:程序中的事实描述了下面的有向图,规则是图中两节点间通路的定义。 e

3、一个雇主在发出招聘广告之后,收到了大量的应聘申请。为了从中筛选出不量的候选人,该雇主采用下列判据:申请者必须会打字、开车,并且住在伦敦。 (a)用Prolog规则表述这个雇主的选择准则。 (b)用Prolog事实描述下列申请者的情况: 史密斯住在剑桥,会开车但不会打字。 布朗住在伦敦,会开车也会打字。 简住在格拉斯哥,不会开车但会打字。 埃文斯住在伦敦,会开车也会打字。 格林住在卢顿,会开车也会打字。 (c)要求Prolog提供一个候选人名单。 4、实现递归谓词remove(X,Y,Z),它用于从表Y中除去所有整型数X的倍数值后得到新表Z。例如,对于询问 remove(2,[3,4,5,6,7,8,9,10],Z). 的回答为: Z=[3,5,7,9] 三、实验建议 1、首先运行Prolog安装目录中PROGRAM目录下的示例程序,对Prolog功能有一个感性认识。 (1)HANOI.PRO 实现汉诺塔演示的程序。 程序运行界面如图所示。

商人过河实验报告

数学模型实验—实验报告6 学院:工商学院专业:电气二类(计算机)姓名:辛文辉尚磊张亨 学号:___ 2012484019 2012484091 2012484055 ____ 实验时间:__ 3.18 ____ 实验地点:b3 一、实验项目: Matlab程序设计 安全渡河问题可以看成一个多步决策过程。每一步,即船由此岸驶向彼岸或从彼岸驶回此岸,都要对船上的人员(商人随从各几人)作出决策,在保证安全的前提下(两岸的商人数都不比随从数少),在有限步内使人员全部过河。用状态(变量)表示某一岸的人员状况,决策(变量)表示船上的人员状况,可以找出状态随决策变化的规律。问题转化为在状态的允许变化范围内(即安全渡河条件),确定每一步的决策,达到渡河的目的。 此类智力问题经过思考,可以拼凑出一个可行方案。但是,我们现在希望能找到求解这类问题的规律性,并建立数学模型,用以解决更为广泛的问题。 二、实验目的和要求 a.了解Matlab程序设计有关基本操作 b.掌握有关程序结构 三、实验内容

允许的状态向量 0 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 0 11 1 11 2

11 3 11 4 11 5 11 6 11 7 11 8 11 9 11 10 允许的决策向量: 0 1 0 2 0 3 0 4 0 5 0 6 1 0 1 1 2 0 2 1 2 2 3 0 3 1 3 2 3 3 4 0 4 1 4 2 5 0 5 1 6 0 过河步骤: 第1步:0商5仆过河,0商1仆返回 第2步:5商1仆过河,1商1仆返回 第3步:3商3仆过河,1商1仆返回 第4步:3商3仆过河,1商1仆返回 第5步:3商3仆过河,完成 过河过程中状态变化: 步骤此岸商此岸仆方向彼岸商彼岸仆 1 11 6 ==> -8 -3

农夫过河数据结构

郑州轻工业学院 课程设计任务书 题目农夫过河 专业、班级计算机科学与技术 学号姓名 主要内容: 一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸,要把这些东西全部运到北岸。他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜;否则狼会吃羊,羊会吃白菜。所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不能吃白菜。要求给出农夫将所有的东西运过河的方案。基本要求: 编写求解该问题的算法程序,并用此程序上机运行、调试,屏幕显示结果,能结合程序进行分析。 主要参考资料: 数据结构严蔚敏 完成期限:2012/6/21 指导教师签名: 课程负责人签名: 年月日

郑州轻工业学院 本科 数据结构课程设计总结报告 设计题目:农夫过河 学生姓名: 系别:计算机与通信工程学院 专业:计算机科学与技术 班级:计算机科学与技术 学号: 指导教师: 2012年6 月21 日

一,设计题目 问题描述: 一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸,他要把这些东西全部运到北岸。他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜;否则狼会吃羊,羊会吃白菜。所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不能吃白菜。要求给出农夫将所有的东西运过河的方案。 二,运行环境(软、硬件环境) VC6.0 Windows7系统 三,算法设计的思想 对于这个问题,我们需要先自动生成图的邻接矩阵来存储,主要方法是先生成各种安全状态结点,存放在顶点向量中;再根据判断两个结点间状态是否可以转换来形成顶点之间的所有边,并把它们保存在邻接矩阵中。在建立了图的邻接矩阵存储结构后,利用递归深度优先搜索求出从顶点(0,0,0,0)到顶点(1,1,1,1)的一条简单路径,这样做只能搜到一种合理方法,因为深度优先搜索遍历一个图的时候每一个结点只能被访问一次。 四,算法的流程图 要写算法的流程图,必须要先很了解自己的函数结构,我先在纸上手动的把整个过程在纸上画一遍,了解它的大体流程,然后把各个函数给分开,下面是我自己根据我的代码中画的各个函数画的流程图,希望老师满意。 主函数的流程图:

商人过河问题

商人过河 一、问题重述和分析 随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货。现有4名商人各带一个随从一起渡河一只船只能容纳两个人,但如何乘船渡河的大权掌握在商人的手里,商人怎样安排才能在有限步内安全渡河? 二、模型假设 1、在商人人数多于随从时乘船渡河的大权掌握在商人的手里; 2、商人和随从都会划船; 三.符号说明 x表示商人人数; y表示随从人数; z表示划船到河的此岸与彼岸。 四、模型的建立与求解 本题为多步决策模型,每一次过河都是状态量的转移过程。 此岸四个商人用x=0、1、2、3、4表示,此岸四个随从用y=0、1、2、3、4表示,z=0时表示划船到河的此岸时,z=1时表示划船到河的彼岸时,用有序数对(x,y,z)表示每次转移的状态量。解决此问题就是状态量(4,4,0)转移至(0,0,1),以下就是状态量转移的全部情况(其中“!”表示不能再转移下去或与前面步骤重复): (4,4,0)→(3,3,1) ↓↓ (4,2,1)→(4,3,0)→(4,1,1)→(4,2,0)→(4,0,1)→(4,1,0)→! ↓ (2,2,1) ↓ ! 由以上关系可知,一只船只能容纳两个人的情况下,四名商人各带一个随从无法过河。 此外,如果船的容量增加到3人,那么商人就能以几种方式安全过河,以下

是其中一种方案: (4,4,0)→(4,2,1)→(4,3,0)→(4,1,1,)→(4,2,0)→(2,2,1) ↓ (0,1,1)←(0,3,0)←(0,2,1)←(0,4,0)←(0,3,1)←(3,3,0)↓ (0,2,0)→(0,0,1) 五、模型推广 通过以上模型的建立,若商人和随从人数增加或小船容量加大,考虑n名商人各带一随从的情况。

人工智能实验报告

计算机科学与技术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.问题描述:很多涉及图上操作的算法都是以图的遍历操作为基础的。试写一个程序,演示在连通的无向图上访问全部结点的操作。 2.基本要求:以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。 3.测试数据:教科书图7.33。暂时忽略里程,起点为北京。 4.实现提示:设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。通过输入图的全部边输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制,注意,生成树的边是有向边,端点顺序不能颠倒。 5.选作内容: (1).借助于栈类型(自己定义和实现),用非递归算法实现深度优先遍历。 (2).以邻接表为存储结构,建立深度优先生成树和广度优先生成树,再按凹入表或树形打印生成树。 二.概要设计 1.为实现上述功能,需要有一个图的抽象数据类型。该抽象数据类型的定义为: ADT Graph { 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。 数据关系R: R={VR} VR={ | v,w v且P(v,w),表示从v到w得弧,谓词P(v,w)定义了弧的意义或信息} } ADT Graph 2.此抽象数据类型中的一些常量如下: #define TRUE 1 #define FALSE 0 #define OK 1 #define max_n 20 //最大顶点数 typedef char VertexType[20]; typedef enum{DG, DN, AG, AN} GraphKind; enum BOOL{False,True}; 3.树的结构体类型如下所示:

商人过河问题

商人过河问题 /*************************************************** *M个商人与每人各带的一个仆人过河问题 *船每次至多运N个人,至少要有一人划船 *在任一岸,当商人数<仆人数时,仆人就杀人越货 *过河由商人安排运送人员及数目 *找出安全渡河的全部方法并打印(原问题中M=3,N=2) *2010-10-10 20时许(纪念伟大的双十) * LYP ***************************************************/ /****************************************************************** *本题为多步决策 *若考虑只针对人数为 M = 3 对,每次过河人数最多 N = 2 *可以证明路径中必须经坐标中(3,1)过至(1,1)点(过诃时), *后返回至(2,2)点,再过诃至(0,2)点(只剩2个仆人) *可以先考虑(3,3)到(3,1)点 *再经(0,2)至(0,0),完成过诃(由图形的对称性关系,可以直接将(3,1)至(3,1)路径翻转,更改对应标号即可) *当然也可以用动态规划求解 *本代码不限定M,N值,可通过修改宏M,N的值,求其他商人(仆人)数与最大过河人数的全部路径 *******************************************************************/ /********************************************************************* * *商人数x < 仆人数y时遭杀人越货,过河失败 *对应可行域为: *x = 0, y = 0…M; elements[]中编号0…M *0 < x < M, y = x; elements[]中编号M+1…2M-1 *x = M, y = 0…M; elements[]中编号2M…3M *图像上表示如下:(共 3*M+1 个点),过河即从3M点到0点 *过河为左下方1/4圆区域 *返回为右上方1/4圆区域

MC牧师过河问题

人工智能上机实验报告 学号:姓名:所在系:信息学院班级: 实验名称:实验日期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;

农夫过河问题状态图及程序

农夫过河问题状态图及程序 一、问题需求分析 一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。他要把这些东西全部运到北岸。问题是他面前只有一条小船,船小到只能容下他和一件物品,另外只有农夫能撑船。另外,因为狼能吃羊,而羊爱吃白菜,所以农夫不能留下羊和白菜或者狼和羊单独在河的一边,自己离开。请问农夫该采取什么方案才能将所有的东西运过河呢? 二、算法选择 求解这个问题的最简单的方法是一步一步进行试探,每一步都搜索所有可能的选择,对前一步合适的选择再考虑下一步的各种方案。 用计算机实现上述求解的搜索过程可以采用两种不同的策略:一种是广度优先(breadth_first) 搜索,另一种是深度优先(depth_first) 。 广度优先: u 广度优先的含义就是在搜索过程中总是首先搜索下面一步的所有可能状态,然后再进一步考虑更后面的各种情况。u 要实现广度优先搜索,一般都采用队列作为辅助结构。把下一步所有可能达到的状态都列举出来,放在这个队列中,

然后顺序取出来分别进行处理,处理过程中把再下一步的状态放在队列里……。 u 由于队列的操作遵循先进先出的原则,在这个处理过程中,只有在前一步的所有情况都处理完后,才能开始后面一步各情况的处理。 三、算法的精化 要模拟农夫过河问题,首先需要选择一个对问题中每个角色的位置进行描述的方法。一个很方便的办法是用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。例如用0表示农夫或者某东西在河的南岸,1表示在河的北岸。因此整数5(其二进制表示为0101) 表示农夫和白菜在河的南岸,而狼和羊在北岸。 四、算法的实现 完成了上面的准备工作,现在的问题变成: 从初始状态二进制0000(全部在河的南岸) 出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸) 为最终目标,并且在序列中的每一个状态都可以从前一状态通过农夫(可以带一样东西)划船过河的动作到达。

数据结构实验报告-图的遍历

数据结构实验报告 实验:图的遍历 一、实验目的: 1、理解并掌握图的逻辑结构和物理结构——邻接矩阵、邻接表 2、掌握图的构造方法 3、掌握图的邻接矩阵、邻接表存储方式下基本操作的实现算法 4、掌握图的深度优先遍历和广度优先原理 二、实验内容: 1、输入顶点数、边数、每个顶点的值以及每一条边的信息,构造一个无向图G,并用邻接矩阵存储改图。 2、输入顶点数、边数、每个顶点的值以及每一条边的信息,构造一个无向图G,并用邻接表存储该图 3、深度优先遍历第一步中构造的图G,输出得到的节点序列 4、广度优先遍历第一部中构造的图G,输出得到的节点序列 三、实验要求: 1、无向图中的相关信息要从终端以正确的方式输入; 2、具体的输入和输出格式不限; 3、算法要具有较好的健壮性,对错误操作要做适当处理; 4、程序算法作简短的文字注释。 四、程序实现及结果: 1、邻接矩阵: #include #include #define VERTEX_MAX 30 #define MAXSIZE 20 typedef struct { int arcs[VERTEX_MAX][VERTEX_MAX] ; int vexnum,arcnum; } MGraph; void creat_MGraph1(MGraph *g) { int i,j,k; int n,m; printf("请输入顶点数和边数:"); scanf("%d%d",&n,&m); g->vexnum=n; g->arcnum=m; for (i=0;iarcs[i][j]=0;

农夫过河实验报告――数据结构

数据结构实验报告 ——实验四农夫过河的求解本实验的目的是进一步理解顺序表和队列的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。 一、【问题描述】 一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。他要把这些东西全部运到北岸。他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不吃白菜。请求出农夫将所有的东西运过河的方案。 二、【数据结构设计】 求解这个问题的简单的方法是一步一步进行试探,每一步搜索所有可能的选择,对前一步合适的选择再考虑下一步的各种方案。 要模拟农夫过河问题,首先需要对问题中每个角色的位置进行描述。一个很方便的办法是用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。用0表示农夫或者某东西在河的南岸,1表示在河的北岸。例如整数5(其二进制表示为0101)表示农夫和白菜在河的南岸,而狼和羊在北岸。 现在问题变成:从初始状态二进制0000(全部在河的南岸)出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目标,并且在序列中的每一个状态都可以从前一状态到达。为避免瞎费功夫,要求在序列中不出现重复的状态。 实现上述求解的搜索过程可以采用两种不同的策略:一种是广度优先(breadth_first)搜索, 另一种是深度优先(depth_first)搜索。本书只介绍在广度优先搜索方法中采用的数据结构设计。 广度优先就是在搜索过程中总是首先搜索下面一步的所有可能状态,再进一步考虑更后面的各种情况。要实现广度优先搜索,可以使用队列。把下一步

数学模型实验商人过河

《数学模型实验》实验报告 姓名:王佳蕾学院:数学与信息科 学学院 地点:主楼402 学号:055专业:数学类时间:2017年4 月16日 实验名称: 商人和仆人安全渡河问题的matlab实现 实验目的: 1.熟悉matlab基础知识,初步了解matlab程序设计; 2.研究多步决策过程的程序设计方法; 3.(允许)状态集合、(允许)决策集合以及状态转移公式的matlab表示;实验任务: 只有一艘船,三个商人三个仆人过河,每一次船仅且能坐1-2个人,而且任何一边河岸上仆人比商人多的时候,仆人会杀人越货。怎么在保证商人安全的情况下,六个人都到河对岸去,建模并matlab实现。 要求:代码运行流畅,结果正确,为关键语句加详细注释。 实验步骤: 1.模型构成 2.求决策 3.设计程序 4.得出结论(最佳解决方案) 实验内容: (一)构造模型并求决策

设第k次渡河前此岸的商人数为xk,随从数为yk,k=1,2,...,xk,yk=0,1,2,3.将二维向量sk=(xk,yk)定义为状态,安全渡河条件下的状态集合称为允许状态集合,记作S,S 对此岸和彼岸都是安全的。 S={(x,y)|x=0,y=0,1,2,3;x=3,y=0,1,2,3;x=y=1,2} 设第k次渡船上的商人数为uk,随从数vk,将二维变量dk=(uk,vk)定义为决策,允许决策集合记为D,由小船的容量可知, D={(u,v)|1<=u+v<=2,u,v=0,1,2} k为奇数时,船从此岸驶向彼岸,k为偶数时,船从彼岸驶向此岸,状态sk随决策变量dk的变化规律为sk+1=sk+(-1)^k*dk(状态转移律) 这样制定安全渡河方案归结为如下的多步决策模型: 求决策dk∈D(k=1,2,...,n),使状态sk∈S,按照转移律,由初始状态s1=(3,3)经有限步n到达状态sn+1=(0,0)。 (二)程序设计

农夫过河实验报告

“数据结构与算法综合实验”课程设计报告题目:农夫过河问题 学院计算机科学技术 年级2014级 专业计算机科学与技术 学号20142060 姓名高晗 日期2016年3月30日星期三 成绩 评语 黑龙江大学 计算机科学技术学院、软件学院

《数据结构与算法综合实验》报告 1.系统概述 (1)一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸,他要把这些东西全部运到北岸。他面前只有一只小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜;否则狼会吃羊,羊会吃白菜。所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,但是狼不吃白菜。要求给出农夫将所有东西运过河的方案。 (2)为农夫过河问题抽象数据模型,体会数据模型在求解问题中的重要作用。 (3)掌握顺序表和队列的逻辑结构和存储结构。 2.系统需求分析 (1)针对实现整个过程需要多步,不同步骤中各个事物所处位置不同的情况,可定义一个结构体来实现对四个对象狼、羊、白菜和农夫的表示。对于起始岸和目的岸,可以用0或者1来表示,以实现在程序设计中的简便性。 (2)题目要求给出四种事物的过河步骤,没有对先后顺序进行约束,这就需要给各个事物依次进行编号,然后依次试探,若试探成功,进行下一步试探。这就需要使用循环或者递归算法,避免随机盲目运算且保证每种情况均试探到,不接受非法输入。 (3)题目要求求出农夫带一只羊,一条狼和一颗白菜过河的办法,所以依次成功返回运算结果后,需要继续运算,直至求出结果,即给出农夫的过河方案。输出界面要求具有每一步中农夫所带对象及每步之后各岸的物体,需要定义不同的数组来分别存储上述内容,并使界面所示方案清晰简洁。 (4)实验运行环境为VC++6.0. 3.系统概要设计 (1)数据结构设计 要模拟农夫过河的问题,用四位二进制数顺序分别表示农夫,狼,羊,白菜的位置。用0表示农夫或某种东西在河的南岸,1表示在河的北岸。则问题的初

数学建模 商人过河

数学建模课程作业 论文题目: 对商人过河问题的研究 指导教师:黄光辉 小组成员:黄志宇(20156260)车辆工程04班 牛凯春(20151927)电气工程05班 文逸楚(20150382)工商管理02

一、问题重述 3名商人带3名随从乘一条小船过河,小船每次只能承载至多两人。随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。乘船渡河的方案由商人决定,商人们如何才能安全渡河呢? 二、问题分析 本题针对商人们能否安全过河问题,需要选择一种合理的过河方案。对该问题可视为一个多步决策模型,通过对每一次过河的方案的筛选优化,最终得到商人们全部安全过到河对岸的最优决策方案。对于每一次的过河过程都看成一个随机决策状态量,商人们能够安全到达彼岸或此岸我们可以看成目标决策允许的状态量,通过对允许的状态量的层层筛选,从而得到过河的目标。 三、模型假设 1.过河途中不会出现不可抗力的自然因素。 2.当随从人数大于商人数时,随从们不会改变杀人的计划。 3.船的质量很好,在多次满载的情况下也能正常运作。 4.随从会听从商人的调度,所有人都到达河对岸。 四、符号说明 第k次渡河前此岸的商人数 第k次渡河前此岸的随从数 过程的状态向量 允许状态集合 第k次渡船上的商人数 第k次渡船上的随从数 决策向量 允许决策集合

x y 3322110s 1s n +1d 1d 11五、模型建立 本题为多步决策模型,每一次过河都是状态量的转移过程。 用二维向量表示过程的状态,其中分别表示对应时刻此岸的商人,仆人数以及船的行进方向,其中则允许状态集合: = 又将二维向量定义为决策,则允许的决策合集为: 因为k 为奇数时船从此岸驶向彼岸,k 为偶数时船从彼岸驶向此岸,所以状态随决策的变化规律是 该式称为状态转移律。 求决策,使,并按照转移律,由经过有限步n 到达状态 六、模型求解 本模型使用MATLAB 软件编程,通过穷举法获得决策方案如下(完整matlab 程序详见附录): 初始状态: 可用图片表示为:X0= 3 3状态为: S = 3 13 23 03 11 12 20 20 30 10 20 0决策为: D = 02

图的深度优先遍历实验报告

一.实验目的 熟悉图的存储结构,掌握用单链表存储数据元素信息和数据元素之间的关系的信息的方法,并能运用图的深度优先搜索遍历一个图,对其输出。 二.实验原理 深度优先搜索遍历是树的先根遍历的推广。假设初始状态时图中所有顶点未曾访问,则深度优先搜索可从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有与v有路径相通的顶点都被访问到;若此时图有顶点未被访问,则另选图中一个未曾访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 图的邻接表的存储表示: #define MAX_VERTEX_NUM 20 #define MAXNAME 10 typedef char VertexType[MAXNAME]; typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; }ArcNode; typedef struct VNode{ VertexType data; ArcNode *firstarc;

}VNode,AdjList[MAX_VERTEX_NUM]; typedef struct{ AdjList vertices; int vexnum,arcnum; int kind; }ALGraph; 三.实验容 编写LocateVex函数,Create函数,print函数,main函数,输入要构造的图的相关信息,得到其邻接表并输出显示。 四。实验步骤 1)结构体定义,预定义,全局变量定义。 #include"stdio.h" #include"stdlib.h" #include"string.h" #define FALSE 0 #define TRUE 1 #define MAX 20 typedef int Boolean; #define MAX_VERTEX_NUM 20

LAB05+队列的操作及应用

Lab05.队列的操作及应用 【实验目的和要求】 1.掌握队列的顺序表示和链表表示下的基本操作; 2.深入理解深度优先搜索和广度优先搜索的思想并能正确描述其算法; 3.会应用广度优先搜索算法解决较复杂的问题。 【实验内容】 1.编写一个C源程序,其中包含顺序表示的空队列的创建、判断队列是否为空、进队、出队、取队列头部元素等操作。 2.编写一个C源程序,其中包含链表表示的空队列的创建、判断队列是否为空、进队、出队、取队列头部元素等操作。 3. 简述深度优先搜索和广度优先搜索的思想,并给出具体的算法步骤。 4.应用广度优先搜索算法求解农夫过河问题。 【实验仪器与软件】 1.CPU主频在1GHz以上,内存在512Mb以上的PC; 2.VC6.0,Word 2003及以上版本。 实验讲评: 实验成绩: 评阅教师: 2012 年月日

Lab05.队列的操作及应用 一、顺序表示的队列基本操作 1.顺序表示的队列操作基本源程序 #include #include typedef int DataType; #define MAXNUM 100/*队列中最大元素个数*/ struct SeqQueue{/*顺序队列类型定义*/ int f,r; DataType*q; };/*为了算法设计上的方便:f指出实际队头元素所在的位置,r 指出实际队尾元素所在位置的下一个位置。*/ typedef struct SeqQueue*PSeqQueue;/*顺序队列类型的指针类型*/ 创建空队列 PSeqQueue createEmptyQueue_seq(int m) { PSeqQueue paqu; paqu= (PSeqQueue)malloc(sizeof(struct SeqQueue)); if (paqu!=NULL) { paqu->f = NULL; paqu->r = NULL;

商人过河问题

商人过河问题 一、三名商人各带一名随从的情况 1.问题(略) 2.模型假设 ①当一边岸满足随从数大于商人数,但商人数为0时仍为一种安全状 态; ②小船至多可容纳2人,且渡河时由随从(或者商人)来划船。 3.分析与建模 商人过河需要一步一步实现,比如第一步:两个仆人过河,第二步:一个仆人驾船回来,第三步:又是两个仆人过河,第四步:…… 其中每一步都使当前状态发生变化,而且是从一种安全状态变为另一种安全状态。如果我们把每一种安全状态看成一个点,又如果存在某种过河方式使状态a变到状态b,则在点a和点b之间连一条边,这样我们把商人过河问题和图联系起来,有可能用图论方法来解决商人过河问题。 建模步骤:⑴首先要确定过河过程中的所有安全状态,我们用二元数组(,) x y 表示一个安全状态(不管此岸还是彼岸),其中x表示留在此岸的主人数,y表示留在此岸的随从数。两岸各有十种安全状态: (0,0),(0,1),(0,2),(0,3),(2,2),(1,1),(3,0),(3,1),(3,2),(3,3) ⑵在两岸的安全状态之间,如存在一种渡河方法能使一种状态变为另一种 安全状态,则在这两种状态之间连一条边。这样,得到如下一个二部图(图1),其中下方顶点表示此岸状态,上方顶点表示彼岸状态。我们的目的是要找出一条从此岸(3,3)到彼岸(0,0)的最短路。 ⑶观察发现此岸的状态(0,0),(3,0)和彼岸的状态(0,3),(3,3)都是孤立点,在求最短路的过程中不涉及这些点,把它们删去。两岸的点用1,2, (16) 新标号。 (3,3)(3,2)(3,1)(3,0)(1,1)(2,2)(0,3)(0,2)(0,3)(0,0) ○②④⑥⑧⑩○○12○14○16 ①③⑤○⑦⑨○11○13○15○ (3,3)(3,2)(3,1)(3,0)(1,1)(2,2)(0,3)(0,2)(0,3)(0,0)

研究性学习实验报告

研究性学习实验报告 课题名称:有关全息投影的研究 班级:1403班 小组组长:郭嘉昕 小组成员:郭京伟段泽华王捷聪孙泽錡 日期:2015年3月

有关全息投影的实验报告

第一部分 有关实验选材的研究 一、实验设计思想 (1)实验目的 通过对比,研究不同材料对于光线的折射和漫反射的效果,并且在其中寻找效果最佳、性价比高的材料,进行下一步实验。 (2)实验原理 当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射,这种反射称之为“漫反射”。 (3)实验方法 从成本方面考虑,先将不同材料做成面积的板状模型和立方体状模型,再将我们的光源设备调节到最高亮度,以最佳效果的角度将画面投射到不同的材料上。在同样暗度的房间里,用高度、距离固定的摄影机进行拍摄,再将不同材料的照片转入Photoshop,通过其内置的亮度数值初步判断不同材料的反射效果。将亮度(p)、材料制作的难易程度(q)以及其它视觉效果(w)三项各10分的标准分数按一定比例绘制出总分数,来选取实验材料。

实验测量表格如下: (4)实验仪器:各种实验材料*1、投影光源(4.7英寸)*1、摄像机*1、Windows电脑(Photoshop软件)*1 二、实验过程记录 (1)实验分工 (2)实验步骤

第一步—确定材料。因为我们是初次进行研究,对于具体的实验材料并不能确定,所以我们进行了解后,一共选取了4种材料: 第二步--选取材料。因为我们进行的实验成本非常有限所以我们必须先走向市场,来查看和询问有些材料是否可以被加工和购买到(具体材料价格请见附录)。将他们的难易程度(q)进行量化,10分为很容易得到,1分为基本不可能得到,以此绘制表格: 第三步—对比亮度。在了解了我们选取的材料的基础上,以节约环保为本,我们购买或借到了这四种材料。并选择在2015年3月8日的晚上,在教室里进行亮度测试。我们先将光源设备调节到最大亮度,拍摄的得到了一张照片,再不断尝试不同的角度,以求能用最好的效果反射光源并拍摄下来。我们将五张照片导入电脑,用Photoshop软件分别查看他们的RGM指数(具体RGM指数请见附录),来进行评分,但因为镜子的超好反射效果,我们改进了我们算法,以分段函数的方式来进行得分评判(p)。 评分结果如下

农夫过河问题

课程设计题目:农夫过河 一.问题描述 一个农夫带着一只狼、一只羊和一箩白菜,身处河的南岸。他要把这些东西全部运到北岸。他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。过河有以下规则: (1)农夫一次最多能带一样东西(或者是狼、或者是羊、或者是白菜)过河; (2)当农夫不在场是狼会吃羊; (3)当农夫不在场是羊会吃掉白菜。 现在要求为农夫想一个方案,能将3样东西顺利地带过河。从出事状态开始,农夫将羊带过河,然后农夫将羊待会来也是符合规则的,然后农夫将羊带过河仍然是符合规则的,但是如此这般往返,搜索过程便进入了死循环,因此,在这里,采用改进的搜索算法进行搜索。 二.基本要求 (1)为农夫过河问题抽象数据类型,体会数据模型在问题求解中的重要性; (2)要求利用数据结构的方法以及C++的编程思想来完成问题的综合设 计; (3)在问题的设计中,使用深度优先遍历搜索方式,避免死循环状态; (4)设计一个算法求解农夫过河问题,并输出过河方案; (5)分析算法的时间复杂度。 三.概要设计 (1)数据结构的设计 typedef struct // 图的顶点 { int farmer; // 农夫 int wolf; // 狼 int sheep; // 羊 int veget; // 白菜 }Vertex;

设计Vertex结构体的目的是为了存储农夫、狼、羊、白菜的信息,因为在遍历图的时候,他们的位置信息会发生变化,例如1111说明他们都在河的北岸,而0000说明他们都在河的南岸。 t ypedef struct { int vertexNum; // 图的当前顶点数 Vertex vertex[VertexNum]; // 顶点向量(代表顶点) bool Edge[VertexNum][VertexNum]; // 邻接矩阵. 用于存储图中的边,其矩阵元素个数取决于顶点个数,与边数无关 }AdjGraph; // 定义图的邻接矩阵存储结构 存储图的方法是用邻接矩阵,所以设计一个简单的AdjGraph结构体是为了储图的顶点数与边数,农夫过河问题我采用的是图的深度优先遍历思想。 (2)算法的设计 深度优先遍历基本设计思想:设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的1/12边(x,y)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。上述过程直至从x出发的所有边都已检测过为止。此时,若x不是源点,则回溯到在x之前被访问过的顶点;否则图中所有和源点有路径相通的顶点(即从源点可达的所有顶点)都已被访问过,若图G是连通图,则遍历过程结束,否则继续选择一个尚未被访问的顶点作为新源点,进行新的搜索过程。 程序中的深度优先遍历算法如下: void dfsPath(AdjGraph *graph, int start, int end) // 深度优先搜索从u到v的简单路径 //DFS--Depth First Search { int i = 0; visited[start] = true; //标记已访问过的顶点 if (start == end)

数据结构实验报告图实验

邻接矩阵的实现 1. 实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现2. 实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历3.设计与编码MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; }

int vertexNum, arcNum; }; #endif MGraph.cpp #include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) { cout << "Please enter two vertexs number of edge: " cin >> i >> j; arc[i][j] = 1; arc[j][i] = 1; } }

PROLOG实验报告

*******大学 实验报告| | 实验名称PROLOG语言练习与编程上机实验 课程名称人工智能及应用 | | 专业班级:*******学生姓名:****** 学号:*******成绩: 指导教师:*******实验日期:

一、实验目的及要求 1、熟悉并掌握prolog的编程环境、prolog语言的回溯、递归技术和表处理技 术; 2、运用prolog及其相关技术,编写并调试求解农夫过河和模式搜索问题的程 序。要求实验报告中包括:程序及其注释和说明、程序运行结果。 二、所用仪器、设备 PC台式机和prolog编译软件 三、实验原理 1、prolog本身自带推理机,其回溯、递归技术和表处理技术可简化复杂问 题求解。 2、prolog的跟踪、设断点对于调试程序是非常有用的。 四、求解的问题与程序 农夫过河问题 opposite(s,n). opposite(n,s). safe_goat(X,_,X,_). safe_cabbage(X,_,_,X). safe_goat(F,X,Y,_):-opposite(X,Y). safe_cabbage(F,_,X,Y):-opposite(X,Y). is_peaceful(F,W,G,C):-safe_goat(F,W,G,C),safe_cabbage(F,W,G,C). transform(location(X,W,G,C),location(Y,W,G,C)):-opposite(X,Y). transform(location(X,X,G,C),location(Y,Y,G,C)):-opposite(X,Y). transform(location(X,W,X,C),location(Y,W,Y,C)):-opposite(X,Y). transform(location(X,W,G,X),location(Y,W,G,Y)):-opposite(X,Y). member(X,[X|_]). member(X,[_|T]):-member(X,T). legal_states(location(F0,W0,G0,C0),location(F,W,G,C),States,X):- transform(location(F0,W0,G0,C0),location(F1,W1,G1,C1)),

相关文档
最新文档