猫猫吃小鱼干问题——策略与证明(其实是猜帽子问题啦!)

本文主要内容来自:Ebert, Todd & Merkle, Wolfgang & Vollmer, Heribert. (2002). On the Autoreducibility of Random Sequences. SIAM J. Computing. 32. 10.1137/S0097539702415317.

考虑这样的一个问题:

一个铲屎官有三只猫猫🐱。有一天,铲屎官买了两种颜色的项圈(橙色和蓝色),给主子们带上。然而,主子们并不知道自己被戴上的是什么颜色的项圈,而且每只猫猫的项圈颜色是铲屎官完全随机选择的。每只猫只能看到另外两只猫猫的项圈颜色。这时,铲屎官让猫猫各自猜测自己的项圈颜色(同时说出猜测),或者也可以选择不进行猜测。如果三只猫猫中至少有一只猜对了,且没有猫猫猜错的话,就可以得到一把小鱼干🐟。在戴上项圈之后,猫猫们之间就不能交流了,但是他们可以在开始之前进行讨论。

能否帮主子们设计一个策略,使得他们吃到小鱼干的可能性最大?
在这里插入图片描述
直觉上来说,由于给每只猫分配什么颜色的项圈都是独立的,似乎看到其他猫的项圈颜色对于猜测自己的项圈并没有什么帮助。由于每只猫猜对和猜错的概率为0.5,因此看起来猫猫们能够吃到小鱼干的概率并不会大于0.5。

假如猫猫们没有策略,完全随机地选择三种选择中的一种,他们吃到小鱼干的概率为:
P ( 吃 到 小 鱼 干 ! ) = C 3 1 ( 1 3 ) ( 1 3 ) 2 + C 3 2 ( 1 3 ) 2 ( 1 3 ) + C 3 3 ( 1 3 ) 3 = 7 27 ≈ 0.259 \begin{aligned}\text{P}(吃到小鱼干!)&=C_3^1(\frac{1}{3})(\frac{1}{3})^2+C_3^2(\frac{1}{3})^2(\frac{1}{3})+C_3^3(\frac{1}{3})^3\\ &=\frac{7}{27}\\ &\approx0.259 \end{aligned} P()=C31(31)(31)2+C32(31)2(31)+C33(31)3=2770.259
即成功的概率为:一只猫猜对+两只猫猜对+三只猫猜对。

但实际上,当对于独立的事件进行整体地考虑时,会发生一些有趣的事情。

我们来看这样的一个策略:

对于每只猫,假如ta看到另外两只猫的项圈颜色是一样的,则猜测与这种颜色相反的颜色;假如ta看到另外两只猫的项圈颜色不一样,则不进行猜测。

这样吃到小鱼干的概率是多少呢?所有可能的情况如下:
在这里插入图片描述
仔细观察会发现,有两只猫的项圈颜色一样,而剩下那只猫的项圈颜色与他们不一样,这样的情况在8种情况中占了6种!这样一来,按照上面的策略,除了三只猫的项圈颜色一样(全为蓝色和全为橙色)的两种情况下会猜错,其他情况猫猫们都能吃到小鱼干!此时我们成功的概率为:
P ( 吃 到 小 鱼 干 ! ) = 6 8 = 0.75 \text{P}(吃到小鱼干!)=\frac{6}{8}=0.75 P()=86=0.75
3/4的成功概率比随机猜测要大多了!猫猫们的小鱼干有着落了!

猫猫们望着你——还有没有更好的策略呢?其实是没有了,这一策略给出的成功概率是最大的。但是猫猫们不信。

你耸了耸肩,那让我们证明给猫猫们看。

证明1:

对于任何一个确定的策略,由于给每只猫猫的项圈都是完全随机地分配的,因此不管这一策略让每一只猫怎样进行猜测,猜对的概率总是1/2。所以,对于每一只猫,其给出错误猜测和正确猜测的数量的期望是相同的。因为期望是线性的,所以对于三只猫组成的整体来说也是如此。假如我们定义随机变量 g c g_c gc g i g_i gi来分别代表正确猜测的数量和错误猜测的数量,那么对于三只猫的整体,这两个变量对应的期望值 E [ g c ] \text{E}[g_c] E[gc] E [ g i ] \text{E}[g_i] E[gi]是相等的。如果这个策略成功的概率为 p p p,那么我们有
p ≤ E [ g c ] = E [ g i ] ≤ 3 ( 1 − p ) . p\leq\text{E}[g_c]=\text{E}[g_i]\leq3(1-p). pE[gc]=E[gi]3(1p).
这个等式中,左边的不等式是因为任何一个成功的局面(三只猫给出的猜测)中,必须至少有一个正确的猜测;而右边的不等式是因为①任何一个成功的局面中没有错误的猜测,且②其他情况下最多只能有3个错误的猜测。

