金剛坐飛機問題

轉載於 http://jarfield.iteye.com/blog/1798180

文章背景


編程之美 4.1 “金剛坐飛機問題”的問題2,難度比問題1大很多。

編程之美的官方解法,包括原理分析、概率公式、推導過程等,感覺闡述不夠詳細,沒有完全讀懂。

搜索一下 “金剛坐飛機”,參考了幾個很不錯的分析,得到一個自己覺得比較完整的答案。

 

仔細審題

 

首先,仔細審題,有兩個細節需要搞清楚:

 

  1. 飛機上總共有多少座位?N?N+1?還是更多?從問題1的官方解答看,飛機上座位總數爲N。
  2. “...乘客們正準備按機票編號(1,2,3...N)依次排隊登機。突然來了一隻大猩猩(對,他叫金剛)。他也有飛機票,但是...”,金剛的機票編號是否屬於閉區間[1,N]?換句話說,所有乘客(包括金剛)的總數是N還是N+1?既然座位總數爲N,金剛也有飛機票,飛機也不可能超載,因此,所有乘客(包括金剛)的總數爲N。金剛的機票編號也屬於閉區間[1,N]。
 

 

推敲官方答案

 

然後,看一下編程之美的官方答案:第i個乘客坐在自己位置上的概率爲 
 。
既然飛機座位總數爲N,根據官方答案,第1個乘客的概率爲。實際上,第1個乘客的概率應該爲。計算過程如下:
根據全概率公式,第1個乘客坐在自己座位上的概率:


 
如何解釋這個問題呢?從問題2的官方解答過程“如果n=1或n>i,那麼第i個乘客坐在自己位置上的概率爲1....”可以推測,官方認爲金剛的機票編號爲1。官方答案中的i應該不包括1。

 

重新描述問題

 

到這裏,我重新描述一下問題:
飛機上有N個座位,座位編號依次爲1,2,..N。恰好有N個乘客排隊登機,第1個乘客的座位編號是1,第2個乘客的座位編號是2,...,第N個乘客的座位編號是N。每個乘客都應該坐在編號正確的座位上。但是,第1個乘客是不講道理的金剛,他第一個進入飛機,隨便(隨機)挑了一個座位坐下。其他乘客敢怒不敢言,只好依次找座位坐下。如果自己的座位沒有被佔,則坐自己的作爲,否則,也像金剛那樣隨便挑一個座位。現在,求第i個乘客(第1個乘客還是金剛)坐到自己座位的概率是多少?
我算出的答案爲:


 
與官方答案是一致的,但是本文會給出更加詳細的計算過程。

 

概率計算過程

 
下面描述計算過程。
令P(i)表示,第i個乘客坐到座位i的概率。
金剛的座位明明是空的,他還要隨便佔位;其他乘客只有在自己座位被佔的情況下,才隨便坐。因此,金剛與其他乘客的行爲並不相同,需要分開計算。
 

先計算金剛的概率

 
顯然,P(1)就是金剛坐在1號座位的概率。金剛是第一個隨便挑座位的,因此概率爲

 

再計算其他乘客的概率

核心工具是全概率公式

 
第2~N個乘客的概率不容易看出,我們根據全概率公式來計算,條件爲金剛坐在編號爲j的座位上:
,其中:
  • P(K=j)表示,金剛坐在座位j的概率
  • P(i|K=j)表示,在金剛坐在座位j上的情況下,第i個乘客坐在座位i的概率
顯然,金剛坐在位置j的概率均等,都是
條件概率P(i|K=j)的計算不太直觀,我們先簡單分析一下:
  1. 如果j=1,也就是說金剛居然坐在了自己的座位上,第i個乘客(其實是所有其他乘客)必然能夠坐到自己座位,因此P(K=j) = 1。
  2. 如果j=i,也就是說金剛居然坐在了第i個乘客的座位上,第i個乘客肯定不能坐到自己座位,因此P(K=j) = 0。
  3. 如果j>i,也就是說,金剛坐了(第i個乘客)後面的座位,不影響前面乘客找座位,第i個乘客(其實是第2~j-1個乘客)必然能夠坐到自己座位,因此P(K=j) = 1。
  4. 如果1<j<i,也就是說,金剛搶了(第i個乘客)前面的座位,肯定會影響第i個乘客(其實是第j~N個乘客)的座位。
因此,可以初步計算:

這時,只需要計算最後一個條件概率
 

難點是計算條件概率

可以依次計算P(i|K=i-1),P(i|K=i-2),...,P(i|K=2),發現他們的值都爲,神奇吧!
最終結果:

 

自頂向下計算條件概率

 

那麼,1<j<i時,P(i|K=j)到底是怎麼計算的呢?下面詳細推導一下j=i-1和j=i-2這兩種情況,其他情況可以順推。

