传教士和野人问题实验报告.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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

文档评论(0)

hagoulz + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档