传教士和野人问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

传教士和野人问题(Missionaries and Cannibals)传教士和野人问题是一个经典的智力游戏问题。

在这个问题中,实际上隐含了这样一个条件:如果在河的某一岸只有野人,而没有传教士,也同样被认为是合法状态。

在具体书写某些条件时,为了简便,这一点有时并没有考虑,但我们默认这个条件是被考虑了的。

有N个传教士和N个野人来到河边准备渡河,河岸有一条船,每次至多可供k人乘渡。

问传教士为了安全起见,应如何规划摆渡方案,使得任何时刻,在河的两岸以及船上的野人数目总是不超过传教士的数目。

即求解传教士和野人从左岸全部摆渡到右岸的过程中,任何时刻满足M(传教士数)≥C (野人数)和M+C≤k的摆渡方案。

设N=3,k=2,则给定的问题可用图1.2表示,图中L和R表示左岸和右岸,B=1或0分别表示有船或无船。

约束条件是:两岸上M≥C,船上M+C≤2。

图1.2 M-C问题实例
由于传教士和野人数是一个常数,所以知道了一岸的情况,另一岸的情况也就知道了。

因此为了简便起见,在描述问题时,只描述一岸--如左岸--的情况就可以了。

另外,该问题我们最关心的是在摆渡过程中,两岸状态的变化情况,因此船上的情况并不需要直接表达出来。

在一次摆渡过程中,船上究竟有几个传教士和野人,可以通过两个相连的状态简单得到。

这样表达更简练,突出了问题的重点。

(1)综合数据库:用三元组表示左岸的情况,即(,,),其中0≤,≤3,∈{0,1}
,其中表示在左岸的传教士人数,表示在左岸的野人数,=1表示船在左岸,=0表示船在右岸。

则此时问题描述可以简化为:(3,3,1)→(0,0,0)
N=3的M-C问题,状态空间的总状态数为4×4×2=32,根据约束条件的要求,可以看出只有20个合法状态。

再进一步分析后,又发现有4个合法状态实际上是不可能达到的。

因此实际的问题空间仅由16个状态构成。

下表列出分析的结果:


(001)达不到(传教士(
)(000)
均在右,船在左)
(011)
(021)
(031)
(101)不合法(右岸野人多)
(111)
(121)不合法(左岸野人多)
(131)不合法(左岸野人多)
(201)不合法(右岸野人多)
(211)不合法(右岸野人多)
(221)
(231)不合法(左岸野人多)
(301)达不到(311)
(321)
(331)(010)
(020)
(030)达不到
(100)不合法(右岸野人多)
(110)
(120)不合法(左岸野人多)
(130)不合法(左岸野人多)
(200)不合法(右岸野人多)
(210)不合法(右岸野人多)
(230)不合法(右岸野人多)
(300)
(220)
(310)
(320)
(330)达不到
规则集可以划分为两组:一组是从左岸到右岸,称为p 操作,另一组是从右岸到左岸,称为q操作。

按道理,在规则的前件中应该附加必要的条件,使得产生的状态是合法的。

在下一章有关搜索算法的讨论中我们会看到,在每一种搜索算法中,都有一处判断新产生的状态是否合法。

对于不合法的状态,算法会进行相应的处理。

因此在表达规则时,那些通过状态的合法性就可以判断的前提条件可以不在规
则中出现。

这样可以简化规则的表达。

比如在第一条规则中,在规则后件中出现了"ML-1",按道理应该要求ML>0,否则的话,在左岸的传教士人数就是负数了。

但这一点完全可以通过定义什么是合法状态来判断,因此就没有必要将这个条件写入规则中了。

但为什么在规则中写入"B L=1"、"B=0"这样的条件呢?其实这样的条件也不是一定要写的,因为它同样可以通过定义合法状态来判断。

但由于写上这些条件后,会使得规则表达更清晰,通过BL的取值就可以看出规则所表达的是船从左岸到右岸,还是从右岸到左岸。

而且从左到右,或者从右到左,是交替进行的,因此把这样的条件明确表达出来,可以提高问题的求解效率。

