- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
传教士和野人问题实验报告
1.上机内容
传教士与野人问题求解(宽度搜索算法)
二 问题背景:
从前有一条河,河的左岸有m个传教士(Missionary)和m个野人(Cannibal),和一艘最多可乘n人的小船。约定左岸,右岸和船上或者没有传教士,或者野人数量少于传教士,否则野人会把传教士吃掉。
三 实验内容:
编程,接收m和n,搜索一条可让所有的野人和传教士安全渡到右岸的方案,例如下图:
(M表示传教士(Missionary),C 表示野人(Cannibal))
初 态 目 标 Left
Bank River Right
bank Left
Bank River Right
bank M…. M…. C…. C….
注:本实验的举例均以3个传教士和3个野人同在左岸作为初始状态。
四 实验方案和算法:
1.数据结构:
本实验需要用到的数据结构主要是队列和堆栈,其实现均包含于dso.h头文件中,分别命名为class stack和class queue。
2.宽度搜索算法:
(1)结点结构:
class Move {
public:
??? int missionary;????? //要移动的传教士数量
??? int cannibal;??????? //野人
};
class ElemType : Move {? //继承Move类,获得传教士,野人数据成员。
private:
??? bool boat;??????? ??? //船是否在左岸?
public:
??? ElemType* flag;????? // 标示前一状态即扩展出本结点的父结点信息
??? ElemType(int MAX_PEOPLE) {? //创建初始状态
?????? missionary = cannibal = MAX_PEOPLE;
?????? boat = true;
?????? flag = NULL;
}
……
在这里,Elemtype集成了Move,从而获得Move类的传教士和野人数据成员。以上两个类的数据成员用于保存所有扩展生成的结点。其中missionary表示表示左岸上传教士的树目,cannibal表示左岸上野人的树目,boat表示船在哪个岸上(其中true表示在左岸,这是船的初始状态,表示false在右岸), flag用于标示前一状态即扩展出本结点的父结点信息,以便最后回搜找出解的
路径。
举例说明:假设左岸有3个传教士和3个野人,小船最多可乘2人。把当前左岸的状态抽象为:(3,3,1),前两个3代表左岸有3个传教士和3个野人,1代表船在左岸。很明显,目标状态为(0,0,0),表示左岸的传教士和也人数目都是0,而船在右岸。
(2)船的行动规则(successor function):
把每一次可行的渡船方案作为行动规则,用Move类的(m,c)表示。行动规则的两位数分别代表要移动的传教士,野人的数量。对于固定大小的船,其装载能力是一定的,所以它的行动规则空间也是一定的。在这里,用MoveGroup类的构造函数构造出所有的行动规则。
注意,这里MoveGroup类中的Move对象只有500的可用空间,所以,输入的传教士和野人数目构成的行动规则不能超过500种。
(3)宽度优先算法:
实验的主要搜索算法由ANSWER类的构造函数实现,这里主要用到了OPEN和CLOSED队列,以及一个临时的TEMP堆栈。其中,OPEN表用于存放扩展结点,CLOSED表用于存放被扩展结点,TEMP则用于用于记录成功搜索的路径。
搜索过程大致如下描述:先构造初始结点以及船的行动规则,初始结点入OPEN队列,以宽度优先依次搜索OPEN队列头结点的子结点,同时保存受访问结点的父结点信息,知道搜索到目标结点或者无解为止。
算法框图如下所示:
3 程序界面和功能说明:
程序运行环境为DOS控制台,运行开始以后,程序提示输入需要坐船的传教士和野人数目,例如输入3表示有3个传教士和3个野人。
用户按回车键以后,程序继续提示输入船的装载能力,例如输入2表示这个船依次最多可以坐2人。注:一般情况下,船的装载能力应该少于传教士或野人的数量,而且一般为偶数。
程序开始运行时的界面截图:
程序运行结束时的界面截图:
输出文件示例:
Left(3, 3) | (0, 0)Right
[Step 1]
Move 0 missionaries and 2 cannibals to the right side.
Left(3, 1) | (0, 2)Right
[Step 2]
Move 0 missionaries and 1
您可能关注的文档
- 会计从业资格电算化考试串讲题目.doc
- 台式电脑维护维修合同.doc
- 台湾最出名的减肥书籍.doc
- 史上最全Linux配置文件介绍及VI编辑器的使用方法.doc
- 史上最全房屋装修总攻略.doc
- 会计信息系统知识点整合复习.doc
- 会计信息系统简答题.doc
- 会计信息系统考试复习题.doc
- 会计信息系统试验报告.doc
- 会计信息系统课程设计报告.doc
- 2025AACR十大热门靶点推荐和解读报告52页.docx
- 财务部管理报表.xlsx
- 高中物理新人教版选修3-1课件第二章恒定电流第7节闭合电路欧姆定律.ppt
- 第三单元知识梳理(课件)-三年级语文下册单元复习(部编版).pptx
- 俄罗斯知识点训练课件-七年级地理下学期人教版(2024).pptx
- 课外古诗词诵读龟虽寿-八年级语文上学期课内课件(统编版).pptx
- 高三语文二轮复习课件第七部分实用类文本阅读7.2.1.ppt
- 高考物理人教版一轮复习课件第4章第3讲圆周运动.ppt
- 高考英语一轮复习课件53Lifeinthefuture.ppt
- 2025-2030衣柜行业风险投资发展分析及投资融资策略研究报告.docx
文档评论(0)