数学建模实验
——人、狼、羊、菜渡河问题
机自75班  张超     
07011132       
人狼羊菜问题的研究
一.摘要:
左岸右岸
将人狼羊菜依次用一个四维向量表示,对每一分量按二进制法则进行运算,这种运算成为可取运算.将这种运算方法设计为Matlab语言,进行计算机的计算.
二.关键词: 四维向量
三.问题:
一个摆渡人F希望用一条小船把一只狼W,一只羊G和一篮白菜C从一条河的左岸渡到右岸去,而船小只能容纳F,W,G,C中的两个,绝不能在无人看守的情况下,留下狼和羊或羊和白菜在一起,应怎样渡河才能把狼羊白菜都运过去?
四.问题分析:
这个问题可以用递推方法解决,但我们可以将其转换成状态转移问题来解决。
可取状态A共有10个,即 (1,1,1,1)、(0,0,0,0)、(1,1,1,0)、(0,0,0,1)、(1,1,0,1)、(0,0,1,0)、(1,0,1,1)、(0,1,0,0)、(1,0,1,0)、(0,1,0,1)。
可取运载B有4个 (1,1,0,0)、(1,0,1,0)、(1,0,0,1)、(1,0,0,0)。
规定A和B的每一分量相加时按二进制进行,这样一次渡河就是一个可取状态和一个可取运载相加,在判断和向量是否属于可取状态即可。
五.Matlab编程设计思路
可以将可取状态及可取运载分别编成矩阵。共分为五个m文件,一个主文件xduhe.m数,分
别为:
1、duhe(L,B,M,s)函数。
用来实现渡河总思路。思路为:将起始矩阵A分别与可取运载相加(使用二进制法则),判断相加后的矩阵C是否是【0,0,0,0】,如果是,则渡河成功。否则,用fuhe(C,M) 函数判断C是否是可取状态,如果是,则打印并将C与初始矩阵合并成新矩阵,继续调用duhe.m函数。
2、 fuhe(C,M)函数。
判断和矩阵C是否属于矩阵M,如果是,则返回1,否则返回0.
3、Panduan(S函数。
判断S矩阵中是否有两个相同的状态,即行向量。如果有,则返回0,否则返回1.
4、print(K,C,s)函数。
打印相应的状态。
六.程序代码
1、xduhe.m文件
clear;clc;
A=[1,1,1,1];
B=[1,0,1,0;1,1,0,0;1,0,0,1;1,0,0,0];
M=[1,1,1,0;0,0,0,1;1,1,0,1;0,0,1,0;1,0,1,1;0,1,0,0;1,0,1,0;0,1,0,1];
duhe(A,B,M,1);
2、duhe.m文件
function duhe(L,B,M,s);
[h,l]=size(L);
for k=s:h
    for i=1:4
        C=mod(L(k,:)+B(i,:),2);
        if C==[0,0,0,0]
            print(B(i,:),C,s);
                fprintf('渡河成功\n\n');
                break;
        else if fuhe(C,M)==1
                print(B(i,:),C,s);
                S=[L;C];         
                if Panduan(S)==1
                duhe(S,B,M,s+1);
              else
                fprintf('此渡河方案不可行\n\n');
              end
          end
        end
    end
end
3、fuhe.m文件
function y=fuhe(C,M)
y=0;
for i=1:8
    if(C==M(i,:))
        y=1;
        break;
    end
end
4、Panduan.m文件
function z=Panduan(S)
z=1;
[m,n]=size(S);