图论解决渡河问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图论解决渡河问题
农夫,狼,羊,草渡河问题,是一道很经典的问题。讲述的是农夫,狼,羊,草渡河,但只有一艘船,而且每次渡河农夫都只能带一个上船。同时,在农夫不在的情况下,狼与羊不能在一起,羊与草不能在一起。求要用怎样方式渡河,才能保证农夫不受到任何损失。
一、将实际问题转换成数学问题
每次渡河,必然是由一个渡河的状态转变成为另一个状态,在每个状态之间都有渡河的可能。由此,可以作出一幅有向图。并且,会有一个起点与终点,由起点到终点之间的连线,就能找出一个合适的渡河方法。
二、数学问题的实现
1、列出所有岸边状态:
由于只要知道任意的一岸的情况,便能推导出当前的渡河状态,所以只列出起始岸边的情况。
图0
因为条件的限制,所以起始岸边只存在这十种情况。其中V0为起始状态,V9为渡河结束。其中,当人的状态为1时,表示的在起始岸,0则为对岸。
2、列出所有渡河状态:
图1
3、生成有向图的邻接矩阵:
从图0和图1,可以生成一个渡河的有向图。
已知从起始岸到对岸必定是2个成员渡河,而起始岸到对岸则可以单独一人,或者两个成员。
生成的有向图的邻接矩阵如下:
V0 V1 V2 V3 V4 V5 V6 V7 V8 V9
V0 0 0 0 0 0 1 0 0 0 0
V1 0 0 0 0 0 0 1 1 0 0
V2 0 0 0 0 0 1 1 0 1 0
V3 0 0 0 0 0 0 0 1 1 0
V4 0 0 0 0 0 0 0 1 0 1
V5 1 0 1 0 0 0 0 0 0 0
V6 0 1 1 0 0 0 0 0 0 0
V7 0 1 0 1 1 0 0 0 0 0
V8 0 0 1 1 0 0 0 0 0 0
V9 0 0 0 0 1 0 0 0 0 0
图3
4、从邻接矩阵中找出渡河路径:
先将通过的点列入路径的集合里,已知起始位置为V0,则通过路径的集合为{V0},下一状态则为V5,集合变为{V0,V5}。再从V5开始寻找下一状态,当遇到路径集合里有的点后,跳过寻找下一个点,如果不存在下一点路径则将此元素去除路径集合,重新在上一状态寻找。
直到找到V9为止。
路径寻找状态如下表
路径集合是否存在下一点路径
V0 1
V0,V5 1
V0,V5,V2 1
V0,V5,V2,V6 1
V0,V5,V2,V6,V1 1
V0,V5,V2,V6,V1,V7 1
V0,V5,V2,V6,V1,V7,V3 1
V0,V5,V2,V6,V1,V7,V3,V8 0
V0,V5,V2,V8,V3,V7,V3 0
V0,V5,V2,V8,V3,V7,V4 1
V0,V5,V2,V8,V3,V7,V4,V9
图 4
由此,渡河路径为:V0 --> V5 --> V2 --> V6 --> V1 --> V7 --> V4 -->V9.
根据渡河路径,则可以求出每次渡河的情况。
1、人,羊渡河
2、人回来
3、人,草渡河
4、人,羊回来
5、人,狼渡河
6、人回来
7、人,羊渡河
总结:利用图论解决渡河问题主要是依靠将渡河状态归为有向图,并通过有向图的邻接矩阵而求出所需的渡河方式。