




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
野人与修道士问题(Missionaries-and-Cannibals Problem)修道士与野人问题:三个野人与三个传教士来到河边,打算乘一只船从右岸渡到左岸去,该船的最大负载能力为两个人。在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。用状态空间法表示修道士与野人问题并设计编写计算机程序求问题的解。问题分析:船B修道士M野 人C左L右R从上图可知,修道士、野人和船一共有六种可能,ML、CL、BL、MR、CR、BR。可以表示为q(M,C,B),其中m表示修道士的数目(0、1、2、3)、c表示野人的数目(0、1、2、3)、b表示船在左岸(1)或右岸(0)。1、 定义状态的描述形式:(m,c,b)2、 表示所有可能的状态,并确定初始状态集和目标状态集:s0(3,3,1) s8(1,3,1) s16(3,3,0) s24(1,3,0)s1(3,2,1) s9(1,2,1) s17(3,2,0) s25(1,2,0)s2(3,1,1) s10(1,1,1) s18(3,1,0) s26(1,1,0)s3(3,0,1) s11(1,0,1) s19(3,0,0) s27(1,0,0)s4(2,3,1) s12(0,3,1) s20(2,3,0) s28(0,3,0)s5(2,2,1) s13(0,2,1) s21(2,2,0) s29(0,2,0)s6(2,1,1) s14(0,1,1) s22(2,1,0) s30(0,1,0)s7(2,0,1) s15(0,0,1) s23(2,0,0) s31(0,0,0)初始状态:(3,3,1)目标状态:(0,0,0)3、 定义算符:Lij:把i个修道士,j个野人从河的左岸送到右岸Rij:把i个修道士,j个野人从河的右岸送到左岸整个问题就抽象成了怎样从初始状态经中间的一系列状态达到目标状态。问题状态的改变是通过划船渡河来引发的,所以合理的渡河操作就成了通常所说的算符,根据题目要求,可以得出以下5个算符(按照渡船方向的不同,也可以理解为10个算符):渡1野人、渡1牧师、渡1野人1牧师、渡2野人、渡2牧师即:L01或R01,L10或R10,L11或R11,L02或R02,L20或R204、状态空间图:L02R01R10R10R21L02L02L01L11R11L11L02L01S0S30S18S17S21S1S14S2S26S12S29S5S31S10S14S18R01R01L20L205、设计编写计算机程序求问题的解:算法:在应用状态空间表示和搜索方法时,用(M,C,B)来表示状态描述,其中M和C分别表示在左岸的传教士与野人数。B为1表示船在左岸,为0表示在右岸。于是初始状态为(0,0,0),目标状态为(3,3,1)。我们将此问题用图表示出来,首先生成各种安全状态结点,存放在顶点向量中;在建立了图的邻接矩阵存储结构后,利用深度优先搜索思想从顶点(0,0,0)到顶点(3,3,1)的一条简单路径。#include #include #define VEX_NUM 18 /* 最大顶点个数 */typedef struct /* 定义图的顶点类型 */ int Missionary,Cannibal,Boat; Vextype;typedef struct int vexnum ; /* 图的当前顶点数 */ Vextype vexsVEX_NUM; /* 顶点向量 */ int adjVEX_NUMVEX_NUM; /* 邻接矩阵 */ AdjGraph;int visitedVEX_NUM; /* 遍历过程中进行标记用的辅助数组 */int pathVEX_NUM;/* 查找顶点(M,C,B)在顶点向量中的位置 */int locate(AdjGraph *G,int M,int C,int B) int i; for (i=0;ivexnum;i+) if ( G-vexsi.Missionary=M & G-vexsi.Cannibal=C & G-vexsi.Boat=B ) return(i); return(-1);/* 判断状态(M,C,B)是否合理 */int is_safe(int M,int C,int B) if (M=C) if (M=3) if (B=0) return (0); else return (1); else if (M=0) if (B=1) return (0); else return (1); else return (1); else if (M=0)|(M=3) return (1); else return (0);/* 检查第i个状态和第j个状态是否可转换 */int is_connected(AdjGraph *G,int i,int j) int k=0; while (G-vexsi.Boat=1) if ( G-vexsj.Missionary - G-vexsi.Missionary = -1 & G-vexsj.Cannibal=G-vexsi.Cannibal ) k+; if ( G-vexsj.Missionary=G-vexsi.Missionary & G-vexsj.Cannibal - G-vexsi.Cannibal= -1 ) k+; if ( G-vexsj.Missionary - G-vexsi.Missionary= -2 & G-vexsj.Cannibal=G-vexsi.Cannibal ) k+; if ( G-vexsj.Missionary = G-vexsi.Missionary & G-vexsj.Cannibal - G-vexsi.Cannibal = -2 ) k+; if ( G-vexsj.Missionary - G-vexsi.Missionary = -1 & G-vexsj.Cannibal - G-vexsi.Cannibal = -1 ) k+; if ( G-vexsj.Boat=0 & k=1) return (1); else return (0); while (G-vexsi.Boat=0) if ( G-vexsj.Missionary - G-vexsi.Missionary=1 & G-vexsj.Cannibal =G-vexsi.Cannibal ) k+; if ( G-vexsj.Missionary = G-vexsi.Missionary & G-vexsj.Cannibal - G-vexsi.Cannibal= 1 ) k+; if ( G-vexsj.Missionary - G-vexsi.Missionary= 2 & G-vexsj.Cannibal= G-vexsi.Cannibal ) k+; if ( G-vexsj.Missionary = G-vexsi.Missionary & G-vexsj.Cannibal - G-vexsi.Cannibal =2 ) k+; if ( G-vexsj.Missionary - G-vexsi.Missionary = 1 & G-vexsj.Cannibal - G-vexsi.Cannibal =1 ) k+; if ( G-vexsj.Boat = 1 & k=1 ) return (1); else return (0); void CreateG(AdjGraph *G) int i,j,M,C,B; i=0; for (M=0;M=3;M+) /* 形成所有合理的状态结点 */ for (C=0;C=3;C+) for (B=0;Bvexsi.Missionary=M; G-vexsi.Cannibal=C; G-vexsi.Boat=B; i+; G-vexnum=i; for (i=0;ivexnum;i+) /* 生成邻接矩阵 */ for (j=0;jvexnum;j+) if (is_connected(G,i,j) G-adjij=G-adjji=1; else G-adjij=G-adjji=0; return;void DFS_path(AdjGraph *G,int u,int v) /* 求从U到V的简单路径 */ int j; visitedu=1; for (j=0;jvexnum;j+) if ( G-adjuj=1 & visitedj=0 & visitedv=0 ) pathu=j; DFS_path(G,j,v); /* 深度优先搜索 */ void print_path(AdjGraph *G,int u,int v) /* 输出从U到V的简单路径 */ int k=u; while (k!=v) printf(%d,%d,%d)n,G-vexsk.Missionary,G-vexsk.Cannibal, G-vexsk.Boat); k=pathk; printf(%d,%d,%d)n,G-vexsk.Missionary,G-vexsk.Cannibal, G-vexsk.Boat); getchar();/* 主
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年康复医学康复评定工具模拟考试答案及解析
- 2025年风湿免疫科疾病诊治方案选择考试卷答案及解析
- 2025-2030工程机械远程运维服务生态系统构建与盈利模式创新研究报告
- 2025年心血管内科常见病例解读竞赛答案及解析
- 2025年病理科学病理标本解剖技能测试答案及解析
- 2025年骨科常见创伤骨折处理技巧考核模拟试卷答案及解析
- 2025年眼科常见疾病诊断与治疗技术操作考察答案及解析
- 2025年心理学心理评估与咨询技能检测答案及解析
- 2025年急诊抢救技能实操检测答案及解析
- 2025年传染病学基本防治知识竞赛答案及解析
- 河北省承德市隆化县第二中学2023-2024学年九年级上学期期中考试物理试题(无答案)
- 2024年新人教版八年级上册物理全册教案
- 伤口造口专科护士进修汇报
- MOOC 实验室安全学-武汉理工大学 中国大学慕课答案
- 彩钢房建造合同
- 2型糖尿病低血糖护理查房课件
- 医院物业服务投标方案
- 高压燃气管道施工方案
- 国家免疫规划疫苗儿童免疫程序说明-培训课件
- GB/T 13298-1991金属显微组织检验方法
- 劳动人事争议仲裁案例分析与问题探讨课件
评论
0/150
提交评论