【算法分析】最大概率选择到“最好女孩”的算法
问题:
假设你是一位男孩,而上天在你20-30岁间安排了20位适合你的女孩。这些女孩都愿意作为你的伴侣,但你只能选择他们其中一个。选择的条件如下:
- 对于你来说,这20位女孩是可以排序的,也就是说事后你可以对她们的质量进行排名,排名第一的女孩对你来说就是最好的,排名第二十的对你来说就是最差的。
- 这20位女孩不是同时出现在你的生命中,而是按照时间顺序先后出现,每出现一个你都要决定留下还是拒绝。如果留下她,她就会成为你的终身伴侣,你将没有权利选择后面的女孩;如果你拒绝,你还可以选择后面的女孩,但是对前面已经拒绝的女孩就没有机会从头再来。
假设上天是完全随机安排各个时间段出现的女孩,即出现的时间先后和女孩的质量完全没有关系。那么,你应该在什么时候决定接受一位女孩,并使得被接受的那位女孩属于最好女孩的可能性最大呢?
算法分析:
很有意思的问题,我首先下意识的想到是先看一看,比一比,不求最好,后来在网上看到这样的策略算出来的概率还是挺高的,先转载一下网上完整的答案:
策略1:事先抽签,抽到第几个就第几个。比如,抽到第10位,那么第10个在你生命中出现的女孩就事前被确定为你的伴侣。而她刚好是最好的女孩之概率是多少呢?答案是1/20=0.05。这种策略使你有5%的可能性获得最好的女孩。这样的概率显然太小,很难发生。
策略2:把全部女孩分成前后两段,最先出现的10位均不接受,但了解了这10位女孩的质量,然后在后来出现的10位女孩当中,第一次碰到比以前都可爱的女孩子,就立马接受。这是一种等一等、看一看的策略。这样的策略中,你得到最好的女孩子的概率是(10/20)*(10/19)=0.263。这个概率已经不算太小。
补充说明一下策略2中概率的算法:这样的规则下,确保得到最好的女孩子必然要求最好的女孩子在后10名女孩子中出现——否则你怎么也得不到最好的了 ——其概率是(10/20),同时,还要求第二好的女孩子出现在前10名,其概率为(10/19)——为什么是(10/19)?因为除了最好的,剩下人数 19个,第二好的女孩出现在前10名的概率就是(10/19)——这样就确保了你会得到最好的女孩子。
但是,策略2得到最好女孩子的概率真的是0.263吗?可能不是,因为这只是第二好的女孩刚好在前10个出现的情况;实际上,即使第二好女孩子没有出现在先前的10个,但只要在最好的女孩出现之前的所有女孩中质量最高的出现在前10个,那么策略2也可确保得到最好的女孩子(这一点要想通,否则就难以明白接下来的内容)。也就是说,策略2获得最好的女孩子的概率实际上是超过0.263的(实际上我们在后面会发现这个概率应是0.3594。哇!这的确已经是一个不小的概率了)。
但是,还有更好的方法吗?或者我们可以问,放弃先出现的10个女孩是否是最优的?如果不是,那么应该放弃几个先出现的女孩子呢?
事实上,我们确有更好的策略(你应该先把前面的内容看懂,如果前面没看懂,下面可能就更看不懂了)。既然20个质量不同的女孩子其质量在你生命里是随机出现的,没有任何规律,那么,第k个女孩刚好是最好女孩的概率是1/20,而刚好把这个最好的女孩子选择到的概率是多少?对此的考虑应该是:既然给定了第k个女孩子质量最好,而我们决定放弃前面n-1个女孩子,从第n个开始执行策略2的规则,那么必须要求在k之前的女孩子中质量排名最高的那个必须出现前 n-1个女孩子中,这样才能确保k被选中,其概率就是(n-1)/(k-1)。从而第k个女孩子刚好是最好的女孩子而且又一定被选中的概率就是(1 /20)[(n-1)/(k-1)]。这里,k的取值范围显然应该是[n,20]中的整数。所以,放弃n-1个女孩子而一定会得到最可爱的那个女孩子的概率实际上就是(1/20)[(n-1)/(n-1)]+ (1/20)[(n-1)/(n)]+ (1/20)[(n-1)/(n+1)]+…+(1/20)[(n-1)/(20-1)]。这个概率可以用Mathematica软件来计算,或者用 Excel来计算也可以,读者会发现,当n=8时,该概率有最大值0.3842。也就是说,如果我们放弃前7个女孩子,先看一看,心里有个谱,然后只要看到比前7个女孩子中最好的女孩还要好的女孩子,那么我们就立即选择接受。而这个被接受的女孩子刚好属于最好女孩的概率是0.3842。这比我们放弃10 个女孩(n*=11)的策略2要好,按照策略2根据上述公式计算得到获得最好女孩的概率为0.3594。
我们用Mathematica软件绘出获得最好女孩子的概率图形(纵轴是概率,横轴表示从第几个开始认真考虑接受。最大概率出现在n*=8,即放弃前7个,从第8个开始认真考虑接受)。
根据这样的结果,我们可以这样结论:如果一个人确定结婚对象在20-30岁之间,而这20个女孩子以每年两个的平均分布出现,那么你应当在24岁才开始认真考虑终身大事。
这个例子也可任意改动数据后用同样的方法求解。比如,如果是30个女孩子,那么你应该从第11个女孩子开始认真考虑终身大事。
这个例子也可以改成其他的版本,比如:在20层楼中,每层楼都放着一颗宝石,每颗宝石的大小不一。现在你从第一楼开始上楼,每到一层楼你都可决定要不要该层楼中的宝石。如果不要,不能回头。如果要,则以后不能再取。问:你应该如何才可以有最大的机会获得最大那颗宝石?这个问题,据说是微软公司的面试题。但它的道理,与最大可能获得女孩子的道理是一样的。
证明方法来自果壳网: http://www.guokr.com/article/6768/