因此我们得到
p ≤ 3 ( 1 − p ) p ≤ 3 4 \begin{aligned}p&\leq3(1-p)\\ p&\leq\frac{3}{4}\end{aligned} pp3(1p)43

猫猫们听得有点晕,摇了摇头,让你说人话。你低头沉思了一会,给出了第二个证明。

证明2:

由于项圈的颜色只有两种,有计算机专业の直觉的同学们可以很快地想到能够用0和1来表示这两种颜色。因此所有的情况可以用0和1组成的长为3的码字(word)来表示,即
000 , 001 , 010 , 011 , 100 , 101 , 110 , 111 {000,001,010,011,100,101,110,111} 000,001,010,011,100,101,110,111
我们将猫猫们进行编号,从1到3. 那么码字中的第 i i i个位置就代表了第 i i i号猫猫的项圈颜色。而我们把代表了真实情况的码字叫做真码字(true word)。对于第 i i i只猫猫来说,因为它可以看到另外两只猫的项圈颜色,因此它能够确定除 i i i位之外剩下两位的数字是0还是1. 因此,在猫猫 i i i的角度来说,它作出的猜测可能是0或者1,对应着两个在第 i i i位相反的码字,我们将这两个码字叫做猫猫 i i i的一致码字(consistent words)。

给出一个固定的策略,就意味着对于每一对一致码字,我们都会决定是否给出猜测。而如果给出猜测,则要决定在这一对码字之中选择哪一个。这意味着一种策略可以用一个有向图 G G G来表示。其中,图的每个结点都是一种可能出现的情况(即一个码字)。当且仅当两个结点可以作为某种情况下的一对一致码字时,这两个结点之间才有边。
在这里插入图片描述
给出一个策略和其对应的图 G G G,假设这个策略应用在真码字 u u u所代表的实际情况中。猫猫们成功吃到小鱼干的情况对应于是否存在猫猫能够从一对一致码字中选择真码字 u u u,同时没有猫猫会放弃码字 u u u而选择一致码字中的另外那个码字。对于这对应的有向图 G G G来说,一个策略如果在真实情况 u u u下能够成功,就意味着存在边指向 u u u(所代表的结点),同时不存在从 u u u指出的边(即结点 u u u的入度大于零,且出度等于零)。

至此,我们成功地把给猫猫们的猜测策略转换为了一个有向图中边的方向的指派问题。有向图中结点 u u u v v v之间的边,可以从 u u u指向 v v v或是从 v v v指向 u u u,也可以没有方向(代表不进行猜测)。由于每一种可能出现的真实情况都在图中有一个对应的点,因此一种策略成功的概率等于其对应的图中满足入度大于零且出度等于零的结点所占比例。要让成功的概率尽可能地大,就是让这样的结点的数目最大化。很容易想到,因为一个结点只要出度大于0,其所代表的情况就会失败。因此我们会尽可能地把所有出度大于0的情况集中在少数几个点之上,才能让出度为0的点尽可能地多。而每一个结点最大的出度为3. 因此,选择两个相隔最远的结点,使它们的出度为3,就能够让满足成功条件的结点所占比例最大。
在这里插入图片描述
这就对应着我们之前提出来的策略。举个栗子🌰:假如实际情况为010,2号猫猫将看到另外两只猫猫的情况都为0,那么2号猫猫做出判断,真实情况可能为000或者010. 而按照我们的策略以及上图中000结点和010结点之间边的方向,2号猫猫应该选择使得情况为010的猜测,即做出猜测1.
当然,实际上选择这样的策略也是一样的。

猫猫们点了点头,表示满意。

但我们一开始的直觉为什么会出错呢?实际上猫猫们能够吃到小鱼干的概率并不会大于0.5这一直觉并没有错。这里之所以能够得到大于0.5的概率是因为我们允许不确定的猫猫不给出猜测。而如果每只猫猫都必须给出自己的猜测且全部都要猜对,那么成功吃到小鱼干的概率确实不会大于0.5。问题的变种还有很多:要求猫猫们全部做出猜测且全对才能成功所有猫猫做出猜测且至少有一只猫猫猜对等等。

