最近几天看到一个挺有趣的博弈相关的趣谈,今天来分享给你们,而且也会详细讲解最终问题的最优解,而且我还好经过这道题扯一扯递归。算法
有 5 个海盗,得到了 100 枚金币,因而他们要商量一个方法来分配金币。商议方式以下:数据库
由 5 个海盗轮流提出分配方案,规则以下编程
一、若是超过半数海盗(包括提出者)赞成该方案,则按照该方案分配。微信
二、若是赞成该方案的人数(包括提出者)小于等于半数,则提出者要被扔到海里喂鱼,剩下的海盗继续商议分配。网络
三、海盗们都是绝对理性的,以本身尽量多得到金币为目的。可是在收益相等的状况下,会倾向把提出者扔到海里。学习
问:第一个海盗应该提出怎样的分配方案,才能保证本身既不被扔到海里,又能使本身利益最大化?操作系统
先作一些假设和提醒计算机网络
为了方便后面描述,咱们假设轮流提出方案的顺序为:海盗5,海盗4,海盗3,海盗2,海盗1;也就是说,最开始由海盗5 提出分配方案,海盗1排在最后3d
而且,你们必定要注意最后一个条件,每一个海盗是绝对理性以及在收益相等的状况下,会倾向把提出者扔到海里。blog
前方高能,开始扯淡,请你发挥出你的各类猜测
好了,如今若是你是海盗5,你会怎么分配才能使得得到的金币尽量多,而且不会被扔进海里喂鱼呢?
说实话,第一眼看到这个问题,有点无从下手,脑子太特么乱了,由于彻底不知道怎么证实我的分配方案可以让超过一半的海盗都必须支持我,要不平均分配?要不我少一点他们多一点?要不我多一点他们少一点(这样会不会立刻就被扔下海里)?
你也能够本身先想几分钟哦,看看你可否本身想的出来?
事实上,要让别人赞成咱们的想法,咱们必须得知彼知己,才能百战百胜。也就是说,海盗5要给出分配方案,必须基于海盗4的分配方案来;也就是说,海盗5得先假设本身被扔进海里的话,海盗4会如何分配呢?而后根据海盗4的分配方案,海盗5才能给出他的分配方案。
同理,海盗4的分配方法得基于海盗3,海盗3得基于海盗2,以此类推
听不懂?不要紧,下面我举个例子大家立刻就懂了
一、只有 2 个海盗的状况
如今,咱们假设只有两个海盗:海盗1 和海盗2,这个时候你应该知道分配结果了吧?
很显然,不管海盗2提出什么方案,海盗1 都会直接拒绝,这样海盗1就可能得到所有的金币了,也就是说,当只有两个海盗时,海盗2 不管怎么讨好海盗1,最终的结果都是到海里喂鱼,因此分配结果以下
二、只有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 个海盗,你也会分配了?我相信你大几率知道怎么分配了,不过我仍是要讲一下,由于后面随着人数的增长,也并无你想的那么简单,而且后面还会和递归算法串讲一下。
三、只有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?
答是咱贿赂不起,若是你有这样的想法,只能说明你不是一个合格的海盗!
四、只有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),类比于这个海盗问题的话,
一、n 至关于海盗的个数。
二、只有两个海盗时,咱们能够很是容易着给出方案,至关于初始条件 f(1) = f(2) = 1
三、f(n) = f(n - 1) + f(n - 2) 至关于海盗之间定下的规则
因此呢,有时候遇到这种看似很复杂的博弈问题,不妨先从问题的规模尽可能小处理起,后面在逐一增长问题的规模。
若是又忽然冒出了一个海盗呢?也就是在一共有 6 个海盗的状况下,该如何处理呢?
有没有以为,从 5 个到 6 个,是一个分水岭?由于从 5 个开始,就有多种分配方案,这个时候就更加考验你的逻辑了。
不过,对于 6 个,我姑且给你们分析一下,固然,只是我认为是这样,其实我看过别人的也有不一样的版本。下面我来分析下海盗6能够给出的策略:
首先,咱们必须拉拢 3 我的,显然,咱们是不可能会拉拢海盗5的,由于咱拉不起。由于咱们会从海盗1 ~ 海盗4中考虑。
一、首先咱们必须拉拢海盗4,由于他最容易贿赂,给他 1 个金币便可。
二、接着,咱们拉拢海盗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 个海盗呢?
剩下的就交给你了,鉴于篇幅,我就不继续分析了。
这么多年以来,今年的春节,估计是最特殊的春节了,想必你们都在家里呆着,今天这道题也是我花了整整一个上午写的,但愿可以让你有所收获,或者可以能够给给解解闷,咱们下期再见!
一、给俺点个赞呗,可让更多的人看到这篇文章,顺便激励下我,嘻嘻。
二、老铁们,关注个人原创微信公众号「帅地玩编程」,专一于写算法 + 计算机基础知识(计算机网络+ 操做系统+数据库+Linux)。
保存让你看完有所收获,不信你打我。后台回复『电子书』送你一份精选电子书大礼包,包含各种技能的优质电子书。
做者:你们好,我是帅地,从大学、校招一路走来,深知算法,计算机基础知识的重要性,因此申请了一个微星公众号『帅地玩编程』,专业于写这些底层知识,提高咱们的内功,帅地期待你的关注,和我一块儿学习。 转载说明:未得到受权,禁止转载