问题描述
Philippe Flajolet和Robert Sedgewick在2009年提出了“百囚犯问题(100 prisoners problem)。
在某个法制不健全的国家,监狱中有编号从1到100的100名囚犯,监狱长给了他们最后一次机会:
-----一个房间里有100个抽屉,监狱长随意把1到100这100个号码放到100个抽屉里,每个抽屉一张
-----囚犯们逐个进入房间,每人可以任意打开50个抽屉,之后关上
-----如果每位囚犯都在这50个抽屉中找到了他的号码,那么所有的囚犯都会被赦免;如果有人没有找到他的号码,那么所有的囚犯都会被处死
-----在第一个囚犯进入房间之前,囚犯们允许在一起讨论开抽屉的“策略”;但一旦第一个囚犯进入房间,他们之间就被禁止交流
设计出一种策略,使得尽可能被赦免
问题分析
如果纯粹随机开抽屉,那么所有人被赦免的概率是(50 / 100)^100 ≈ 8*10^-31,可见这个概率非常的小。
囚犯有什么好一些的策略?
下面给出已经被证明的最优策略:
循环跟踪策略
每名囚犯进入房间后都—— 1、先打开自己号码的抽屉 2、如果这个抽屉有他自己的号码,他就成功了 3、否则,抽屉里会有另外一个号码,然后他打开这个号码的抽屉 4、不断地重复第2步和第3步,直到他已经找到自己的号码,或者已经打开50个抽屉都没找到(那全体就失败了)
示例1:
考虑一个迷你版的,把100改成8,50改成4,抽屉放纸条的方式按如下所示:
策略的具体实现如下:
1号囚犯打开1号抽屉发现8号纸条、打开8号抽屉发现4号纸条、打开4号抽屉发现6号纸条、打开6号抽屉发现1号纸条-----命悬一线有惊无险 2号囚犯开2号-->开5号-->开3号-----找到 3号囚犯开3号-->开2号-->开5号-----找到 4号囚犯开4号-->开6号-->开1号-->开8号-----找到 5号囚犯开5号-->开3号-->开2号-----找到 6号囚犯开6号-->开1号-->开8号-->开4号-----找到 7号囚犯开7号-----找到 8号囚犯开8号-->开4号-->开6号-->开1号-----找到 大家都被赦免了!
示例2:
抽屉放纸条的方式如下:
策略的具体实现如下:
第一个进去的囚犯开1号-->开5号-->开8号-->开2号----不是,,,( ¯ □ ¯ )……(x___x)
进一步分析:
抽屉的编号和抽屉里的数字形成置换,根据定理任意置换可唯一的表示成若干不相交轮换的复合(积).
于是示例1中的置换可写成:(1,8,4,6)(2,5,3)(7),示例2中的置换可写成:(1,5,8,2,7)(3,4,6)
于是容易得出结论:如果 i 所在的轮换长度不超过50,那么第 i 号囚犯一定可以找到自己的号码纸条;如果 i 所在的轮换长度超过50,那么第 i 号囚犯一定找不到自己的号码纸条。
几点标注
1、其实按照这个策略,当前50个囚犯成功时,后50已经不必再试就知道他们必然获释
2、在前50个人中如果有人是第50个抽屉才发现自己的号码,那么后面的囚犯都不必再试
最优策略下的成功概率
实质就是在 100! 种(n种元素的置换有n!种)中,有多少置换存在长度大于50的轮换?
易知任意一个置换分解后至多存在一个长度大于50的置换.
我们假定置换下面假定置换 存在长度大于50的轮换 ,其长度为 l.
------轮换中的元素有C(100,l)种可能
-------选定l个元素后,可以形成(l - 1)!种不同的轮换(即圆排列数)
-------剩下的(100 - l)个元素可形成(100 - l)!种置换
-------于是这样的置换一共有C(100,l) * (l - 1) * (100 - l) = 100! / l种
囚犯们遇到这样的置换的概率是
所以成功的概率是1 - 0.6882 = 0.3118.
渐近分析
当把100改做2n,50改做n,该策略失败的概率为Σ2nn+1(1/l),记H(n) = 1 + 1/2 + 1/3 +...+1/n
成功的概率 = 1 - (H2n - Hn) = 1 - (H2n - ln(2n)) + (Hn - ln(n)) - ln2
已知,于是
总结
最优策略虽然很容易理解,但却不好证明,以后会证了再补充吧/இ௰இ!
参考链接:
https://en.wikipedia.org/wiki/100_prisoners_problem