过桥问题的通解

来源:互联网 发布:mysql数据库教学视频 编辑:程序博客网 时间:2024/04/18 20:55

问题一,一个典型过桥问题:
小明一家5口人在夜晚过一座桥,小明过桥要1分钟,小明的弟弟过桥要3分钟,小明的爸爸过桥要6分钟,小明的妈妈过桥要8分钟,小明的爷爷过桥要12分钟;这座桥每次只能过2个人,因是夜晚,过桥时必须提着灯,小明有一只灯,点燃后30分钟会熄灭,问怎么样安排,才能保证小明一家在灯熄灭前过桥。
答案:
小明和弟弟过去,小明回来,4分钟
妈妈和爷爷过去,弟弟回来,15分钟
爸爸和小明过去,小明回来,7分钟
小明和弟弟过桥,3分钟
合计4+15+7+3=29分钟

问题二:如果有n个人过桥,一次只能过2个人,过桥必须提着灯,并且只有一只灯(这里不会熄灭);求过桥所要的最少时间是?
现在我们把2(n>2)个人过桥的过程称为“过桥”,1个人提灯回来叫做“送灯”。
为了使整个过程耗时最少,那么就要尽量做到两点。一是送灯是1个人完成。那么这个人一定要最快。
二是过桥是2个人,因为是取两者耗时最多的,那么另一个人被吃掉的时间要尽量大。
如果两点能同时做到,那这样得到的耗时很有可能(未经证明不敢说一定)是最小的。

当n=1、2时,只有一次过桥,耗时为一固定值。

当n=3时,记3人分别为,,。这里耗时<=<=,

最佳方案为            操作             状态           耗时                   过桥          ----                          送灯            ----                          过桥          ----                          总耗时              ++    

当n=4时,记4人耗时分别为,,,。这里耗时<=<=<=,

第一种方案,送灯要最快方案为    操作             状态           耗时                           过桥       ----                                   送灯        ----                                  过桥       ----                                   送灯        ----                                  过桥       ----                                  总耗时             2+++第二种,要吃掉时间最长方案为    操作             状态           耗时                           过桥       ----                                   送灯        ----                                  过桥       ----                                   送灯        ----                                  过桥       ----                                  总耗时             +3+
两种方案耗时差为(2+++)-(+3+)=+-2,所以当+>2时方案二更优,当+=2时方案一、二结果一样,当+<时方案一更优。可以列举其他方案,可以得出方案一二里必有一个为最优方案。当n>4时,记n个人耗时为,,.....,,切依次不严格递增。很自然的可以想到最大耗时的几个人应该只进行一次过河。由n=4时可以知道送灯时间最短和被吃掉时间最长,并不能同时做到。但整个过程中,即使为了每次过桥尽可能吃掉一个最长的时间,也只需要2个不同的人送灯就可以做到,那么应该尽量选择。这里假设过河方案为每次由将最大的送过河,直到n<=4。考虑到使被吃掉时间最长,应该一起过河。那么的过河方案为                     操作                     状态                  耗时          ,过桥        (), --- ,                              送灯           (),,, ---                              ,过桥      (), --- ,,                                   送灯           ,..., --- ,                                  总耗时                +2+ 如果不和一起过河,那么这里只利用送灯,使过河。             操作                     状态                  耗时          ,过桥        (), --- ,                              送灯           (),,, ---                              ,过桥      (), --- ,,                                   送灯           ,..., --- ,                                  总耗时                2++ 在这两种方案下,过河规模减少了2(少了),同样当2<+时,同时过河更优;当2=+时,两种方案耗时相同;当2>+时,不一起过河更优。那么现在过桥方案为,当n>4时,每次最先将耗时最长的两个人送过河,如果2<=+,选择同时过河,如果2>+,选择分别和过河;直到n<=4为止,当n<=4时最优结果已经讨论得出。假设为上述方案的耗时函数,这里可以看出过河代价为-。也即=+-(n>4);那么在这个方案下,过桥问题耗时的解记为:n=1时,=n=2时,n=3时,n=4时,n>4且n为奇数时,n>4且n为偶数时,三、那么是否为过桥问题的最优解呢?接下来就对其进行证明。首先当n>2时(n=1和2是可以单独讨论),每次过桥和送灯后,过桥人数减一,最后一次不需要人回来送灯,所以有过桥次数为n-1次,送灯次数为n-2次;设,耗时为人的过桥和送灯次数,显然有,且。设函数对应送灯的总时间,设函数表示取,最大值,设函数(其实就是在),最优的选择),使得对所有的对取最大值的和最小)对应过桥的总时间。记,现在求最小值。这里先讨论的关系,首先有约束条件为。对于函数,由于,所以在序列中,为了取值尽量小,那么使越是前面的取值要尽可能大,当时,有。对于函数(i<j),假设>,此时记,则在中至少存在着-,显然有,故有-换成-使得。所以一个序列,满足对(i<j)有,使得函数取得最小值。同时对 ,必有,使得,也即当取最小值时,即,函数可以取得最小值。综上,对于满足约束条件时。,当取得最小值时,也是的最小值。在上述条件下,接下来讨论,怎么分配能取到最小值。对于函数同上。对于函数,设所有和每1个  相互匹配求最大值和的所有可能值的集合为,这里有,假设不与匹配求最大值,而与匹配,那么至少有不与匹配求最大值,任取一个,显然有只出现一次)。那么有,也就有当所有的匹配求最大值时,可以在集合中取到更小的值。若与匹配后,还有多余的,则在剩下的和每1个 中,如果,则,由于要两两不同匹配,剩下的和每1个 (正好个)一一匹配。如果,当所有的分别与一一匹配求最大值时,能在集合中取到更小的值。否则必有匹配求最大值, 匹配求最大值,而。所以当所有与匹配后剩下的分别与匹配求最大值时,可以在集合中取到更小的值。对于剩下的(个)(不严格递增),显然是依次相连的两两匹配可以取得最小值。这里可以首先看,由于对且不等,有,所以匹配到一起可以取得最小值,依次下去就可知道依次相连的两两匹配可以取得最小值。由于函数为集合的最小值,通过对取集合的最小值时,匹配方式的讨论,在时,我们可以进一步得出函数的表达形式为:所以当n为奇数时,这里函数第二行项数为,第三行项数为。且随着值的改变项数相应增减(总项数不变)。令,现在记的最小值。当时,有此时有当时,有此时有所以有当n为偶数时,同理。综上当n>2时有当n>2时,由定义可知必为过桥问题耗时的下界,又是过桥问题一个方案的耗时解。所以函数为过桥问题的最小耗时。当n=1,2时,同样也是过桥问题的最小耗时。