在图论中农夫过河是一个非常典型的问题。问题:某人带狼羊以及一筐蔬菜过河,小船需要人滑动,而且每次只能带一样东西(羊,狼,或者蔬菜)。而且人不在场时,狼会吃羊,羊会吃菜。请问这个人应该如何过河?三者之家是存在制约关系的。过冷水也有相关动画演示,本期过冷水和大家看一下如何将其抽象为一个数学问题。
首先,我们需要用一个向量来存储这个人和三件东西的状态,状态只有两种,此岸和彼岸。用一个四维向量来存储,人或者物在此岸为1,在彼岸为0。那么我们就可以存储所有的状态了,[x1,x2,x3,x4]。这就是那个四维向量。x1表示人,x2表示狼,x3 表示羊,x4表示蔬菜。
例如[1,1,0,0]表示人和狼在此岸,羊和蔬菜在彼岸。下面就是这个问题抽象后的图。Node1代表都在此岸。Node10代表都在彼岸。我们需要从Node1到达Node10。
接下来,我们就要表示出所有可行的状态了,因为三件东西都不能有损失,所以有些状态是不行的,比如[1,1,0,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);(0,0,0,1);(0,0,0,0);
我们的目标就是让所有的东西安全过河,也就是(1,1,1,1)到(0,0,0,0)。我们需要将这些可行状态看作节点。转移状态表示在当前这一步中,有那几样东西(人)在渡河。我们用1表示渡河,用0表示不渡河。在[y1,y2,y3,y4]中,y1表示人,y2表示狼,y3 表示羊,y4表示蔬菜。因为y1(人)每次都要划船.所以y1=1恒成立,例如[1,1,0,0]表示人带着狼从河的一边到另一边。
模拟渡河的过程需要用到异或运算:即0 0=0,1 0=1,0 1=1,1 1=0。对于0 0=0,第一个0表示此物的可行状态,第二个0表示此物的转移状态,这个算式的意思是:在彼岸(0)的物体在这一次运输中没有上船(0),结果0表示这个东西还在彼岸。1 0=1表示此岸(1)的东西没上船(0),结果还在此岸(1)。0 1=1表示彼岸(0)的东西上了船(1),到达了此岸(1)1 1表示此岸(1)的东西上了船(1)。到达了彼岸(0)。
现在图的节点和边都有了。只需要画出这个图了。然后根据这个图找出[1,1,1,1]到[0,0,0,0]的最短路径,就可以了。
代码实现
原创文章,作者过冷水,未经授权,禁止私自转载,转载请联系作者,如果您希望加入Matlab仿真秀官方交流群和资料下载可加群:927550334