1、问题编程
在漆黑的夜里,四位旅行者来到了一座狭窄并且没有护栏的桥边。若是不借助手电筒的话,你们是不管如何也不敢过桥去的。不幸的是,四我的一共只带了一只手电筒,而桥窄得只够让两我的同时过。若是各自单独过桥的话,四人所须要的时间分别是一、二、五、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个旅行者今后岸移动到彼岸的方案称为“最佳方案”。最佳方案颇有可能不止一个,咱们的目的是要找到一个最佳方案,可是并不须要把全部的最佳方案全都找出来。函数
2、一个合理的假设spa
为了讨论的方便起见,这一节咱们要说明的是,事实上咱们能够假设每一个旅行者的速度都是不同的。这样当咱们说一些人中“最快的那个”,“次慢的那一个”时,都不会有歧义了,由于每一个人的速度都是独一无二的。这个假设在讨论中并不是必要,只是为了在证实的叙述过程当中避免不断地啰嗦相似“咱们让两人中最快的那个过桥,若是两人同样快,那就随便选一人”、“咱们选在彼岸最快的那我的回来,若是上一步刚今后岸到彼岸的人中,其中有一个是如今彼岸走得最快的之一,咱们就特别选择让他回来”之类的话。
为何咱们能够假设每一个旅行者的速度都是不同的?原理就在于,咱们能够把原来过桥时间相同的旅行者的过桥时间分别加上一个不一样的可是很是很是小的量,这样就能保证旅行者的速度是不同的了。可是由于加上去的量都很是小,因此对最终总的过桥时间的影响也很是小。因此这样改动事后获得的最佳方案在原来的条件下实施的话,也该是原来条件下的最佳方案。
若是你对上面的说明满意了,就彻底能够跳过这一节直接看第三节。这一节后面啰哩叭嗦的都是为了向一些对严格性要求比较高的朋友解释上面所说的方法的确可行。
首先对于任何一组N个旅行者,假定他们过桥所需的时间分别为a1、a2、……、aN,它们都是大于零的实数。假设这个序列已经从小到大排列了(固然不排除其中有数相等)。每次都由第一个旅行者陪同一我的过桥,而后第一个旅行者回来,这样一个方案所须要的时间是:
S = (N-2)*a1+a2+……+an
(第一个旅行者要返回N-2次)。因此最佳方案所须要的时间必定不会比S大。
咱们把一个过桥方案中让一个或者两我的拿着手电筒从桥的一边走到另外一边的一次移动叫作这个方案中的一次移动或者“一步”,就是前面解四我的的题中使用“→”或“←”来表示的一个步骤。由于一次移动所须要的最少的时间是a1分钟,因此最佳方案中所需的移动步数必定不会多于K=[S/a1]步,这里"[]"是取整运算。
让咱们考虑一下全部在K步之内完成的方案。上面的例子代表这样的方案至少有一个,并且这样的方案显然只有有限多个,假设一共有M个。咱们又设这些方案执行时要花的时间是
t1、t2、……、tM
咱们还能够假设上面这些时间已经从小到大排列了,t1就是最佳方案所须要的时间。
如今是关键的步骤。咱们要选取一个很小的正实数ε>0。它有多小呢?它必须知足下面的条件:
1) 对于任何两个过桥时间不一样的旅行者(假设他们的过桥时间是a和b分钟),必须知足ε<|a-b|/N。换句话说,Nε要小于不一样的旅行者过桥时间之间的差异。
2) 对于任何两个所需的完成时间不一样的K步之内的方案(假设它们的所需时间是t和s分钟),必须知足ε<|t-s|/K。换句话说,Kε要小于不一样的方案完成时间之间的差异。
由于旅行者的数目和方案的数目都是有限的,因此咱们必然能够选取这样一个ε。至于这两个条件有什么用,咱们立刻就能够看到。
假设若干个旅行者过桥的时间都是同样的a分钟,咱们就把题目改一下,使得他们的过桥时间分别为
a、a+ε/N、a+2ε/N、a+3ε/N……
若是有其余的旅行者过桥时间相互同样,也按照一样方式修改题目。这时在修改后的题目中,若是原来两个旅行者所需的过桥时间相同,那么如今就变得不一样,差一个很是小的量(不会超过ε);若是原来两个旅行者所需的过桥时间不一样,那么根据上面的条件1),如今仍是不一样,并且原来谁比较快,如今仍旧是他比较快。
咱们看看这个修改后的题目的最佳方案和原来的题目的最佳方案有什么联系。
假设咱们已经有一个关于修改后的题目的最佳方案,那么它所须要的时间一定是这个模样的:
a + bε
咱们知道bε部分是修改时把旅行者过桥时间“微调”了之后形成的,并且每走一步这部分的改变不会超过ε,因此咱们有0<b<K=[S/a1]。
若是咱们把这个最佳移动方案照搬到原来的题目中去,所须要的时间就是a分钟。这个方案应该一样是原来题目中的最佳方案。不然的话,假设咱们有另外一个方案,所需时间为a',并且a'<a。根据上面取ε时候的条件2),咱们有
a' < a + Kε
把这个耗时a'的方案搬到改动过的题目里去的话,所需的时间就会是
a' + b'ε
其中0<b'<K。因此根据a'<a+Kε
a' + b'ε < a + bε
这就和a+bε是改动后题目的最佳方案所需的时间矛盾了。
因此只要找到一个修改过的题目中的最佳方案,咱们就获得了原来题目中的一个最佳方案,因而咱们只要考虑全部旅行者的速度都不一样的题目就能够了。.net
3、一个“很显然”的结论设计
编个计算机程序,把全部步数少于上一节中所计算的K=[S/a1]的可能的过桥方案都列举一遍,而后找出最快的,固然是一种方法,这理论上也是可行的,由于少于K步的方案只有有限多个,计算机程序一定可以将它们所有列举出来。只是当人数N增大时,过桥方案数会增长得很快。事实上,若是咱们只考虑“每次过去两我的,而后这两我的中其中一我的回来”这类方案的数目的数量就已经远远超过N!个了,想像一下若是N=1000的话所须要的计算量!何况还有更多数量的其余类型方案。特别是,咱们是在作智力题,不是在学编程。固然你还能够说,若是人多的话,所须要的时间超过了12小时,那时天已经亮了,再也不须要手电筒,你们能够直接过桥——唉!咱们是在作智力题,不是在作抬杠式的脑筋急转弯——咱们能够假设是在有漫长极夜的极地嘛,要否则,这桥是在一个黑暗山洞里,就象电影《指环王》中的那样……
可是若是不用列举法的话,咱们有一个重要的任务要作,就是不只要说明如何找到一个咱们自觉得最快的方案,并且还要证实这样的方法的确给出了一个最佳方案。
在咱们的直觉当中,最快的方案必然有这样一个特征:每次过桥去彼岸的必定是两我的,而后必定只有一我的把手电筒送回此岸(固然要除去最后一次过桥的状况,那时就不需有人把手电筒送回来了)。可是为何必定是这样的呢?为何不可能有一个意想不到的巧妙方案,在那里有某一步竟然须要一我的单独过到彼岸去,或者须要有两我的把手电筒送回此岸来?这是个看起来很显而易见可是咱们不能支吾不回答的问题。
在讨论中咱们常常须要说明,在某一时刻,桥的两边分别有哪些人,手电筒又在哪一边。这样的说明称为一个“局面”。固然,一个局面必须是合理的。好比说,不可以全部人都在桥的一边,而手电筒却在桥的另外一边;一我的必须处在桥的某一边,并且只能处在桥的某一边。
好比说,在四个旅行者的问题里,若是某一个时刻A、B和C在此岸,而D在彼岸,手电筒也在彼岸,这就给出了一个局面(这个局面看起来有点奇怪,大概是D拿着手电筒一我的跑过桥去了,接下去除了他再拿着手电筒回来别无它法)。全部人和手电筒都在此岸,就是一个特殊的局面,叫做初始局面;而全部人和手电筒都在彼岸,也是一个特殊的局面,叫完结局面;全部其余的局面咱们称为中间局面。
想像一下如今有两种局面。在两种局面中,手电筒都在桥的同一边(都在此岸或都在彼岸);并且在第一种局面里全部在彼岸的旅行者,在第二种局面里也都在彼岸,并且有这样的旅行者,在第一种局面中他在此岸,而第二种局面中他在彼岸。那么咱们就说第二种局面“优于”第一种局面。
好比说,在四个旅行者的问题里,第一种局面是A、B和C在此岸,而D在彼岸,手电筒也在彼岸;第二种局面是A和B在此岸,C和D在彼岸,手电筒也在彼岸。那么第二种局面就优于第一种局面。很显然,除了初始局面之外,全部手电筒在此岸的局面都优于初始局面;除了完结局面自己外,完结局面要优于全部手电筒在彼岸的局面。可是要注意的是,并非任意给两个局面都能比较哪一个优于哪一个,好比说初始局面和完结局面,谁都不优于谁。
若是如今有两个局面,第二种局面要优于第一种局面。假设如今我已经有了一个方案,从第一种局面开始,经过符合题目要求的方法来移动旅行者(最多只能同时移动两个旅行者,手电筒必须和他们一块儿移动),在t分钟内可以使全部旅行者到达彼岸(也就是说转变成完结局面,或者说“解决”了这种局面),那么咱们能够保证咱们一样也有了一个方案,从第二种局面开始,在很少于t分钟内使它转变成完结局面。
为何呢?
假设第一种局面的方案中的第一步是要把某个(或某两个)旅行者今后岸移动到彼岸(这时手电筒开始必定在此岸)。
1) 若是被移动的这个(或这两个)旅行者,在第二种局面里也在此岸,那么咱们一样把他们今后岸移动到彼岸。这时两个局面化了一样多的时间转化成另两个局面,并且仍旧是第二种局面优于第一种局面。(严格说来应该是“从第二种局面演化来的局面要优于从第一种局面演化来的局面”,不过这样也太拗口了,因此在下面我都用前面那种虽然不严格可是比较简明的方法来叙述。)
2) 若是被移动的有两个旅行者,可是只有一个在第二种局面里是在此岸,那么咱们把他今后岸移动到彼岸。若是这个旅行者是两个中跑得比较快的,那么这一步所化时间会比第一种局面要少;若是他是跑得比较慢的那个,那么这一步所化时间就和第一种局面同样。并且通过这一步转化后,第二种局面或者和第一种局面同样,或者仍旧优于第一种局面。
3) 若是被移动旅行者都不在此岸,那么状况要稍微复杂点。若是在第一种局面中通过这步移动后就变为完结局面,那么这意味着第二种局面中全部人早已到达彼岸,而这是不可能的,此时第二种局面中手电筒不可能在此岸。因此在第一种局面中通过这步移动后,还会有接下去的一步,把某个(或某两个)旅行者从彼岸移动到此岸。咱们很容易看到,第二种局面无需任何耗费时间的移动,要优于第一种局面通过两次移动后演变获得的结果!由于通过两步移动后,第一种局面里在彼岸多出来的旅行者,在第二种局面里早已都在彼岸。
假设第一种局面的方案中的第一步是要把某个(或某两个)旅行者从彼岸移动到此岸(这时手电筒开始必定在彼岸),那么这就很简单,在第二种局面里这个(或这两个)旅行者必定也在彼岸,因此咱们用相同的一步移动,花费同样的时间,把这个(或这两个)旅行者移动到此岸。这样获得的结果仍是第二种局面要优于第一种局面。
因而总而言之,不管第一种局面中采起什么样的移动,咱们总能够采起花费一样多的时间(甚至更少或者根本不花费时间)的移动,使得第二种局面或者变为和第一种局面相同,或者仍旧优于第一种局面。因而当第一种局面演变为完结局面时,第二种局面也必定演变为完结局面了,而花费的时间不会多于第一种局面所需的时间。
因而咱们获得了很显然的结论:
结论一:若是有两种局面,第二种局面优于第一种局面,那么咱们总能够用少于解决第一种局面的时间来解决第二种局面。
这说明“优于”这个词的使用是合理的。对象
4、更多的结论blog
经过结论一咱们马上获得:
结论二:必定有这样一种最佳方案,在这个方案里,全部从彼岸到此岸的移动只需一我的。
若是最佳方案中有一步中须要两我的从彼岸移动到此岸,那么咱们能够把这一步改成只移动比较快的那我的。在这一步后,咱们花费了最多和原来相同的时间,获得的局面却优于按原先方案执行完这一步后的局面,因此剩下的解决步骤不会比原方案花费更多的时间,因此一定是个最佳方案。
如今咱们知道,咱们能够要求在最佳方案中,每次只回来一我的。在下面咱们要得出另外一个结论:
结论三:必定有这样一种符合结论二的最佳方案,在这个方案里,全部从彼岸到此岸的移动中,回来的这我的必定是当时在彼岸全部人中速度最快的。
假设在全部知足结论二的最佳方案中,都没有符合结论三的方案,也就是说,任何一个最佳方案中,总有某一步从彼岸到此岸的移动中,回来的那我的不是当时在彼岸全部人中速度最快的。那么咱们在这些最佳方案中选取一个这样的“坏”步骤最晚出现的方案。假设这个步骤首先出如今第n步。
咱们特别假设在这第n步中回来的这我的是B,他的过桥所需的时间为b分钟,而当时在彼岸全部人中速度最快的是A,他的过桥所需的时间为a分钟。如今咱们开始把第n步“让B回来”改成“让A回来”。
原来的方案 修改后的方案
…… ……
第n步: B ← A ←
如今两种局面的惟一区别在于,前一种是A在彼岸B在此岸,然后一种是B在彼岸A在此岸。可是前一种局面要比后一种局面多耗时b-a分钟。
在第n步后面接下去的移动步骤中,只要不牵涉A或B,那么能够在原来方案中进行的移动仍旧能够在改变了的方案中进行。而第n步后第一次牵涉到A或B的在原方案中的行动(咱们假设它是第n+i步)只能是:
1) 把A从彼岸移动到此岸。此时咱们在改造方案中的移动就是:把B从彼岸移动到此岸。这时局面就变成和原来的彻底同样了,上一次因为用A来换B节省的b-a分钟也在这步中耗费掉了。接下去咱们使用原方案完成其余移动。因此改造后的方案一样是个最佳方案:
原来的方案 修改后的方案
…… ……
第n步: B ← A ←
…… ……
第n+i步: A ← B ←
…… ……
省略号部分表示此部分两个方案相同。
2) 把B今后岸移动到彼岸(可能还有另外一个过桥时间为c分钟的C和他一块儿移动)。这就比较简单,第n+i步咱们在改造后的方案中仍是用A来代替B,而后局面就恢复到原来的状况,接下去咱们使用原方案完成其余移动:
原来的方案 修改后的方案
…… ……
第n步: B ← A ←
…… ……
第n+i步: B (C) → A (C) →
…… ……
这里括号内的C表示有可能另有旅行者C同行,省略号部分表示此部分两个方案相同。但咱们发现这个移动所花费的时间必定要比原来的少:第n步修改后的方案就已经要比原方案耗时少,而第n+i步中,若是c比a和b都大的话,修改后的方案和原方案耗时相同;不然的话修改后的方案照样比原方案耗时少。因此咱们获得了一个比“最佳方案”还要“佳”的方案,因此这种状况实际上是不会发生的。
如今咱们获得了一个修改过的方案,它仍旧是个最佳方案。虽然咱们并不能保证它是知足结论三的方案,可是这并非关键——关键在于它一直到第n步仍是知足结论三的要求,这就和咱们开始的假设,即被选取的这个方案是“这样的步骤最晚出现的方案”矛盾。因此咱们的原先“假设在全部知足结论二的最佳方案中,都没有符合结论三的方案”是错误的。这样咱们就获得告终论三。
在这里我要插一句题外话。上面的推理方法在数学中被称为“变分方法”,这是最重要的数学方法中的一种,咱们能够在全部的数学分支中看见它的应用。它通常被用来证实存在一个具备某种特色的对象。首先咱们选取一个使得某个特征(或者函数)达到最大或者最小的对象,而后用反证法证实这样的对象就是咱们要找的对象:咱们假设若是它不是咱们要找的对象,那么咱们老是还能把这个对象修改,使得这个特征(或者函数)更大或更小,这就和原来最大或最小的假设矛盾。
下面咱们会不断地用到这种方法来得出许多结论:必定存在某一个最佳解法,符合如此这般的性质。一旦咱们知道有一个最佳解法知足一些很是具体的性质之后,这个解法也就很容易被具体写出来了。
根据结论三咱们马上推出
结论四:必定有这样一种符合结论二—三的最佳方案,在这个方案里,每当出现手电筒在此岸的局面时,速度最快的那我的老是在此岸。
若是是初始局面,全部人都在此岸,固然没什么好说的。若是是手电筒在此岸的中间局面,那么根据结论三,前一步有一个彼岸最快的人刚过来。若是这我的不是全部人中最快的,那么说明最快的原来就已经在此岸了;若是这我的是全部人中最快的,那么他刚刚过来,如今也已经在此岸了。因此结论四成立。
若是在符合结论四的最佳方案方案中,有一步是只有一我的B今后岸走到彼岸,咱们会有什么推论?若是在此岸另有一个A,他的速度比B快,那么A彻底能够跟着B一块儿到彼岸去,这样就在耗费相同时间的状况下,获得了一个优于原先局面的局面,根据结论一,这也是最佳方案;若是B是此岸最快的,根据结论四,他也是全部人中最快的,过到彼岸后,根据结论三,他立刻一我的又要回来,这就使这两步移动毫无心义,徒费时间。因此咱们获得:
结论五:必定有这样一种符合结论二—四的最佳方案,在这个方案里,全部今后岸到彼岸的移动都需两我的。
下面咱们要给出一个不那么显然的结论。
结论六:必定有这样一种符合结论二—五的最佳方案,在这个方案里,每次今后岸到彼岸移动两人,要么这两人里有一个是全部人中最快的那个,要么这两人到达彼岸后都不再回来。
上面这个结论的意思是,在这个方案里不会出现这样的状况:有一步两我的跑到彼岸去,但两人都不是跑得最快的,可是后来其中一个(或者两个都)又跑回此岸来。
仍旧使用变分法。假设在全部知足结论二—五的最佳方案中,都没有符合结论六的方案,也就是说,其中的每一个最佳方案,总都有某一步今后岸到彼岸的移动中,被移动的那两我的没有一个是最快的,并且其中一个在后面的步骤中又回到此岸来。那么咱们在这些最佳方案中选取一个这样的步骤最晚出现的方案。假设这个步骤首先出如今第n步。
咱们假设在这第n步中过去的两我的是Y和Z,他们过桥所需时间分别是y和z分钟,而在后面的第n+i步中,Y又回到此岸来了。设A是走得最快的那我的,过桥所需时间为a分钟。由结论四知道,他当时必定同Y和Z一块儿在此岸。
如今咱们开始修改这个方案,把第n步“让Y和Z过去”改成“让A和Z过去”:
原来的方案 修改后的方案
…… ……
第n步: Y Z → A Z →
若是y<z,那么改过的步骤消耗的时间和原来的同样;若是z<y,那么修改后的步骤消耗的时间还会更少。如今两种局面的惟一区别在于,前一种是A在此岸Y在彼岸,然后一种刚好相反。并且咱们看到,通过这样修改的第n步如今符合“两人里有一个是全部人中最快的那个”这个结论六中的要求。剩下的工做就是要理顺后面的步骤,使得修改过的方案仍旧是一个最佳方案,那时咱们就用变分法推出了矛盾,从而证实结论六。
下面咱们的技巧和前面所用过的略微不一样,咱们要修改的不是一个移动而是一串移动。
假设原来的第n+1步是“让Y1回来”,其中Y1是在彼岸的某人,他是在彼岸最快的。咱们把这第n+1步改成“让A回来”:
原来的方案 修改后的方案
…… ……
第n步: Y Z → A Z →
第n+1步: Y1 ← A ←
这样修改后的步骤消耗的时间少于原先方案,由于Y1一定跑得比A慢。若是Y1刚好就是Y本身(也就是说i=1),那么从这步之后修改先后两种状况的局面又恢复成同样了。若是i≠1,也就是说Y1和Y不一样,那么执行第n+1步后,原先的局面和修改事后的局面的惟一差异在于前一种是Y1在此岸Y在彼岸,然后一种刚好相反。咱们注意到,根据结论三,Y1必定走得比Y快,更通常地,任何一个在n+1步到n+i步之间从彼岸回此岸来的人都比Y要走得快。
若是原先方案中从n+2步一直到n+i步里的移动都不牵涉到Y1,那么咱们只要把第n+i步的“Y回来”改为“Y1回来”,就理顺了全部的步骤:
原来的方案 修改后的方案
…… ……
第n步: Y Z → A Z →
第n+1步: Y1 ← A ←
…… ……
第n+i步: Y ← Y1 ←
修改后的步骤消耗的时间少于原先所需的,由于Y1走得比Y快。
若是不幸地在原先方案中的第n+j步(j<i)Y1又要和某我的M一块儿到彼岸去,而第n+j+1步是“Y2回此岸来”,那么咱们把第n+j步改成“A和M一块儿到彼岸”去,而把第n+k+1步改成“A回此岸来”:
原来的方案 修改后的方案
…… ……
第n步: Y Z → A Z →
第n+1步: Y1 ← A ←
…… ……
第n+j步: Y1 M → A M →
第n+j+1步: Y2 ← A ←
这样修改后的步骤消耗的时间也要比原先的少,由于A是最快的。若是Y2刚好就是Y本身(也就是说m=k+1),那么从这步之后修改先后两种状况的局面就恢复成同样了。若是m≠k+1,也就是说Y2和Y不一样,那么执行第n+k+1步后,原先的局面和修改事后的局面的惟一差异在于前一种是Y2在此岸Y在彼岸,然后一种刚好相反。
这样咱们有一个序列Y1,Y2,……,依次修改下去,每次修改后的步骤消耗的时间不会多于原先所需的,通过最多[m/2]次修改,总会有一刻某个Yt和Y相同,结束咱们的这串修改。
这样咱们就获得了修改后的最佳方案,它的第n步也是符合结论六的要求的。因此和咱们的反证假设矛盾,和结论三的证实方式相同,咱们证实告终论六。
在本节的结尾咱们给出一个不那么显然的结论三的增强版。
结论七:必定有这样一种符合结论二—六的最佳方案,在这个方案里,全部从彼岸到此岸的移动中,回来的这我的必定是当时在彼岸全部人中速度最快的,并且他只能是全部人中最快的或者次快的。
换句话说,全部返回此岸的任务均可以只由跑得最快和跑得次快的人来担当,全部其余人一旦到达彼岸,就留在那里,不再回来。
咱们仍是使用变分法。假设结论七是错的,全部(知足结论二—六的)最佳方案中,都必须至少有一次须要一个跑得不是最快或次快的人回来,那么咱们选取一个这样的事情发生得最晚的最佳方案。假设在第n步,有一个C从彼岸跑回了此岸,但他不是跑得最快或次快的人。
咱们假设A是跑得最快的人,他所需过桥时间为a分钟,B是跑得次快的人,他须要b分钟,而C须要c分钟。咱们有a<b<c。由于在第n步C从彼岸跑回了此岸,因此在那以前必定有一步,C今后岸到达彼岸,并且根据结论六,那一步必定是A和C同行,咱们假设此步为第n-i步。又根据结论三,接下去一步是A回到此岸。在第n-i步和第n步间,没有有关于C的移动。考虑第n-1步:根据结论五,这一步一定有两人今后岸移动到彼岸;这两人中没有A或B,不然根据结论三,第n步回此岸来的就该是比较快的A或B;另外这两人中也没有C,由于在在第n-i步和第n步间,C不移动。因此咱们根据上面的分析能够写出方案中的有关步骤: 原来的方案
……
第n-i步: A C →
第n-i+1步: A ←
……
第n-1步: Y Z → (Y和Z未知,但非A、B或C)
第n步: C ←
……
由于第n-i步和第n步之间没有关于C的移动,而第n-1步时A和B必定在此岸(不然根据结论三,第n步回此岸来的就该是比较快的A或B),因此咱们能够把第n-i步和第n-i+1步移到第n-1步前,方案仍旧能够合理进行(换句话说,第n-i和第n-i+1步的惟一做用就是把C运送到了彼岸,可是直到第n步以前这个C并不起什么做用,因此咱们能够把此次运送搬到第n-1步前而不影响其余步骤):
修改后的方案
…… (原来第n-i步前的步骤)
…… (原来处于第n-i+1和第n步间的步骤)
第n-3步: A C → (原来第n-i步)
第n-2步: A ← (原来第n-i+1步)
第n-1步: Y Z → (Y和Z未知,但非A、B或C)
第n步: C ←
……
如今有问题的步骤都聚在了一块儿,因此咱们能够用B来代替C,进一步修改方案:
进一步修改后的方案
…… (原来第n-i步前的步骤)
…… (原来处于第n-i+1和第n步间的步骤)
第n-3步: A B →
第n-2步: A ←
第n-1步: Y Z → (Y和Z未知,但非A、B或C)
第n步: B ← ……
这个修改是可行的,由于根据上面的分析,进行第n-3步前B在此岸。这样获得的方案不但直到第n步还符合结论七,并且所须要的时间也比原方案短,明显违反了假设,因此咱们获得矛盾,也就是说,知足结论七的最佳方案是存在的。因而结论七成立。递归
5、过桥的模式数学
结论七是很是强大的,事实上它描述了除了最快和次快之外全部其余旅行者的过桥模式。任取一个知足结论七的最佳方案。
假设A为最快,B为次快,而Z是任意一个其余旅行者。根据结论七,他只过一次桥,而后就留在彼岸再不回来。考虑一下和他同行的另外一位旅行者,这里有两种可能性:
1) 另外一位旅行者还会回到此岸来。
那么根据结论六,另外一位必定是A。因此Z过河的模式是这样的;
……
A Z →
A ←
……
也就是“由A护送到对岸,A返回”,称做“模式一”。
2) 另外一位旅行者也不回来了。假设这两位旅行者过桥是在第n步。
若是方案一共就是到第n步结束,那么根据结论四,在未执行第n步时,A应该在此岸,而在执行完第n步时,全部人都到了彼岸,因此那另外一个旅行者就是A。因此若是出现这种状况,Z过桥的模式实质上和1)中相同,“由A护送到对岸”,只不过A不用再返回而已。
若是方案中还有第n+1步,咱们考虑一下第n+1步是什么。根据结论七,这步应该是A或者B回到此岸。可是根据结论四,咱们知道在第n步时A在此岸,因此第n+1不步多是A回来,因此只能是B回来。可是B在彼岸说明第n步前已经有一步使得B过了桥。根据结论六和结论三,那一步必定是A和B同行,而后A回来。咱们就能够写出Z的过桥模式(设另外一位旅行者是Y,他必不一样于A和B):
……
A B →
A ←
……
第n步: Y Z →
第n+1步: B ←
……
同结论七中的证实同样,咱们能够修改这个方案为
……
……
第n-2步: A B →
第n-1步: A ←
第n步: Y Z →
第n+1步: B ←
……
看了这个方案片段你们也许会有似曾相识的感受。事实上,这就是本文开始四位旅行者问题中需时5分钟和8分钟的旅行者过桥的模式。这个模式是“由A和B护送到对岸,A和B返回”,称做“模式二”。
结论八:必定有这样一种符合结论二—七的最佳方案,在这个方案里,全部除了最快和次快的旅行者都以上面两个模式过桥,而且再不回来。class
6、最慢两人的过桥方式
如今咱们来考虑走得最慢和走得次慢的人是如何过桥的。假设走得最慢的是Z,需时z;走得次慢的是Y,需时y。咱们要证实:
结论九:全部符合结论八的最佳方案中,最慢两人过桥的模式必须相同,并且若是使用的都是模式二,那么他们必定在一块儿过河。
特别地,不管他们以什么模式过河,咱们总能够在开始的4步里将他们移动到彼岸。
1) 假设Z以模式一过河,可是Y却以模式二过河(步骤旁为此步所需时间):
……
A Z → z
A ← a
……
A B → b
A ← a
X Y → y (X是另外一不为A或B的旅行者,需时x)
B ← b
……
咱们能够把X和Z对换,变成
……
A X → x (X是另外一不为A或B的旅行者,需时x)
A ← a
……
A B → b
A ← a
Z Y → z
B ← b
……
这时修改过的方案比原先的耗时短y-x分钟,和原先的“最佳方案”假定矛盾。
2) 假设Z以模式二过河,可是Y却以模式一过河(步骤旁为此步所需时间):
……
A Y → y
A ← a
……
A B → b
A ← a
X Z → z (X是另外一不为A或B的旅行者,需时x)
B ← b
……
咱们能够把X和Y对换,变成
……
A X → x (X是另外一不为A或B的旅行者,需时x)
A ← a
……
A B → b
A ← a
Y Z → z
B ← b
……
这时修改过的方案比原先的耗时短y-x分钟,和原先的“最佳方案”假
定矛盾。
因此Z和Y一定用同一模式过河。假设他们都以模式二过河,却不在一块儿:
……
A B → b
A ← a
W Y → y (W是另外一不为A或B的旅行者,需时w)
B ← b
……
A B → b
A ← a
X Z → z (X是另外一不为A或B的旅行者,需时x)
B ← b
……
咱们能够把X和Y对换,变成
……
A B → b
A ← a
W X → t (t是w和x中比较大的那一个)
B ← b
……
A B → b
A ← a
Y Z → z
B ← b
……
这时修改过的方案比原先的耗时短y-t分钟(Y是跑得次慢的,因此y比w和t都要大),和原先的“最佳方案”假定矛盾。
因而最慢两人过桥的模式必须相同,并且若是使用的都是模式二,那么他们必定在一块儿过河。如今咱们来考虑在方案的前4步就将他们移动到彼岸。这很是简单。
若是两人都是以模式一过河:
……
A Z → z
A ← a
……
A Y → y
A ← a
……
咱们能够把这几步挪到最开始而不改变其余步骤:
第1步: A Z → z
第2步: A ← a
第3步: A Y → y
第4步: A ← a
……
若是两人以模式二一块儿过河:
……
A B → b
A ← a
Y Z → z
B ← b
……
咱们一样能够把这几步挪到最开始而不改变其余步骤:
第1步: A B → b
第2步: A ← a
第3步: Y Z → z
第4步: B ← b
……
这就彻底证实告终论九。
7、结论
若是给定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=一、二、3的状况。
N=一、2是不用动脑子的,直接统统过桥就是了。
N=3也很简单,用穷举法能够发现由最快的人往返一次把其余两人送过河是最快的方法。
因而咱们获得了最终结论:
最佳方案构造法:如下是构造N我的(N≥1)过桥最佳方案的方法:
1) 若是N=一、2,全部人直接过桥。
2) 若是N=3,由最快的人往返一次把其余两人送过河。
3) 若是N≥4,设A、B为走得最快和次快的旅行者,过桥所需时间分别为a、b;而Z、Y为走得最慢和次慢的旅行者,过桥所需时间分别为z、y。那么
当2b>a+y时,使用模式一将Z和Y移动过桥;
当2b<a+y时,使用模式二将Z和Y移动过桥;
当2b=a+y时,使用模式一将Z和Y移动过桥。
这样就使问题转变为N-2个旅行者的情形,从而递归解决之。
最后固然咱们要举一个具体的例子:七个旅行者,所需过桥时间分别是一、四、五、五、五、八、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分钟的方案一定是最佳的。
http://blog.csdn.net/satan0571/article/details/542023