传教士野人过河问题-两种解法思路

37030602  王世婷
一、实验问题
传教士和食人者问题(The Missionaries and Cannibals Problem)。在河的左岸有3个传教士、1条船和3个食人者,传教士们想用这条船将所有的成员运过河去,但是受到以下条件的限制:(1)传教士和食人者都会划船,但船一次最多只能装运两个;(2)在任何岸边食人者数目都不得超过传教士,否则传教士就会遭遇危险:被食人者攻击甚至被吃掉。此外,假定食人者会服从任何一种过河安排,试规划出一个确保全部成员安全过河的计划。
二、解答步骤
(1)设置状态变量并确定值域
M为传教士人数,C 为野人人数,B为船数,要求M>=C且M+C <= 3,L表示左岸,R表示右岸。
初始状态                            目标状态
外用贴剂
L    R                            L    R
M    3    0                            M    0    3
C    3    0                            C    0    3
B    1    0                            B    0    1
(2)确定状态组,分别列出初始状态集和目标状态集
用三元组来表示:(ML , CL , BL)(均为左岸状态)
其中,BL ∈{ 0 , 1}
  :(3 , 3 , 1)        : (0 , 0 , 0)
初始状态表示全部成员在河的的左岸;
目标状态表示全部成员从河的左岸全部渡河完毕。
(3)定义并确定规则集合
仍然以河的左岸为基点来考虑,把船从左岸划向右岸定义为Pij操作。其中,第一下标i表示船载的传教士数,第二下标j表示船载的食人者数;同理,从右岸将船划回左岸称之为Qij操作,下标的定义同前。则共有10种操作,操作集为
      F={P01,P10,P11,P02,P20,Q01,Q10,Q11,Q02,Q20}
P耐高温毛毡10    if ( ML ,CL , BL=1 )  then ( ML1 , CL , BL 1 )
P01    if ( ML ,CL , BL=1 )  then ( ML , CL1 , BL 1 )
P11    if ( ML ,CL , BL=1 )  then ( ML1 , CL1 , BL 1 )
P20    if ( ML ,CL , BL=1 )  then ( ML2 , CL , BL 1 )
P02    if ( ML ,CL , BL=1 )  then ( ML , CL2 , BL 1 )
Q10     if ( ML ,CL , BL=0 )  then ( ML+1 , CL , BL+1 )
Q01    if ( ML ,CL , BL=0 )  then ( ML , CL+1 , BL +1 )
Q11    if ( ML ,CL , BL=0 )  then ( ML+1 , CL +1, BL +1 )
Q20    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)当状态数量不是很大时,画出合理的状态空间图
       