如果金剛坐在了座位i-1上,第i-1個乘客可以選擇座位1、i、i+1~N。每種選擇的概率均等,爲1/(N-i+2):

 

  1. 如果第i-1個乘客選擇座位1,則第i個乘客必然能坐到自己座位,概率爲1
  2. 如果第i-1個乘客選擇座位i,則第i個乘客必然不能坐到自己座位,概率爲0
  3. 如果第i-1個乘客選擇座位i+1~N,則第i個座位必然能坐到自己座位,概率爲1
根據全概率公式,有
如果金剛坐在了座位i-2上,第i-2個乘客可以選擇座位1、i-1、i~N。每種選擇的概率均等,爲1/(N-i+3):

 

  1. 如果第i-2個乘客選擇座位1,則第i個乘客必然能坐到自己座位,概率爲1
  2. 如果第i-2個乘客選擇座位i-1,則第i-1個乘客的選擇將影響第i個乘客的概率。此種情況恰好可以遞歸到P(i|K=i-1),只要假設第i-2個乘客就是金剛,它坐在了座位i-1上
  3. 如果第i-2個乘客選擇座位i,則第i個乘客必然不能坐到自己座位,概率爲0
  4. 如果第i-2個乘客選擇座位i+1~N,則第i個座位必然能坐到自己座位,概率爲1
根據全概率公式,有

 

如果繼續計算下去,其實可以發現規律,
  

挖掘遞歸現象

 

其實,從上述推導的過程中,我們已經發現遞歸的跡象,是否可以再深入挖掘一下遞歸公式,進而避免繁瑣的推導呢?

如果金剛坐在了座位j上,那麼第j個乘客將會在座位1、j+1~N中隨即選擇一個座位。此時,乘客數量變成N-j+1,座位的數量也是N-j+1,第j個乘客恰好是剩餘乘客的第1個,他變成了新的金剛。我們把他的座位編號從j換成1,這個變換不會影響問題的答案。下面我們來證明這個變換的安全性。

這個變換肯定會影響第j個乘客的概率,但是我們要計算的 並不包括第j個乘客,所以不用考慮這個影響。對於第2~i-1個乘客而言,如果第j個乘客無論是坐在1還是j,他們都可以坐在自己的座位上,對他們來說沒有區別,對他們的概率也沒有任何影響。因此,這個變換是安全的。

 

從問題的形式上看,變換之後的問題,與原問題等價,只是問題規模從N減小到N-j+1,且每位乘客的編號減小(j-1),座位編號也減小(j-1)。下面詳細描述新問題:

飛機上有N-j+1個座位,座位編號依次爲1,2,..N-j+1。恰好有N個乘客排隊登機,第1個乘客的座位編號是1,第2個乘客的座位編號是2,...,第N-j+1個乘客的座位編號是N-j+1。每個乘客都應該坐在編號正確的座位上。但是,第1個乘客是不講道理的金剛,他第一個進入飛機,隨便(隨機)挑了一個座位坐下。其他乘客敢怒不敢言,只好依次找座位坐下。如果自己的座位沒有被佔,則坐自己的作爲,否則,也像金剛那樣隨便挑一個座位。現在,求第i個乘客(第1個乘客還是金剛)坐到自己座位的概率是多少?

 

利用遞歸形式計算條件概率

 

這裏引入了一個新的變量n,表示乘客的總數。我們令F(i,n)表示在乘客總數爲n的情況下,第i個乘客坐到自己座位的概率。顯然,P(i) = F(i,N)。

下面,我們開始計算F(i,n),首先將P(i,N)計算結果中的N替換成n,然後利用子問題的遞歸形式。




 
 因此,我們有



 
 

結合金剛的概率,我們得到完整答案:

 

 

參考文獻率

 
編程之美4.1節,P263~266
【編程之美】金剛坐飛機問題 - python27 - 博客園 http://www.cnblogs.com/python27/archive/2012/04/08/2438009.html
編程之美筆記——金剛坐飛機 - Parnasse的專欄 - 博客頻道 - CSDN.NET http://blog.csdn.net/FlyingIceCS/article/details/6007735
  • 大小: 7 KB
  • 大小: 5.5 KB
  • 大小: 739 Bytes
  • 大小: 737 Bytes
  • 大小: 6.1 KB
  • 大小: 5.2 KB
  • 大小: 1.2 KB
  • 大小: 8.4 KB
  • 大小: 17.3 KB
  • 大小: 838 Bytes
  • 大小: 913 Bytes
  • 大小: 1.4 KB
  • 大小: 7.9 KB
  • 大小: 3.9 KB
  • 大小: 3 KB
  • 大小: 1.2 KB
  • 大小: 1.9 KB
  • 大小: 919 Bytes
  • 大小: 1.6 KB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章