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