传教士与野人.docx
《传教士与野人.docx》由会员分享,可在线阅读,更多相关《传教士与野人.docx(41页珍藏版)》请在冰豆网上搜索。
传教士与野人
综合设计报告
设计名称:
人工智能课程设计
设计题目:
传教士与野人过河问题
学生学号:
0805030119
专业班级:
智能1班
学生姓名:
学生成绩:
指导教师(职称):
课题工作时间:
2010-9-13至2010-9-25
说明:
1、报告中的第一、二、三项由指导教师在综合设计开始前填写并发给每个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。
2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。
3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设计完成情况、报告的质量及答辩情况,给出客观、全面的评价。
4、所有学生必须参加综合设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。
答辩小组成员应由2人及以上教师组成。
5、报告正文字数一般应不少于5000字,也可由指导教师根据本门综合设计的情况另行规定。
6、平时表现成绩低于6分的学生,其综合设计成绩按不及格处理。
7、此表格式为武汉工程大学计算机科学与工程学院提供的基本格式(适用于学院各类综合设计),各教研室可根据本门综合设计的特点及内容做适当的调整,并上报学院批准。
成绩评定表
学生姓名:
学号:
班级:
类别
合计
分值
各项分值
评分标准
实际得分
合计得分
备注
平时表现
10
10
按时参加综合设计,无旷课、迟到、早退、违反实验室纪律等情况。
完成情况
30
20
按设计任务书的要求完成了全部任务,能完整演示其设计内容,符合要求。
10
能对其设计内容进行详细、完整的介绍,并能就指导教师提出的问题进行正确的回答。
报告质量
35
10
报告文字通顺,内容翔实,论述充分、完整,立论正确,结构严谨合理;报告字数符合相关要求,工整规范,整齐划一。
5
课题背景介绍清楚,综述分析充分。
5
设计方案合理、可行,论证严谨,逻辑性强,具有说服力。
5
符号统一;图表完备、符合规范要求。
5
能对整个设计过程进行全面的总结,得出有价值的结论或结果。
5
参考文献数量在3篇以上,格式符合要求,在正文中正确引用。
答辩情况
25
10
在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。
15
在规定时间内能准确、完整、流利地回答教师所提出的问题。
总评成绩:
分
补充说明:
指导教师:
(签字)
日期:
年月日
答辩记录表
学生姓名:
学号:
0805030119班级:
智能1班
答辩地点:
计算机院大楼j520
答辩内容记录:
根据ppt讲解此次课程设计的设计原理、方法,并所说自己的体会。
1、说说设计
答:
此次设计的课题是传教士与野人过河问题,在这个设计中首先是分析题中的的各种状态,要解决的问题以及各种算法。
我所用的算法是宽度优先搜索。
程序中宽度优先搜索是在search()函数中实现。
2.、程序是如何由初始状态搜索到目标状态的?
答:
程序中初始状态是默认值,从待扩展链表中取出链表的第一个节点,将其放入已扩展链表的尾部,然后调用search()函数对这个节点进行扩展。
当扩展的节点距初始节点的距离已达到事先规定的最大搜索距离时判定搜索失败。
Stretch()函数负责对具体的节点进行展开,展开的过程必须满足对节点的限制条件,除目标节点外其他新展开的节点被依次存入unopened链表的尾部,目标节点由于已没有必要再进行扩展,因此直接存入opened链表中。
答辩成绩
合计
分值
各项分值
评分标准
实际得分
合计得分
备注
25
10
在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。
15
在规定时间内能准确、完整、流利地回答教师所提出的问题。
答辩小组成员(签字):
年月日
指导教师评语
指导教师:
(签字)
日期:
年月日
一、综合设计目的、条件、任务和内容要求:
1.1综合设计目的
1.2综合设计条件
1.3综合设计任务
1.5综合设计内容
1.6综合设计要求
指导教师签字:
年月日
二、进度安排:
三、应收集资料及主要参考文献:
四、综合设计(课程设计)摘要(中文):
通过具体问题的编程求解,了解人工智能的基本解决方法;使用一种搜索策略,以加深理解。
过河问题的求解:
三个修道士和三个野人过河,船一次最多只能载两个人,在任何时候修道士的人数不能少于野人人数,否则野人会吃掉修道士。
找出六个人顺利过河的所有方案。
编制程序,使用一定的搜索策略,找出所有过河方法。
五、综合设计(课程设计)Abstract(英文):
Thecurriculumprojectisrequestsusintheutilizationconcreteapplicationwhichstudiestotheartificialintelligence.Whatthiscurriculumprojectneedsustouseisthesearchingalgorithm.Regardlessofbeingthebreadth-firstsearchorthedepth-firstsearch.
Throughconcretequestionprogrammingsolution,understandingartificialintelligencebasicsolutionmethod;Usesonekindofsearchstrategy,deepensunderstanding.
Crossesriverthequestionsolution:
Threemonksandthreesavagescrossriver,theshiponetimemostcanonlycarrytwopeople,atanytimemonk'spopulationcannotbeshortinthesavagepopulation,otherwisethesavagewilleatthemonk.Discoversallplanswhichsixpeoplecrossriversmoothly.
Thecoding,usescertainsearchstrategy,discoversallcrossesriverthemethod.
目录
摘要………………………………………………………………………………………II
Abstract…………………………………………………………………………………...II
第一章课题绪论……………………………………………………..…………………....1
1.1课题背景……………………………………………………………………………...1
1.2设计问题………………………………………………..……………………………1
1.2基本理论依据……………………………………………..………………………1
第二章设计简介及设计方案论述………………………………………………………..2
2.1设计原理………………………………………………..………………………….…2
2.1.1宽度优先搜索………………………………………..………………………….…3
2.1.2深度优先搜索………………………………………..………………………….…3
第三章详细设计…………………………………………………………..………………..5
3.1设计分析………………………………………………..………………………….…5
第四章设计结果及分析…………………………………………………..………………..11
总结…….……………………………………………………..……………………….…13
致谢…….……………………………………………………..……………………….…14
参考文献…….………………..……………………………..………………………….…15
附录主要程序代码………...………………………………..……………………………16
摘要
课程设计是要求我们对人工智能所学的运用到具体应用中。
本次课程设计需要我们用到的是搜索算法。
无论是宽度优先搜索还是深度优先搜索。
通过具体问题的编程求解,了解人工智能的基本解决方法;使用一种搜索策略,以加深理解。
过河问题的求解:
三个修道士和三个野人过河,船一次最多只能载两个人,在任何时候修道士的人数不能少于野人人数,否则野人会吃掉修道士。
找出六个人顺利过河的所有方案。
编制程序,使用一定的搜索策略,找出所有过河方法。
关键词:
人工智能;搜索算法;规则
Abstract
(英文摘要正文为小4号TimesNewRoman字体)
Thecurriculumprojectisrequestsusintheutilizationconcreteapplicationwhichstudiestotheartificialintelligence.Whatthiscurriculumprojectneedsustouseisthesearchingalgorithm.Regardlessofbeingthebreadth-firstsearchorthedepth-firstsearch.
Throughconcretequestionprogrammingsolution,understandingartificialintelligencebasicsolutionmethod;Usesonekindofsearchstrategy,deepensunderstanding.
Crossesriverthequestionsolution:
Threemonksandthreesavagescrossriver,theshiponetimemostcanonlycarrytwopeople,atanytimemonk'spopulationcannotbeshortinthesavagepopulation,otherwisethesavagewilleatthemonk.Discoversallplanswhichsixpeoplecrossriversmoothly.
Thecoding,usescertainsearchstrategy,discoversallcrossesriverthemethod.
Keywords(小4号黑体顶格):
artificialintelligence;searchalgorithm;rule
第一章课题绪论
这一章应说明本设计课题的背景、目的、意义、应解决的主要问题及应达到的技术要求;本设计的基本理论依据和主要工作内容。
1.1课题背景
通过上个学期对《人工智能》学习,让我们了解了各种搜索策略,如深度优先搜索、宽度优先搜索、启发式搜索等。
在学习了这些方法后,如何运用就是我们现在所需要面临的问题。
通过对传教士与野人问题的程序设计,能使我更加深刻的理解各种搜索策略。
1.2设计问题
传教士与野人过河问题是这样的:
设有3个传教士和3个野人来到河边,打算乘一只船从右岸渡到左岸去。
该船的负载能力为两人。
在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。
他们怎样才能用这条船安全地把所有人都渡过河去?
1.2.1实验目的
通过实际编程操作,了解人工智能中各种解决问题的方法。
1.2.2实验要解决的主要问题
分析题目得出初始状态以及执行后所得的目标状态,分析所要进行的操作及其可能性。
确定所要采用的搜索策略后要进行哪些操作,然后考虑题目中所要遵循的规则。
1.2.3应达到的技术要求
熟练掌握vc++的应用,能运用个搜索策略进行编程
1.3基本理论依据
图搜索控制策略:
一种在图中寻找路径的方法。
图中每个节点对应一个状态,每条连线对应一个操作符。
这些节点和连线(即状态与操作符)又分别由产生式系统的数据库和规则来标记。
求得把一个数据库变换为另一数据库的规则序列问题就等价于求得图中的一条路径问题。
在基于宽度优先搜索策略的基础上对问题进行求解。
规则正向演绎系统
定义:
正向规则演绎系统是从事实到目标进行操作的,即从状况条件到动作进行推理的,也就是从if到then的方向进行推理的。
求解过程
事实表达式的与或形变换:
在基于规则的正向演绎系统中,我们把事实表示为非蕴涵形式的与或形,作为系统的总数据库。
第二章设计简介及设计方案论述
传教士与野人过河问题是这样的:
设有3个传教士和3个野人来到河边,打算乘一只船从右岸渡到左岸去。
该船的负载能力为两人。
在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。
他们怎样才能用这条船安全地把所有人都渡过河去?
我们通过分析得出先要了解这个问题的初始状态和目标状态,在这个基础上确定搜索方法及其规则。
2.1设计原理
通过对问题的分析,我们知道了问题的初始状态及要达到的目标状态,其图如下:
图1传教士与野人状态图
由于传教士和野人数是一个常数,所以知道了一岸的情况,另一岸的情况也就知道了。
因此为了简便起见,在描述问题时,只描述一岸--如左岸--的情况就可以了。
从状态空间图看出解序列相当之多,但最短解序列只有4个,均由11次摆渡操作构成。
若给定其中任意两个状态分别作为初始状态和目标状态,就立即可找出对应的解序列来。
在一般情况下,求解过程就是对状态空间搜索出一条解路径的过程。
先来看看问题的初始状态和目标状态,假设和分为甲岸和乙岸:
初始状态:
甲岸,3野人,3牧师;
乙岸,0野人,0牧师;
船停在甲岸,船上有0个人;
目标状态:
甲岸,0野人,0牧师;
乙岸,3野人,3牧师;
船停在乙岸,船上有0个人;
整个问题就抽象成了怎样从初始状态经中间的一系列状态达到目标状态。
单链表的步骤:
从first开始找第i+1个结点,p指向该结点,q指向p之前驱结点;
从单链表中删除p;
释放p之空间;表长减1。
单链表运算的优缺点优点:
单链表插入和删除只需修改一两个指针,无需移动元素。
如已知前驱结点,插入删除运算的时间为O
(1)。
可以动态分配结点空间,线性表的长度只受内存大小限制。
缺点:
查找运算费时,只能顺序查找,不能随机查找。
2.1.1宽度优先搜索
定义:
以接近起始节点的程度逐层扩展节点的搜索方法。
特点:
一种高代价搜索,但若有解存在,则必能找到它
图2宽度优先搜索框图
2.1.2深度优先搜索
定义:
首先扩展最新产生的(即最深的)节点。
算法:
防止搜索过程沿着无益的路径扩展下去,往往给出一个节点扩展的最大深度——深度界限。
与宽度优先搜索算法最根本的不同在于:
将扩展的后继节点放在OPEN表的前端。
深度优先搜索用一个数组存放产生的所有状态。
(1)把初始状态放入数组中,设为当前状态;
(2)扩展当前的状态,产生一个新的状态放入数组中,同时把新产生的状态设为当前状态;
(3)判断当前状态是否和前面的重复,如果重复则回到上一个状态,产生它的另一状态;
(4)判断当前状态是否为目标状态,如果是目标,则找到一个解答,结束算法。
(5)如果数组为空,说明无解。
图3深度优先搜索
第三章详细设计
问题:
设有3个传教士和3个野人来到河边,打算乘一只船从右岸渡到左岸去。
该船的负载能力为两人。
在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。
他们怎样才能用这条船安全地把所有人都渡过河去?
搜索中采用的一些规则如下:
1、渡船优先规则:
甲岸一次运走的人越多越好(即甲岸运多人优先),同时野人优先运走;乙岸一次运走的人越少越好(即乙岸运少人优先),同时牧师优先运走;
2、不能重复上次渡船操作(通过链表中前一操作比较),避免进入死循环;
3、任何时候河两边的野人和牧师数均分别大于等于0且小于等于3;
4、由于只是找出最优解,所以当找到某一算符(当前最优先的)满足操作条件后,不再搜索其兄弟节点,而是直接载入链表。
5、若扩展某节点a的时候,没有找到合适的子节点,则从链表中返回节点a的父节点b,从上次已经选择了的算符之后的算符中找最优先的算符继续扩展b。
当传教士与野人的人数为n时,情况依此类推。
定义结点的结构:
以取船的一个来回作为一步搜索,这样结点可有下面几个量进行描述:
两岸大的传教士人数和野人数、本节点距离起始节点的距离,即由初始节点搜索几步后到达本节点。
需要注意的是并不是所有的节点都是可达的,题目中对可达节点作出了限制,只有两岸上传教士人数都不少于野人数(无传教士除外)的节点是可达的,另外岸上的人数不能为负。
定义连接:
两节点间的连接可由船从右岸到左岸时船上的传教士人数、野人、船返回时船上的传教士人数、野人人数进行描述。
由于船上最多只能在两人,因此不存在限制问题。
3.1设计分析
#include
#include
#definemaxloop100//最大层数,对于不同的扩展方法自动调整取值
#definepristnum3
#defineslavenum3
structSPQ
{
intsr,pr;//船运行一个来回后河右岸的野人、传教士的人数
intsl,pl;//船运行一个来回后河左岸的野人、传教士的人数
intssr,spr;//回来(由左向右时)船上的人数
intsst,spt;//去时(由右向左时)船上的人数
intloop;//本结点所在的层数
structSPQ*upnode,*nextnode;//本结点的父结点和同层的下一个结点的地址
}spq;
为了使程序更加简明,这里将节点及达到这节点的连接合并,有结构体SPQ表示。
主函数如下:
voidmain()
{
intflag;//标记扩展是否成功
for(;;)
{
initiate();
flag=search();
if(flag==1)
{
recorder();
releasemem();
showresult();
goon();
}
else
{
printf("无法找到符合条件的解");
releasemem();
goon();
}
}
}
intsearch()
{
intflag;
structSPQ*ntx;//提供将要扩展的结点的指针
for(;;)
{
ntx=unopened;//从待扩展链表中提取最前面的一个
if(ntx->loop==maxloop)
return0;
addtoopened(ntx);//将ntx加入已扩展链表,并将这个节点从待扩展链表中去掉
flag=stretch(ntx);//对ntx进行扩展,返回-1,0,1
if(flag==1)
return1;
}
}
search()函数实现对问题求解的搜索过程,它首先从待扩展链表中取出链表的第一个节点,将其放入已扩展链表的尾部,然后调用search()函数对这个节点进行扩展。
当扩展的节点距初始节点的距离已达到事先规定的最大搜索距离时判定搜索失败。
intstretch(structSPQ*ntx)
{
intfsr,fpr;//在右岸上的人数
intfsl,fpl;//在左岸上的人数
intsst,spt;//出发时在船上的人数
intssr,spr;//返回时船上的人数
structSPQ*newnode;
for(sst=0;sst<=2;sst++)//讨论不同的可能性并判断是否符合条件
{
fsr=ntx->sr;
fpr=ntx->pr;
fsl=ntx->sl;
fpl=ntx->pl;
if((sst<=fsr)&&((2-sst)<=fpr))//满足人数限制
{
spt=2-sst;
fsr=fsr-sst;
fpr=fpr-spt;
if((fpr==0)&&(fsr==0))//搜索成功
{
newnode=(structSPQ*)malloc(sizeof(spq));
if(newnode==NULL)
{
printf("\n内存不够!
\n");
exit(0);
}
newnode->upnode=ntx;//保存父结点的地址以成链表
newnode->nextnode=NULL;
newnode->sr=0;
newnode->pr=0;
newnode->sl=opened->sr;
newnode->pl=opened->pr;
newnode->sst=sst;
newnode->spt=spt;
newnode->ssr=0;
newnode->spr=0;
newnode->loop=ntx->loop+1;
oend->nextnode=newnode;
oend=newnode;
openednum++;
return1;
}
elseif((fpr-fsr)*fpr>=0)//判断是否满足传教士人数必须大于或等于野人人数
{
fsl=fsl+sst;
fpl=fpl+spt;
for(ssr=0;ssr<=1;ssr++)//返回
{
intffsl,ffpl;
if((ssr<=fsl)&&((1-ssr)<=fpl))
{
spr=1-ssr;
ffsl=fsl-ssr;