一、问题
在漆黑的夜里,四位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,四个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,四人所需要的时间分别是1、2、5、8分钟;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这四人尽快过桥。 假设这四人分别为A、B、C、D。很明显,开始两人拿着手电筒过桥后,手电筒就在桥的另一边了,此时需要已经过桥的那两人中的一个再把手电筒送回桥这边。送手电筒回来过桥也要化时间,所以要选一个跑得比较快的。一个很自然的想法就是,每次让跑得最快的A陪着另一个过桥,然后A快速地跑回来,再陪下一位过去,最后所有人就都可以过桥了。
让我们来算一下这要多长时间。为了方便起见,我们把旅行者出发的桥的这一边称为“此岸”,而把旅行者想要到达的那边叫“彼岸”。在表达一个过桥方案时,我们用“←”来表示从彼岸到此岸的移动,用“→”表示从此岸到彼岸的移动。前面“A护送大家过河”的方案就可以写成:(右边数字为完成此步骤所需时间)
A B → 2
A ← 1
A C → 5
A ← 1
A D → 8
一共就是2+1+5+1+8=17分钟。 但其实有更快的办法:
A B → 2
A ← 1
C D → 8
B← 2
A B → 2
一共是2+1+8+2+2=15分钟。这个办法的聪明之处在于让两个走得最慢的人同时过桥,这样花去的时间只是走得最慢的那个人花的时间,而走得次慢的那位就不用另花时间过桥了。可以把所有可能的方案都列举一遍,就会发现这是最快的方案了。
现在我们把这个问题推广到N(N≥4)个人过桥的情况:如果有N个旅行者,假设他们有各自所需的过桥时间(正实数)。在只有一只手电筒的情况下,要过上述的一条桥,怎样才能找到最快的过桥方案?
假设最快地把N个旅行者从此岸移动到彼岸需要f分钟时间,那么我们把所有在f分钟时间内把N个旅行者从此岸移动到彼岸的方案称为“最佳方案”。最佳方案很有可能不止一个,我们的目的是要找到一个最佳方案,但是并不需要把所有的最佳方案全都找出来。
如果给定N个(速度不同)的旅行者,根据结论九我们知道有一个最佳方案,在最初的4步里用模式一或模式二把最慢的两个旅行者移动到彼岸,于是问题被约化成N-2个旅行者的形式。问题在于应该选择哪一种模式。继续假设A、B为走得最快和次快的旅行者,过桥所需时间分别为a、b;而Z、Y为走得最慢和次慢的旅行者,过桥所需时间分别为z、y。
在第六节中我们发现使用模式一移动Z和Y到彼岸所需的时间为:
z + a + y + a
使用模式二移动Z和Y到彼岸所需的时间为:
b + a + z + b
所以,
当2b>a+y时,应该使用模式一;
当2b<a+y时,应该使用模式二;
当2b=a+y时,使用模式一或二都可以。
上面的讨论都是在N≥4时进行的,那时最快、次快、最慢和次慢是四个不同的人。所以我们还要稍微讨论一下N=1、2、3的情况。
N=1、2是不用动脑子的,直接通通过桥就是了。
N=3也很简单,用穷举法可以发现由最快的人往返一次把其他两人送过河是最快的方法。
于是我们得到了最终结论:最佳方案构造法:以下是构造N个人(N≥1)过桥最佳方案的方法:
1) 如果N=1、2,所有人直接过桥。
2) 如果N=3,由最快的人往返一次把其他两人送过河。
3) 如果N≥4,设A、B为走得最快和次快的旅行者,过桥所需时间分别为a、b;而Z、Y为走得最慢和次慢的旅行者,过桥所需时间分别为z、y。那么
当2b>a+y时,使用模式一将Z和Y移动过桥;
A Z → z
A ← a
A Y → y
A ← a
当2b<a+y时,使用模式二将Z和Y移动过桥;
A B → b
A ← a
Y Z → z
B ← b
当2b=a+y时,使用模式一将Z和Y移动过桥。
这样就使问题转变为N-2个旅行者的情形,从而递归解决之。
最后当然我们要举一个具体的例子:七个旅行者,所需过桥时间分别是1、4、5、5、5、8、9分钟。
我们假设他们顺次为A、B、C、D、E、F、G,我们注意到C、D、E的速度一样,用第二节的方法太正规也太麻烦,我们可以人为规定C速度稍稍大于D,D速度又稍稍大于E。
采用结论十的方法,最快和次快的是A、B,时间为1和4;最慢和次慢的是G和F,时间为9和8。现在2*4<1+9,所以用模式二:
第1步: A B → 4
第2步: A ← 1
第3步: F G → 9
第4步: B ← 4
现在剩下A、B、C、D、E在此岸,最快和次快的是A、B,时间为1和4;最慢和次慢的是E和D,时间为5和5。现在2*4>1+5,所以用模式一:
第5步: A E → 5
第6步: A ← 1
第7步: A D → 5
第8步: A ← 1
现在剩下A、B、C在此岸,用N=3的办法结束:
第9步: A C → 5
第10步: A ← 1
第11步: A B → 4
总的时间为
4+1+9+4+5+1+5+1+5+1+4 = 40分钟
虽然我一个其他的方案都没列举,我知道这个40分钟的方案必定是最佳的。
分享到:
相关推荐
题目大意:只有一艘船,能乘2人,船的运行速度为2人中较慢一人的速度,过去后还需一个人把船划回来,问把n个人运到对岸,最少需要多久。
多人多鬼过河问题是一个经典的逻辑与算法问题,它源于中国古代的智力谜题,也被称为“鸡兔同笼”问题的变种。在这个问题中,我们需要考虑如何在有限的资源和约束条件下,使得所有的人物(人和鬼)都能安全地从河的一...
### 数学建模之夫妻过河问题解析及MATLAB实现 #### 一、问题背景与定义 **夫妻过河问题**是一种经典的组合优化问题,在该问题中,一定数量的夫妻需要借助一条小船过河。小船有载重限制,并且每次只能由一个人划船...
商人过河问题的MATLAB实现,MATLAB源代码。
农夫过河问题是一个典型的逻辑难题,它不仅要求解题者运用逻辑思维,还需要他们将问题抽象化,设计出有效的算法来求解。该问题的设定非常简洁,却蕴含了丰富的约束条件,通过对这些条件的分析,我们能够找到解决问题...
商人过河问题是数学建模中的一个经典问题,程序利用链表存储渡河状态,使用穷举的算法实现。该算法会找出N个商人/随从渡河的一个可行方案,但并不保证是最佳方案。写完这个程序后让我想到的居然是图的深度优先搜索,...
商人过河问题数学建模 商人过河问题是一种经典的数学问题,旨在解决商人和随从如何安全渡河的问题。本文将使用数学建模来解决这个问题,并分析问题的各个方面。 一、问题描述 问题一:4个商人带着4个随从过河,...
《猎人过河问题的C++实现及其背后的算法思想》 猎人过河问题是一个经典的逻辑谜题,它涉及到狼、羊和白菜三者之间的相互关系。在这个问题中,猎人需要将这三样物品安全地运送到河的对岸,而每次只能携带一样物品。...
为了找到最优解,作者首先对问题进行了明确的界定,目标是确定小船的最优路径和最小渡河时间。在假设船的行驶路线和河水流动状态的基础上,问题被转化为一个经典的微分方程模型。通过引入船速、水速、合速度、河宽等...
《人工智能与野人传教士过河问题》 在人工智能领域,解决复杂问题的一个关键方法是运用算法。本文将深入探讨一个经典的逻辑问题——“野人传教士过河问题”,并结合A算法和启发函数来阐述如何通过计算和搜索策略来...
贼 警察 爸爸 妈妈 两个儿子 两个女儿 共8人要渡江 已知:警察不在 贼会伤害所有人;爸爸不在 妈妈会伤害儿子;妈 妈不在 爸爸会伤害女儿;船一次只能装两个人 且孩子... 这种过河问题较商人过河更为复杂 文件中会给出解法
经典的农夫过河问题。 用1代表狼,2代表羊,3代表白菜。则在河的某一岸边,物体的分布有8种情况: 当两物体在一起并且它们的代码之和为3或5时,将导致相克的情况出现。 设计c语言算法实现过河,并将结果打印
Java简单实现农夫过河问题示例 农夫过河问题是计算机科学中的一种经典问题,旨在解决如何将农夫、鱼、狗、猫等物品从一岸运送到另一岸的问题。解决这个问题需要使用算法和数据结构来实现。下面将从Java简单实现农夫...
商人过河问题的Matlab程序,供学习数学建模或者对趣味性数学感兴趣的人参考。
"基于C++的农夫过河问题算法设计与实现方法" 本文主要介绍了基于C++的农夫过河问题算法设计与实现方法,简单描述了农夫过河问题,并结合实例形式详细分析了基于C++实现农夫过河问题的相关算法实现步骤与操作技巧。 ...
农夫过河问题的算法与实现 农夫过河问题是指农夫带一只狼、一只羊和一棵白菜在河南岸,需要安全运到北岸。这类问题的实质是系统的状态问题,要寻求的是从初始状态经一系列的安全状态到达系统的终止状态的一条路径。...
《3个传教士与3个野人过河问题》是一个经典的逻辑谜题,它涉及到策略性思考和问题解决能力,通常在计算机科学领域中,尤其是算法设计与分析时会被用作示例。该问题源自一种古老的智力挑战,旨在通过递归和回溯法来...
《农夫过河问题:深度优先遍历图的解决方案》 农夫过河问题是一个经典的逻辑谜题,它涉及到在有限的资源和条件约束下如何有效地解决问题。在这个问题中,农夫需要将自己、一只狼、一只羊和一捆白菜全部安全地从河的...
总结,"数据结构农夫过河问题"是一个典型的用数据结构和算法解决逻辑问题的例子,它展示了如何利用广度优先搜索策略来寻找最优解。通过编码实现,我们可以找到安全地将所有物品运送到对岸的步骤,同时也学习了如何...
野人传教士过河问题野人传教士过河问题野人传教士过河问题野人传教士过河问题野人传教士过河问题野人传教士过河问题野人传教士过河问题野人传教士过河问题野人传教士过河问题野人传教士过河问题野人传教士过河问题...