版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验传教士野人过河问题37030602 王世婷一、实验问题传教士和食人者问题(The Missionaries and Cannibals Problem )。在河的左岸有 3 个传教士、1条船和3个食人者,传教士们想用这条船将所有的成员运过河去,但是受 到以下条件的限制:(1)传教士和食人者都会划船,但船一次最多只能装运两个;(2)在任何岸边食人者数目都不得超过传教士,否则传教士就会遭遇危险:被食人者攻击甚至被吃掉。止匕外,假定食人者会服从任何一种过河安排,试规划出一个确保全部成员安 全过河的计划。二、解答步骤(1)设置状态变量并确定值域B为船数,要求 M>=ca M+C <=
2、3, L表示左岸,目标状态M为传教士人数,C为野人人数, R表水右岸。初始状态R000(2)确定状态组,分别列出初始状态集和目标状态集用三元组来表示 Sf: (ML, CL , BL )(均为左岸状态)其中 0 WML W3,0 WCL W3,BL C 0 , 1S0: (3,3 , 1)Sg : (0,0,0)初始状态表示全部成员在河的的左岸;目标状态表示全部成员从河的左岸全部渡河完毕。(3)定义并确定规则集合仍然以河的左岸为基点来考虑,把船从左岸划向右岸定义为Pij操作。其中,第下标i表示船载的传教士数,第二下标 j表示船载的食人者数;同理,从右岸将船划回 左岸称之为Qij操作,下标的定义
3、同前。则共有 10种操作,操作集为F=P01,P10, P11,P02,P20, Q01,Q10,Q11,Q02,Q20P0if ( ML ,CL , BL=1)then (ML- 1, CL,BL-1 )Riif ( ML ,CL , BL=1 ) then ( ML , CL- 1 , BL - 1 )Riif ( ML ,CL , BL=1)then (ML- 1, CL- 1, BL- 1 )F2oif ( ML ,CL , BL=1)then (ML- 2, CL,BL-1 )P)2if ( ML ,CL , BL=1 )then (ML , CL-2 , BL - 1)Q。if (
4、 ML ,CL , BL=0 )then (ML+1 , CL , BL+1 )Q1if ( ML ,CL , BL=0 )then (ML , CL+1 , BL +1 )Q1if ( ML ,CL , BL=0 )then (ML+1 , CL +1, BL +1)Q0 if ( ML ,CL , BL=0 ) then ( ML+2 , CL +2, BL +1 )Q02 if ( ML ,CL , BL=0 ) then ( ML , CL +2, BL +1 )(4)当状态数量不是很大时,画出合理的状态空间图(3.仇 0)11, 1)J f=2 Qii2, 1)I f=£t
5、o(o,Z Q)1 f=3 Qdl图1状态空间图箭头旁边所标的数字表示了 P或Q操作的下标,即分别表示船载的传教士数和食人者数。三、算法设计方法一:树的遍历根据规则由根(初始状态)扩展出整颗树,检测每个结点的“可扩展标记”,为“ -1的即目标结点。由目标结点上溯出路径。见源程序1。方法二:启发式搜索构造启发式函数为:工C6.01 -ML CL满足规则时 f 二、 其它选择较大值的结点先扩展。见源程序2。四、实验结果 方法一的实验结果:传教士野人过河问题第1种方法:1人,野人过去1人 1人,野人过去0人 0人,野人过去2人 0人,野人过去1人 2人,野人过去0人 1人,野人过去1人 2人,野人过
6、去0人 0人,野人过去1人 0人,野人过去2人第10次:右岸到左岸,传教士过去0人,野人过去1人第11次:左岸到右岸,传教士过去0人,野人过去2人第2种方法:第1次:左岸到右岸,传教士过去 第2次:右岸到左岸,传教士过去 第3次:左岸到右岸,传教士过去 第4次:右岸到左岸,传教士过去 第5次:左岸到右岸,传教士过去 第6次:右岸到左岸,传教士过去 第7次:左岸到右岸,传教士过去 第8次:右岸到左岸,传教士过去 第9次:左岸到右岸,传教士过去1人,野人过去1人 1人,野人过去0人 0人,野人过去2人 0人,野人过去1人 2人,野人过去0人 1人,野人过去1人 2人,野人过去0人 0人,野人过去1
7、人 0人,野人过去2人第10次:右岸到左岸,传教士过去第11次:左岸到右岸,传教士过去1人,野人过去0人1人,野人过去1人第3种方法:第1次:左岸到右岸,传教士过去 第2次:右岸到左岸,传教士过去 第3次:左岸到右岸,传教士过去 第4次:右岸到左岸,传教士过去 第5次:左岸到右岸,传教士过去 第6次:右岸到左岸,传教士过去0人,野人过去2人0人,野人过去1人0人,野人过去2人0人,野人过去1人2人,野人过去0人1人,野人过去1人第1次:左岸到右岸,传教士过去 第2次:右岸到左岸,传教士过去 第3次:左岸到右岸,传教士过去 第4次:右岸到左岸,传教士过去 第5次:左岸到右岸,传教士过去 第6次:
8、右岸到左岸,传教士过去 第7次:左岸到右岸,传教士过去 第8次:右岸到左岸,传教士过去 第9次:左岸到右岸,传教士过去第7次:左岸到右岸,传教士过去 第8次:右岸到左岸,传教士过去 第9次:左岸到右岸,传教士过去 第10次:右岸到左岸,传教士过去 第11次:左岸到右岸,传教士过去 第4种方法: 第1次:左岸到右岸,传教士过去 第2次:右岸到左岸,传教士过去 第3次:左岸到右岸,传教士过去 第4次:右岸到左岸,传教士过去 第5次:左岸到右岸,传教士过去 第6次:右岸到左岸,传教士过去 第7次:左岸到右岸,传教士过去 第8次:右岸到左岸,传教士过去 第9次:左岸到右岸,传教士过去 第10次:右岸到
9、左岸,传教士过去第11次:左岸到右岸,传教士过去 方法二的实验结果:传教士野人过河问题方法如下2人,野人过去0人0人,野人过去1人0人,野人过去2人0人,野人过去1人0人,野人过去2人0人,野人过去2人0人,野人过去1人0人,野人过去2人0人,野人过去1人2人,野人过去0人1人,野人过去1人2人,野人过去0人0人,野人过去1人0人,野人过去2人1人,野人过去0人1人,野人过去1人1人,野人过去1人,野人过去0人,野人过去0人,野人过去2人,野人过去1人,野人过去2人,野人过去0人,野人过去0人,野人过去0人,野人过去0人,野人过去1 人 l:2r,2y r:1r,1y0 人 l:3r,2y r
10、:0r,1y2 人 l:3r,0y r:0r,3y1 人 l:3r,1y r:0r,2y0 人 l:1r,1y r:2r,2y1 人 l:2r,2y r:1r,1y0 人 l:0r,2y r:3r,1y1 人 l:0r,3y r:3r,0y2 人 l:0r,1y r:3r,2y1 人 l:0r,2y r:3r,1y2 人 l:0r,0y r:3r,3y第1次:左岸到右岸,传教士过去 第2次:右岸到左岸,传教士过去 第3次:左岸到右岸,传教士过去 第4次:右岸到左岸,传教士过去 第5次:左岸到右岸,传教士过去 第6次:右岸到左岸,传教士过去 第7次:左岸到右岸,传教士过去 第8次:右岸到左岸,传
11、教士过去 第9次:左岸到右岸,传教士过去 第10次:右岸到左岸,传教士过去 第11次:左岸到右岸,传教士过去 问题结束 由结果可以看出,方法二的结果为方法一的第一种结果,两者具有一致性。五、总结与教训:最开始时采用的方法为:用向量A=X0,X1,X2, X3,X4,X5,X6表示状态,其X。X2表示三个传教士的位置, X3X5表示三个野人的位置,X6表示船的位置表示在河左岸,1表示已渡过了河,在河右岸。设初始状态和目标状态分别为:S:So =0,0,0,0,0,0,0G:Sg =1,1,111,1,1但在描述规则时发现这样定义会造成规则麻烦、不清晰,原因在于此题并不关心是哪几个传教士和野人在船
12、上,仅关心其人数,故没有必要将每个人都设置变量,分别将传教 士、野人、船作为一类即可。四、源代码1.源程序1:树的遍历%野人和传教士过河问题%date:2010/12/14%author:wang shi tingfunction =guohe()clear all;close all;global n node;n=2;solveNum=1; %问题的解法result=zeros(100,1);node=zeros(300,5);node(1,:)=3,3,1,1,-1;% 初始化%1左岸传教士数2左岸野人数3船(1为左岸,0为右岸)%4是否可扩展(1为可扩展)5父节点号(-1表示无父节点,
13、即为初始节点)j=1;% for j=1:nwhile (1)if j>nbreakendif node(j,4)=1 %判断结点是否可扩展if node(j,3)=1 %船在左岸if ( (node(j,1)=0) | (node(j,1)=3) )&&(node(j,2)>=1) forward(j,0,1);endif (node(j,1)=1 && node(j,2)=1 | node(j,1)=3 && node(j,2)=2) forward(j,1,0);endif (node(j,1)>=1 &&
14、 node(j,1)=node(j,2)forward(j,1,1);endif (node(j,1)=0 | node(j,1)=3)&& node(j,2)>=2 forward(j,0,2);endif (node(j,1)=2 && node(j,2)=2 | node(j,1)=3 && node(j,2)=1) forward(j,2,0);endelseif node(j,3)=0% 船在右岸if ( (node(j,1)=0) | (node(j,1)=3) )&&(node(j,2)<=2) afte
15、rward(j,0,1);endif (node(j,1)=2 && node(j,2)=2 | node(j,1)=0 && node(j,2)=1) afterward(j,1,0);endif (node(j,1)<=2 && node(j,1)=node(j,2) afterward(j,1,1);endif (node(j,1)=0 | node(j,1)=3)&& node(j,2)<=1 afterward(j,0,2);endif (node(j,1)=1 && node(j,2)=1
16、| node(j,1)=0 && node(j,2)=2) afterward(j,2,0);endendendj=j+1;endfprintf('传教士野人过河问题n');for t=1:nj=1;k=t;StepNum=1;if node(k,4)=-1while (k=-1) result(j)=k; k=node(k,5);j=j+1;endj=j-1;fprintf('第曲中方法:n',solveNum);while j>1BoatPriNum=node(result(j),1)-node(result(j-1),1);BoatW
17、ildNum=node(result(j),2)-node(result(j-1),2);if node(result(j),3)=1fprintf('第次:左岸到右岸,传教士过去 d人,野人过去人n',StepNum,abs(BoatPriNum),abs(BoatWildNum);StepNum=StepNum+1; endif node(result(j),3)=0fprintf('第次:右岸到左岸,传教士过去d人,野人过去人n',StepNum,abs(BoatPriNum),abs(BoatWildNum);StepNum=StepNum+1;endj
18、=j-1; end pause(0.2); fprintf('n'); solveNum=solveNum+1;endendfprintf(' 问题结束);%从左岸到右岸,船上传教士 x个,野人y个function =forward(z,x,y)global n;global node;node(n,1)=node(z,1)-x;node(n,2)=node(z,2)-y;node(n,3)=0;r=search(z);if(r)return endnode(z,4)=0;node(n,4)=1;node(n,5)=z;s=destination();if snode(
19、n,4)=-1;endn=n+1;%呱右岸到左岸,船上传教士 x个,野人y个function =afterward(z,x,y)global n;global node;node(n,1)=node(z,1)+x;node(n,2)=node(z,2)+y;node(n,3)=1;r=search(z);if(r)returnendnode(z,4)=0;node(n,4)=1;node(n,5)=z;s=destination();if snode(n,4)=-1;endn=n+1;%function r=search(x)global n node;i=x;while node(i,5)=
20、-1if node(i,1)=node(n,1) && node(i,2)=node(n,2) && node(i,3)=node(n,3) r=0;returnendi=node(i,5);end%艮初始节点比较if node(i,1)=node(n,1) && node(i,2)=node(n,2) && node(i,3)=node(n,3)r=0;returnendr=1;%均不相同 % function s=destination()global n node;if node(n,1)=0 && node
21、(n,2)=0 && node(n,3)=0 s=1;returnends=0;2.运用启发式函数%野人和传教士过河问题%date:2010/12/15%author:wang shi tingfunction =guohe()clear all;close all;global n node open_list index;n=2;result=zeros(100,1);node=zeros(100,5);node(1,:)=3,3,1,1,-1;% 初始化%1左岸传教士数2左岸野人数3船(1为左岸,0为右岸)%4是否可扩展(1为可扩展)5父节点号(-1表示无父节点,即为初始
22、节点)index=1;open_list=1,0.01;% 节点号启发函数值while (1)row,尸size(open_list);if row=0fprintf('all the nodes in open list have been expanded.'); returnendfor i1=1:rowopen_list(i1,2)=6.01-node(open_list(i1,1),1)-node(open_list(i1,1),2);%定义启发函数if node(open_list(i1,1),4)=-1%如果该结点是目标结点,则打印结果fprintf('传
23、教士野人过河问题n');j=1;k=open_list(i1,1);StepNum=1;while (k=-1)result(j)=k;k=node(k,5);j=j+1;endj=j-1;fprintf('方法如下 n');while j>1BoatPriNum=node(result(j),1)-node(result(j-1),1);BoatWildNum=node(result(j),2)-node(result(j-1),2);if node(result(j),3)=1fprintf('第次:左岸到右岸,传教士过去d人,野人过去人n',
24、StepNum,abs(BoatPriNum),abs(BoatWildNum);StepNum=StepNum+1;endif node(result(j),3)=0fprintf('第次:右岸到左岸,传教士过去d人,野人过去人n',StepNum,abs(BoatPriNum),abs(BoatWildNum);StepNum=StepNum+1;endj=j-1;endpause(0.2);fprintf('问题结束 n');returnendendr_row,,尸find(open_list(:,2)=max(open_list(:,2);j=open_
25、list(r_row(1,1),1);if node(j,3)=1 %船在左岸if ( (node(j,1)=0) | (node(j,1)=3) )&&(node(j,2)>=1)forward(j,0,1);endif (node(j,1)=1 && node(j,2)=1 | node(j,1)=3 && node(j,2)=2)forward(j,1,0);endif (node(j,1)>=1 && node(j,1)=node(j,2)forward(j,1,1);endif (node(j,1)=0 |
26、node(j,1)=3)&& node(j,2)>=2forward(j,0,2);endif (node(j,1)=2 && node(j,2)=2 | node(j,1)=3 && node(j,2)=1) forward(j,2,0);endelseif node(j,3)=0% 船在右岸if ( (node(j,1)=0) | (node(j,1)=3) )&&(node(j,2)<=2)afterward(j,0,1);endif (node(j,1)=2 && node(j,2)=2 | n
27、ode(j,1)=0 && node(j,2)=1) afterward(j,1,0);endif (node(j,1)<=2 && node(j,1)=node(j,2)afterward(j,1,1);endif (node(j,1)=0 | node(j,1)=3)&& node(j,2)<=1afterward(j,0,2);endif (node(j,1)=1 && node(j,2)=1 | node(j,1)=0 && node(j,2)=2) afterward(j,2,0);endend%display(open_list);open_list(r_row(1),:)=;index=index-1;%open 表个数减 1%display(open_list);end%从左岸到右岸,船上传教士 x个,野人y个function =forward(z,x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 不可撤销合同担保协议范本大全
- 个人购房借款合同范本
- 个人商业地产买卖合同模板
- 个人合伙投资合同范本示例
- 产业协同发展战略合作合同范本
- 个人房屋抵押贷款合同
- 人事合同范本:事业单位专用
- 产品代理销售合同(化工产品)
- 二手别墅买卖合同范本
- 个人商用房租赁合同样本
- 【七上HK数学】安徽省蚌埠市固镇县2024-2025学年七年级上学期1月期末试卷数学试题
- 电信网和互联网图像篡改检测技术要求与测试方法
- 2025届江苏省南京市盐城市高三一模考试语文试题 课件
- 《水稻生长进程》课件
- 2024版企业高管职务任命书3篇
- 青少年铸牢中华民族共同体意识路径研究
- 江苏省南京市2024年中考英语试题(含解析)
- 学校农业教育体验项目方案
- 水利工程施工监理规范(SL288-2014)用表填表说明及示例
- 独家投放充电宝协议书范文范本
- 财税实操-反向开票的方式解读
评论
0/150
提交评论