目前我们讨论的都是3只猫猫的情况,那如果有5只、7只或者n只猫猫呢?

为了给出更大规模问题的解,我们引入一些编码理论(coding theory)的概念。汉明距离(Hamming distance) d ( u , v ) \text{d}(u,v) d(u,v)代表两个相同长度的码字之间相异的位数。中心为 u u u的单位球(unit ball)为所有和 u u u长度相等,且和 u u u至多有一个位置符号不同的码字集合。也就是集合
{ v : d ( u , v ) ≤ 1 } . \{v:\text{d}(u,v)\leq1\}. {v:d(u,v)1}.
单位球的表面(surface)就是移除了中心 u u u之外的单位球。
在这里插入图片描述
在我们的问题中构造出的图里,一个结点 w w w的所有邻居就是中心为 w w w的单位球的表面。对应地,我们之前给出的策略可以写成:只有结点000和结点111的有出边,且这两个结点都分别指向以其为中心的单位球的表面上的所有结点。

这一简单的策略对于 n n n大于3的情况也同样适用。对于所有长度为 n n n的码字,选择一个子集 C C C,令所有在 C C C中的结点(码字所对应的结点)指向以该点为中心的单位元的表面上所有不在 C C C中的结点。如果我们选择了一个集合 C C C,其中 C C C中码字的单位球两两互不相交,则这些单位球的表面上的所有结点都满足入度大于零且出度等于零这一要求。怎样让这样满足要求的结点数量最多呢?当 C C C中码字的单位球构成所有长度为 n n n的码字集合的划分的时候,这样的结点是最多的。能够构成这样的划分的码字集合在编码理论中被称为完美一位纠错码(perfect one error correcting codes)。

而借用编码理论中的证明,当 n = 2 k − 1 n=2^k-1 n=2k1,且 k k k是一个大于零的自然数时,存在长度为 n n n的完美一位纠错码[1][2]。因此,我们只要有一个长度为 n n n的完美一位纠错码,就可以对应地给出相应的策略。而这样的集合 C C C中码字(结点)所占的比例为 1 / ( n + 1 ) 1/(n+1) 1/(n+1),因为它们的单位球构成所有码字集合的划分,且每一个球都由一个中心结点和 n n n个在表面上的结点组成。(长度为 n n n的码字中,对于其中一个码字,有 n n n个码字和它只有一位不一样。)因此,在有 n n n只猫猫的问题中,按照这样给出的策略,猫猫们成功吃到小鱼干的概率为 1 − 1 / ( n + 1 ) 1-1/(n+1) 11/(n+1)

这个听起来很高端的完美一位纠错码是什么呢?其实就是对于长度为3的码字,当编码集合为{000,111}时,假如传输时其中有一位出错了,我们也能够找出正确的码字。因为在长度为 n n n的完美一位纠错码的编码集合 C C C中,对于长度为 n n n的任何一个码字 w w w,都有且仅有一个编码 c c c属于 C C C,且满足 d ( w , c ) ≤ 1 \text{d}(w,c)\leq1 d(w,c)1。而满足条件的这个编码 c c c就是错误发生之前的原编码。

注:其实这个问题的正统形式是猜帽子问题或者囚徒问题,这里尝试换了一种叙述方式w。这个问题的提出本来是用来说明the problem of autoreducing random sequence,但是由于其有趣的puzzle形式引起了许多关注。这个问题还有很多很多不同的变种,有兴趣的同学可以看看[3]。

参考文献:

[1]Ebert, Todd & Merkle, Wolfgang & Vollmer, Heribert. (2002). On the Autoreducibility of Random Sequences. SIAM J. Computing. 32. 10.1137/S0097539702415317.

[2]J.H. VAN LINT, Introduction to Coding Theory, 3rd ed., Springer-Verlag, Berlin, 1999.

[3]Hardin, Christopher & Taylor, Alan. (2013). The mathematics of coordinated inference. A study of generalized hat problems. 10.1007/978-3-319-01333-6.

更多:

Code Theory

Code Theory Lecture Notes

A Survey of Perfect Codes

欢迎来0xffff社区讨论~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同 12-5 集合类的同问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值