1. 程式人生 > >有趣的海盜分金幣問題,不學點演算法都不配當個海盜了

有趣的海盜分金幣問題,不學點演算法都不配當個海盜了

最近幾天看到一個挺有趣的博弈相關的趣談,今天來分享給大家,並且也會詳細講解最終問題的最優解,並且我還好通過這道題扯一扯遞迴。

問題描述

有 5 個海盜,獲得了 100 枚金幣,於是他們要商量一個方法來分配金幣。商議方式如下:

由 5 個海盜輪流提出分配方案,規則如下

1、如果超過半數海盜(包括提出者)同意該方案,則按照該方案分配。

2、如果同意該方案的人數(包括提出者)小於等於半數,則提出者要被扔到海里餵魚,剩下的海盜繼續商議分配。

3、海盜們都是絕對理性的,以自己儘可能多獲得金幣為目的。但是在收益相等的情況下,會傾向把提出者扔到海里。

問:第一個海盜應該提出怎樣的分配方案,才能保證自己既不被扔到海里,又能使自己利益最大化?

解決問題

先做一些假設和提醒

為了方便後面描述,我們假設輪流提出方案的順序為:海盜5,海盜4,海盜3,海盜2,海盜1;也就是說,最開始由海盜5 提出分配方案,海盜1排在最後

並且,大家一定要注意最後一個條件,每個海盜是絕對理性以及在收益相等的情況下,會傾向把提出者扔到海里。

前方高能,開始扯淡,請你發揮出你的各種猜想

好了,現在如果你是海盜5,你會怎麼分配才能使得獲得的金幣儘可能多,並且不會被扔進海里餵魚呢?

說實話,第一眼看到這個問題,有點無從下手,腦子太特麼亂了,因為完全不知道怎麼證明我的分配方案能夠讓超過一半的海盜都必須支援我,要不平均分配?要不我少一點他們多一點?要不我多一點他們少一點(這樣會不會馬上就被扔下海里)?

你也可以自己先想幾分鐘哦,看看你能否自己想的出來?

事實上,要讓別人同意我們的想法,我們必須得知彼知己,才能百戰百勝。也就是說,海盜5要給出分配方案,必須基於海盜4的分配方案來;也就是說,海盜5得先假設自己被扔進海里的話,海盜4會如何分配呢?然後根據海盜4的分配方案,海盜5才能給出他的分配方案。

同理,海盜4的分配方法得基於海盜3,海盜3得基於海盜2,以此類推

聽不懂?沒關係,下面我舉個例子你們馬上就懂了

逐層擊破

1、只有 2 個海盜的情況

現在,我們假設只有兩個海盜:海盜1 和海盜2,這個時候你應該知道分配結果了吧?

很顯然,無論海盜2提出什麼方案,海盜1 都會直接拒絕,這樣海盜1就可能獲得全部的金幣了,也就是說,當只有兩個海盜時,海盜2 無論怎麼討好海盜1,最終的結果都是到海里餵魚,所以分配結果如下

2、只有3個海盜的情況

這個時候突然跳出了個海盜3,也參與到這場分贓活動中,這個時候海盜3該如何分配?

其實也非常簡單,海盜3剛才窺聽了海盜1和海盜2的對話,知道如果自己被扔進海里的話,海盜2一定也會被扔進海里,所以海盜3知道,自己無論提出什麼方法,海盜2都必須同意,所以海盜3可以提出如下的分配方案:

海盜3: 100 個金幣

海盜2: 0 個金幣
海盜1: 0 個金幣。

也就是,只要海盜2支援海盜3,就可以形成 2:1的局面,海盜3就可以穩贏,不需要兼顧海盜1是否支援。所以最終的分配結果如下

有人可能會說,我們用不用給海盜2分配一點好處?例如分配給海盜2一個金幣,條件3有個規則:在收益相等的情況下,海盜們會傾向把提出者扔到海,答是不需要的,雖然海盜2沒有分配到金幣,但是他並沒有被扔進海里,這就是最大的好處了

看到這裡,你是不是也知道如果是 4 個海盜或者 5 個海盜,你也會分配了?我相信你大概率知道怎麼分配了,不過我還是要講一下,因為後面隨著人數的增加,也並沒有你想的那麼簡單,並且後面還會和遞迴演算法串講一下。

3、只有4個海盜的情況

這個時候又突然蹦出個海盜4,並且海盜4是已經知道了海盜3的分配方案了,這個時候海盜4只需要獲得其中兩個人的支援即可。

如何獲得其中兩個人的支援?

這很容易,拿點錢給海盜1和海盜2就可以了,海盜4可以提出如下分配方案

海盜4:98個

海盜3:0個

海盜2:1個

海盜1:1個

注意,在收益相等的情況下,海盜們會傾向把提出者扔到海里,所以海盜4必須在海盜3的基礎上,多給海盜1和海盜2一個金幣,這個時候海盜1和海盜2一定會支援海盜4,此時的局面是 3:1(支援:反對的人數),因此只有4個人的情況下,分配方案為:

有人可能會問,為啥要拉攏賄賂海盜1和海盜2,咱能不能嘗試賄賂下海盜3?

答是咱賄賂不起,如果你有這樣的想法,只能說明你不是一個合格的海盜!

4、只有5個海盜的情況

如果有5個海盜,其實海盜5和海盜4一樣,只需要拉攏兩個人就可以了,那要拉攏誰呢?

這也不難,首先必須得賄賂海盜3,給他一個金幣就可以了,其次我們在海盜2或者海盜1之中拉攏一個人即可,想要拉攏哪一個,隨你開心,所以海盜5可以提出如下方案:

到這裡,就已經分配完畢了,是不是覺得很不可思議?原本還怕自己無論提出啥方案,都會被扔進海里,結果是如此出人意料。以後和別人分贓,是時候拿出這個規則了

問題的核心

我覺得這個問題,非常像我們平時學演算法中的遞迴,例如對於遞迴方式:f(n) = f(n - 1) + f(n - 2),並且給出初始條件 f(1) = f(2) = 1。

那麼如果一開始要你算 f(n),你也是無從下手的,f(n) 必須基於 f(n - 1) 和 f(n - 2),類比於這個海盜問題的話,

1、n 相當於海盜的個數。

2、只有兩個海盜時,我們可以非常容易著給出方案,相當於初始條件 f(1) = f(2) = 1

3、f(n) = f(n - 1) + f(n - 2) 相當於海盜之間定下的規則

所以呢,有時候遇到這種看似很複雜的博弈問題,不妨先從問題的規模儘量小處理起,後面在逐一增加問題的規模。

不妨來個拓展

如果又突然冒出了一個海盜呢?也就是在一共有 6 個海盜的情況下,該如何處理呢?

有沒有覺得,從 5 個到 6 個,是一個分水嶺?因為從 5 個開始,就有多種分配方案,這個時候就更加考驗你的邏輯了。

不過,對於 6 個,我姑且給大家分析一下,當然,只是我認為是這樣,其實我看過別人的也有不同的版本。下面我來分析下海盜6可以給出的策略:

首先,我們必須拉攏 3 個人,顯然,我們是不可能會拉攏海盜5的,因為咱拉不起。因為我們會從海盜1 ~ 海盜4中考慮。

1、首先我們必須拉攏海盜4,因為他最容易賄賂,給他 1 個金幣即可。

2、接著,我們拉攏海盜3,給他兩個金幣即可

此時,我們已經拉攏了海盜3和海盜4,接下來我們需要在海盜1和海盜2中選一個即可,那麼問題來了,該給海盜1和海盜2他們多少,他們才願意同意你的方案?

顯然,如果我們給海盜1分配 3 個金幣,海盜2分配 0 個,顯然海盜1一定會同意。

但是,真的需要給海盜1分配 3 個嗎?如果我給他 2 個金幣,他會同意嗎?

答是會的,為什麼呢?因為在海盜5的方案中,要麼是海盜1獲得2個,要麼是海盜2獲得2個,所以對於海盜1來說,海盜5會不會賄賂他,存在不確定性,因此作為一個理智的海盜,海盜1是會同意海盜6給他2個金幣的方案的。

因此海盜6可以提出如下方案

事實上,也可以從概率上來證明,在海盜5的方案中,由於海盜1和海盜2存在不確定性,我們可以進行折算,折算成海盜1和海盜2各自獲得一個金幣,所以我們給他兩個金幣,他必須得同意

當然,如果海盜6要給海盜2分配2個金幣,然後給海盜1分配 0 個金幣,也是可以的。**總的來說就是,我們可以從海盜1,海盜2,海盜3中選出兩個人,然後每人給他兩個金幣即可以,這樣的組合有三種,因此海盜6可以由如下 3 種方案:

分析到這裡,就已經結束了,如果又蹦出一個海盜呢?也就是說一共有 7 個海盜呢?

剩下的就交給你了,鑑於篇幅,我就不繼續分析了。

最後

這麼多年以來,今年的春節,估計是最特殊的春節了,想必大家都在家裡呆著,今天這道題也是我花了整整一個上午寫的,希望能夠讓你有所收穫,或者能夠可以給給解解悶,我們下期再見!

老鐵,要不點個贊再走可好?麼麼噠

1、給俺點個讚唄,可以讓更多的人看到這篇文章,順便激勵下我,嘻嘻。

2、老鐵們,關注我的原創微信公眾號「帥地玩程式設計」,專注於寫演算法 + 計算機基礎知識(計算機網路+ 作業系統+資料庫+Linux)。

儲存讓你看完有所收穫,不信你打我。後臺回覆『電子書』送你一份精選電子書大禮包,包含各類技能的優質電子書。

作者簡潔

作者:大家好,我是帥地,從大學、校招一路走來,深知演算法,計算機基礎知識的重要性,所以申請了一個微星公眾號『帥地玩程式設計』,專業於寫這些底層知識,提升我們的內功,帥地期待你的關注,和我一起學習。 轉載說明:未獲得授權,禁止轉載