图1 状态空间图
箭头旁边所标的数字表示了P或Q操作的下标,即分别表示船载的传教士数和食人者数。
三、算法设计
方法一: 树的遍历
根据规则由根(初始状态)扩展出整颗树,检测每个结点的“可扩展标记”,为“-1”的即目标结点。由目标结点上溯出路径。
见源程序1。
方法二:启发式搜索
构造启发式函数为:
选择较大值的结点先扩展。
见源程序2。
四、实验结果
方法一的实验结果:
传教士野人过河问题
第1种方法:
第1次:左岸到右岸,传教士过去1人,野人过去1人
第2次:右岸到左岸,传教士过去1人,野人过去0人
第3次:左岸到右岸,传教士过去0人,野人过去2人
第4次:右岸到左岸,传教士过去0人,野人过去1人
第5次:左岸到右岸,传教士过去2人,野人过去0人
第6次:右岸到左岸,传教士过去1人,野人过去1人
第7次:左岸到右岸,传教士过去2人,野人过去0人
第8次:右岸到左岸,传教士过去0人,野人过去1人
第9次:左岸到右岸,传教士过去0人,野人过去2人
第10次:右岸到左岸,传教士过去0人,野人过去1人
第11次:左岸到右岸,传教士过去0人,野人过去2人
第2种方法:
第1次:左岸到右岸,传教士过去1人,野人过去1人
第2次:右岸到左岸,传教士过去1人,野人过去0人
第3次:左岸到右岸,传教士过去0人,野人过去2人
第4次:右岸到左岸,传教士过去0人,野人过去1人
第5次:左岸到右岸,传教士过去2人,野人过去0人
第6次:右岸到左岸,传教士过去1人,野人过去1人
第7次:左岸到右岸,传教士过去2人,野人过去0人
第8次:右岸到左岸,传教士过去0人,野人过去1人
第9次:左岸到右岸,传教士过去0人,野人过去2人
第10次:右岸到左岸,传教士过去1人,野人过去0人
第11次:左岸到右岸,传教士过去1人,野人过去1人
第3种方法:
第1次:左岸到右岸,传教士过去0人,野人过去2人
第2次:右岸到左岸,传教士过去0人,野人过去1人
第3次:左岸到右岸,传教士过去0人,野人过去2人
第4次:右岸到左岸,传教士过去0人,野人过去1人
第5次:左岸到右岸,传教士过去2人,野人过去0人
第6次:右岸到左岸,传教士过去1人,野人过去1人
第7次:左岸到右岸,传教士过去2人,野人过去0人
第8次:右岸到左岸,传教士过去0人,野人过去1人光耦电路
第9次:左岸到右岸,传教士过去0人,野人过去2人
第10次:右岸到左岸,传教士过去0人,野人过去1人
第11次:左岸到右岸,传教士过去0人,野人过去2人
第4种方法:
第1次:左岸到右岸,传教士过去0人,野人过去2人
第2次:右岸到左岸,传教士过去0人,野人过去1人
第3次:左岸到右岸,传教士过去0人,野人过去2人
第4次:右岸到左岸,传教士过去0人,野人过去1人
第5次:左岸到右岸,传教士过去2人,野人过去0人
雨棚信号灯第6次:右岸到左岸,传教士过去1人,野人过去1人
第7次:左岸到右岸,传教士过去2人,野人过去0人
第8次:右岸到左岸,传教士过去0人,野人过去1人
第9次:左岸到右岸,传教士过去0人,野人过去2人
第10次:右岸到左岸,传教士过去1人,野人过去0人
第11次:左岸到右岸,传教士过去1人,野人过去1人
方法二的实验结果:
传教士野人过河问题
方法如下
第1次:左岸到右岸,传教士过去1人,野人过去1人  l:2r,2y  r:1r,1y
第2次:右岸到左岸,传教士过去1人,野人过去0人  l:3r,2y  r:0r,1y
第3次:左岸到右岸,传教士过去0人,野人过去2人  l:3r,0y  r:0r,3y
第4次:右岸到左岸,传教士过去0人,野人过去1人  l:3r,1y  r:0r,2y
第5次:左岸到右岸,传教士过去2人,野人过去0人  l:1r,1y  r:2r,2y
第6次:右岸到左岸,传教士过去1人,野人过去1人  l:2r,2y  r:1r,1y
第7次:左岸到右岸,传教士过去2人,野人过去0人  l:0r,2y  r:3r,1y
第8次:右岸到左岸,传教士过去0人,野人过去1人  l:0r,3y  r:3r,0y
第9次:左岸到右岸,传教士过去0人,野人过去2人  l:0r,1y  r:3r,2y
第10次:右岸到左岸,传教士过去0人,野人过去1人  l:0r,2y  r:3r,1y
第11次:左岸到右岸,传教士过去0人,野人过去2人  l:0r,0y  r:3r,3y
问题结束
由结果可以看出,方法二的结果为方法一的第一种结果,两者具有一致性。
五、总结与教训:
最开始时采用的方法为:用向量表示状态,其中表示三个传教士的位置,表示三个野人的位置,表示船的位置。表示在河左岸,表示已渡过了河,在河右岸。
设初始状态和目标状态分别为:枸杞果糕
但在描述规则时发现这样定义会造成规则麻烦、不清晰,原因在于此题并不关心是哪几个
传教士和野人在船上,仅关心其人数,故没有必要将每个人都设置变量,分别将传教士、野人、船作为一类即可。
四、源代码
1. 源程序1:树的遍历
%野人和传教士过河问题
%date:2010/12/14电表铅封
%author:wang shi ting
function [ ]=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表示无父节点,即为初始节点)
j=1;
% for j=1:n
while (1)
    if j>n
        break
    end
    if 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);
            end
            if (node(j,1)==1 && node(j,2)==1 || node(j,1)==3 && node(j,2)==2)
                forward(j,1,0);
            end
            if (node(j,1)>=1 && node(j,1)==node(j,2))
                forward(j,1,1);
            end
            if (node(j,1)==0 || node(j,1)==3)&& node(j,2)>=2
                forward(j,0,2);
            end
            if (node(j,1)==2 && node(j,2)==2 || node(j,1)==3 && node(j,2)==1)

本文发布于:2024-09-20 22:30:22,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/107390.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:传教士   表示   过河   野人   结点
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议