一只狼一头山羊和一筐卷心菜在河的同侧MATLAB程序

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

一只狼一头山羊和一筐卷心菜在河的同侧MATLAB程

安好渡河问题又称作“人狼羊菜”问题,其概括描述为︰一个人带着一条狼、一只羊、一筐白菜过河但由于船太小,人一次只能带一样东西乘船过河。

狼和羊、羊和白菜不能单独留在同岸,否那么羊或白菜会被吃掉。

该问题可使用图论中的最短路算法举行求解。

问题分析。

根据题意,人不在场时,狼要吃羊,羊要吃菜,因此,人不在场时,不能将狼与羊、羊与菜留在河的任一岸。

可用四维向量v= (m,n,p,q)来表示状态,m表示人,n代表狼,p代表羊,q代表白菜,且 m,h,p.ql {0,1},0代表在对岸,1代表在此岸。

例如,状态(0,1,1,0)表示人和菜在对岸,而狼和羊在此岸,这时人不在场,狼要吃羊,因此,这个状态是不成行的。

通过穷举法将全体可行的状态列举出来,可行的状态有
( 1,1,1,1) , ( 1,1,1,0) , ( 1,1,0,1) ,( 1,0,1,1) ,
( 1,0,1,0) ,(0,1,0,1) ,(0,1,0,0) , (0,0,1,0) , (o,0,0,1) , ( 0,0,0,0)。

可行状态共有十种。

每一次的渡河行为变更现有的状态。

现构造赋权图G=(V,E,W),其中顶点集V={v1,?,v10}中的顶点(按照
上面的依次编号)分别表示上述10个可行状态,当且仅当对应的两个可行状态之间存在一个可行转移时两顶点之间才有边连接,并且对应的权重取为1,当两个顶点之间不存在可行转移时,可以把相应的权重取为co。

因此问题变为在图G中探索一条由初始状态( 1 ,1, 1 , 1 )
启程,经最小次数转移到达最终状态( 0 , o , 0 ,0 )的转移过程,即求从状态( 1,1 ,1 ,1 )到状态( 0 , 0 , 0 ,0 )的最短路径。

该问题难点在于计算邻接矩阵,由于摆渡一次就变更现有状态,为此再引入一个四维状态转移向量,用它来反映摆渡处境。

用1表示过河,0表示未过河。

例如,( 1 ,1 , 0 , 0 )表示人带狼过河。

状态转移只有四种处境,用如下向量表示:( 1 , 0 , 0 ,0 ),( 1 , 1 ,0 ,0 ),( 1,0 , 1 ,0 ),( 1 ,0 , 0 , 1 )现在规定状态向量与转移向量之间的运算为0+O=0,1+0=1,0+1=1,1+1=0
通过上面的定义,假设某一个可行状态加上转移向量得到的新向量还属于可行状态,那么这两个可行状态对应的顶点之间就存在一条边。

用计算机编程时,可以利用普遍向量的异或运算实现,概括的Matlab程序如下:
clc,clear a=[1 1 11;1 1 10;1 1 0 1;1 0 1 1;1 0 10;0 1 0 1;0 1 0 0;0 0 1 0;0 0 0 1;0 0 0 0];%每一行是一个可行状态b=[1 0 0 0;1 1 0 0;1 0 1 0;1 0 0 1];%每一行是一个转移状态w=zeros(10);%邻接矩阵初始化
for i=1:9 for j=i+1:10 for k=1:4
if findstr(xor(a(i,:),b(k,:)),a(jz:)) w(ij)= 1; end end。

相关文档
最新文档