所以说,对于通过状态的合法性可以判断的条件,是否在规则中明确表达出来,具有一定的灵活性,可以从规则的清晰性、易懂性,以及求解效率等方面综合考虑。

而对于某些不能通过状态的合法性来判断的条件,则必须在规则中明确表达出来。

在传教士和野人问题中,假定了传教士和野人都可以划船,由于每次摆渡船上最多可以有2个人,最少也必须有一个人(船不会自己前进),因此在船上共有(2,0)、(0,2)、(1,1)、(1,0)和(0,1)这5种组合。

其中第一个数字表示在船上的传教士数,第二个数字表示在船上的野人数。

再加上从左岸到右岸和从右岸到左岸这两种情况,所以共有10种摆渡方法。

在该例题中,将这10种摆渡方法全部以规则的形式,一一列举出来。

这种方法的好处是,规则简单、易懂,但不足也很明显:繁琐。

尤其是对于实际的复杂问题,如果要全部一一列举出所有规则,其数量太大。

表示规则的另一种方式就是引入变量,通过引入变量,将相近的几条规则组合在一条规则中表示。

同样是传教士和野人问题,我们引入i和j两个变量,分别表示此次摆渡时,过河的传教士数和野人数,则可以将10条规则组合为两条规则:
IF (m, c, 1) AND 1≤i+j≤2 THEN (m-i, c-j, 0) //从左岸到右岸IF (m, c, 0) AND 1≤i+j≤2 THEN (m+i, c+j, 0)//从右岸到左

(也可以表示为:
IF (m, c, b=1) AND 1≤i+j≤2 THEN (m-i, c-j, b-1)
IF (m, c, b=0) AND 1≤i+j≤2 THEN (m+i, c+j, b+1)

这样表达的规则更加精练,但程序设计要复杂的多,因为需要对变量进行解释。

(2)规则集合:由摆渡操作组成。

该问题主要有两种操作:操作(规定为从左岸划向右岸)和操作(从右岸划向左
岸)。

每次摆渡操作,船上人数有五种组合,因而组成有10条规则的集合。

(3)初始和目标状态:即(3,3,1)和(0,0,0)。

和八数码游戏的问题一样,建立了产生式系统描述之后,就可以通过控制策略,对状态空间进行搜索,求得一个摆渡操作序列,使其能够达到目标状态。

在讨论用产生式系统求解问题时,有时引入状态空间图的概念很有帮助。

状态空间图是一个有向图,其节点可表示问题的各种状态(综合数据库),节点之间的弧线代表一些操作(产生式规则),它们可把一种状态导向另一种状态。

这样建立起来的状态空间图,描述了问题所有可能出现的状
态及状态和操作之间的关系,因而可以较直观地看出问题的解路径及其性质。

实际上只有问题空间规模较小的问题才可能作出状态空间图,例如N=3的M-C问题,其状态空间图如图1.3所示。

由于每个摆渡操作都有对应的逆操作,即
对应,所以该图也可表示成具有双向弧的形式。

从状态空间图看出解序列相当之多,但最短解序列只有4个,均由11次摆渡操作构成。

若给定其中任意两个状态分别作为初始状态和目标状态,就立即可找出对应的解序列来。

在一般情况下,求解过程就是对状态空间搜索出一条解路径的过程。

以上两个例子说明了建立产生式系统描述的过程,这也就是所谓问题的表示。

对问题表示的好坏,往往对求解过程的效率有很大影响。

一种较好的表示法会简化状态空间和规则集表示,例如八数码问题中,如用将牌移动来描述规则,则8块将牌就有32条的规则集,显然用空格走步来描述就简单得多。

又如M-C问题中,用3×2的矩阵给出左、右岸的情况来表示一种状态当然可以,但显然仅用描述左岸的三元组描述就足以表示出整个情况,因此必须十分重视选择较好的问题表示法。

以后的讨论还可以看到高效率的问题求解过程与控制策略有关,合适的控制策略可缩小状态空间的搜索范围,提高求解的效率。

图1.3 M-C问题状态空间图。

相关文档
最新文档