数据结构与算法-农夫过河问题

农夫过河问题——最短路径算法

问题描述:农夫用小木筏将狼、羊、菜从起始岸运到目标岸,小木筏每次只能带一种物品,也可以什么都不带,因为食物链的关系,人不在的时候,狼会吃羊,羊会吃菜,请设计一套方案。

第一步:问题抽象

首先我们需要表示人、狼、羊、菜的状态。因为起始岸、目标岸的状态是对称的,表示清楚其中的一个岸就可以了。我们选择起始岸的状态总共得到了十种合理状态,状态之间的迁移用连边表示。是农夫带着一个物品划船或者不带物品划空船而引起。红色的线连起来表示问题的解。

总结一下建模的过程,结点表示合理的状态,边表示状态之间的迁移,可行解就是策略路径,这就完成了问题抽象的过程。

第二步:数据抽象

我们用四位二进制数来表示人、狼、羊、菜在起始岸的位置,角色在起始岸为0,在目标岸则为1。如:0101表示人、羊在起始岸,狼、菜在目标岸。

上面的数据模型可以用相邻矩阵来描述,所有的合理状态结点顺序编号,每行和每列都代表顺序的状态结点,行列交错的位置为1,则表示两个状态之间有一个可以迁移的关联边,例如第一个结点“人狼羊菜”跟第六个结点“狼菜”有一条边关联,如果没有关联就是数值0。求解的过程,其实就是对这个图结构求一个“人狼羊菜”起始状态到“空”终结状态的一个可达路径。

第三步:算法抽象

这是最短路径算法的一个特例,权重都是1。

我们可以采用宽度优先搜索的方法逐步建立状态空间树,从“人狼羊菜”0000的起始状态开始,人可以分别带着狼、羊、菜过河,但只有带羊过河,剩下的狼和菜才会相安无事。我们继续扩展人羊这个分支,一层层扩展下去,减去不安全的分支,最终达到起始岸为空的状态1111。红色的路径就是解路径。

农夫先把羊给搬到对岸,剩下狼菜;接着他划着空船回来,起始岸的状态变成了人狼菜;然后他再带着狼过去,起始岸只剩下菜;把狼留在对岸,把羊带回来,起始岸变成了人羊菜;接着羊留下,把菜给运过去,起始岸只剩下羊;对岸变成了人狼菜,接着他单独划空船过来,起始岸为人羊;把起始岸的羊给运过去,起始岸为空了,农夫最终完成了过河任务。

posted @ 2022-07-29 22:28  小治·君  阅读(1993)  评论(0编辑  收藏  举报