在上一篇中,我们介绍了鸭子半圆概率问题以及一些很绕的思考,虽然解决了此问题,但是依旧不够简洁,丝毫没有体现出用对称性解题的巧妙之处,相关文章请戳:
对称思维的妙用之从解题到本质(五)——挑战网红题之鸭子半圆概率问题
对称思维的妙用之从解题到本质(四)——用三个套路秒杀一众问题
对称思维的妙用之从解题到本质(三)——三个套路总结
对称思维的妙用之从解题到本质(二)——斗地主中有人抓到王炸的概率是多少?
对称思维的妙用之从解题到本质(一)——巴格拉斯效果发生的概率
鸭子半圆概率问题对称构造解法
上回提到,我们还得找到存在半圆的等效表达,以及真正能够互斥划分的方法来化简计算。这样才能找到对称对立分类,以简化相乘。
当然,可能这种对称的方法根本就不存在,问题的结构本身决定了解的存在性,但是既然我都找到了,那就不用讨论了。
现在来看半圆的选择,题设等价于存在一个以其过四个点的劣弧的起点为起点的半圆。必要性的证明是很显然的,而充分性也只需要简单说明,把存在的半圆顺时针旋转到起点和某个点重合即证得。这种证明也是数学证明里的常见过程,我把你要我存在的虚无的东西给直接构造出代表来,代表存在则显然存在,而存在又能证明代表也一定存在。
显然,剩下的(n - 1)个点属于这个特定半圆的概率是1 / 2 ^ (n - 1),而且有n种选择方法,来选择这个劣弧的起点,能相加吗?
答案竟然是可以!因为解和半圆之间是一一对应的,不可能存在一组n个点,能有多个起点!(不考虑角度相同的点,它们对应的概率为0,可以不予计算)
所以你看到这个问题的画龙点睛之笔了吗?首先把存在的半圆,转化为一系列特定的等价半圆类,而且类内有好求的代表元素,类之间是互相对称对立的关系,满足化简的条件。即,它的定义保持分类的互斥性,加法原理适用,直接相加即为所求!找到对称对立分类,以简化相乘,说的就是这个意思。
顺便提一下,这个思路其实也并非来得毫无根据。其一便是如上一篇的方法依次判断的过程没法做到后续过程的等价性,使得可以大量使用乘法原理按步骤相乘或者等价划分后乘法简便运算得到;其二,不妨看看,如果直接给你n只鸭子的坐标,你直接要写出判断他们是否在一个半圆的式子怎么写呢?
此时,原问题化为:int(0~2pi) ^ n I(an in semi circle) / 2pi ^ n,其中的I(an in semi circle) = any(0~2pi semi circle)(all(1:m)(ai in circle)),那这函数到底怎么写呢?(不同的半圆用其起点位置唯一表示。)
注意这里已知的就是an的n个鸭子坐标,是不知道可能存在的半圆鸭子起点的。而每个可行解,往往还有多个可行的半圆解,直接把所有半圆可能进行相加是断然不行的,我们必须找到所有代表性的半圆,不重复不遗漏地拆解表达式求解的内容。
于是,我们把这个判断式子写成存在某个点为起点,使得其余点都在其顺时针的180度内来判断。然后,把所有可能的半圆分成起点在n段弧内的n个类型,并以其弧的起点为起点的圆作为代表,看能否完成不重复不遗漏的划分。
在进一步分析中可以发现,首先这种划分后的并集和原题意等价,每个判断之间是互斥的;另外,该点的存在,和以该点为终点,逆时针方向遇到的第一个点为起点围成的弧之间的点中存在这种点,是等价的(更本质的结构其实是一系列子集包含关系形成的集合全序序列的并集等于最大那个集合!),这一点前面已经讲到了。即存在半圆等价于至少存在这么个起点,后面的点都在其顺时针180度内。由此,问题的解就自然写出来了。
如果从集合运算的角度来说明可以更好理解:
any(0~2pi semi circle)(all(1:m)(ai in circle))
= |union(0:2pi semi circle)(all(1:m)(ai in circle))|(把any的示性运算转为集合运算,并集的连续运算,又叫联集)
= sum(i in 1:n)|union((ai, a(i 1) % n] semi circle)(all(1:m)(ai in circle))|(集合之间两两互斥,共同对立)
= sum(i in 1:n)|{1 if a(i 1) % n semi circle, (all(1:m)(ai in circle))}|(子集与其超集的并集会被吞噬为超集)
= n / 2 ^ (n - 1)(独立事件相乘和对称对立事件简化合并的乘法原理。)
真是踏破铁鞋无觅处,得来全不费功夫啊!
等价几何解法
最后给大家看一个等效的几何解法,本质其实也是一样的,只不过把从某点为起点的半圆建模成了n条直径,是一个很巧妙的对称等效的过程描述。
连续4个点的方法有2n种,点的选择每个两头有2种,于是概率即为n / 2 ^ (n - 1)。
这里的直接相加,其实是因为每个解对应的求解公式相同,即这里的方案的选择对求解过程而言是对称操作,不会产生后续不同分支,才能够这样简便地乘起来。不过,这么做有效的前提是,你的划分方案确实对称,而且一定是对原问题的拆分不重复不遗漏的解,这正是对称对立分类的简化相乘。
它之所以看起来有对又巧妙,但很难想到的原因是,这种方式的几何概型给与方式,符合原理,但并不常见。而这里的直径恰好就把前面方法拼命拎出来的代表元素给显然地呈现出来了,并且在几何上有直观呈现,不然,理论上,4根直径形成的8个点中连续的4个,一定在一段劣弧上这件事,是需要证明的。(当然,通过构造法,也并不难证。)
可以看到,上一个问题中用的三段中取一段的做法,显然符合又对称,又不重复不遗漏。但是这个问题,找到这个特定点为半圆起点的区分角度可不是一件容易的事情。而还有好几个其他解法,因为没有找到这个方案而显得十分困难。
不过,除了这个最佳的方案,就这个题目本身,还有不少其他亮眼的解法,这里一并分享给大家。
神奇的方程组解法
假设对于一个n个点的放置为事件p,另外,从中任意取出一点,假设其所有点都在以该点为起点的180度作圆弧为事件q,每个p事件对应n个q事件。而满足题意的事件总数为r,我们要求的是占比r / p。
那么,我们有r = 1 / 2 ^ ( n - 1) * q,即满足题意的事件是所有q事件中占比为 1 / 2 ^ ( n - 1)的那些,原因是有(n - 1)个点需要选择是否在给定的半圆内,全中才有机会,且任何一个不在,都会一定不成立,二者集合等价。
另外所有不满足题意的(1 - 1 / 2 ^ ( n - 1)) * q个事件,从对应生成的角度,有两个来源:
一个是原本就不满足的(p - r)个事件,它们各能构造出n个不满足的q事件来;二是原本满足条件的r个事件中,每个除了选对起点的那个以外,剩余(n - 1)个是都不满足的,因此有:
(1 - 1 / 2 ^ ( n - 1)) * q = (p - r)n r(n - 1)
可以解得r / p = n / 2 ^ (n - 1)即为所求。
这里指的借鉴的是利用集合的对应关系构造方程的做法,用到了一一对应原理和方程思想。不过式子的核心还是源于正确的方案构造,达成了对原问题解的正确划分,只不过获得结果没有用原来的互斥分类后的相乘原理直接计算罢了。
另外网络上还有不少其他大神的思路,我也基本都浏览了一二,比较有代表性和独特性的就上面这些了,。类是特例的微积分强行计算,厉害的还把它转化为三维空间的体积求解问题;另一类就是应用我们的对称思路的求解,把原问题划分为等价互斥的子问题相乘简化求解;最后就是今天也介绍的方程思想,暂时没总结出很大的通用性,但是其巧妙的思考方法也同样值得欣赏。
系列总结
最后再回顾一下对称思维的三个套路:
1. 剔除对求解无用的对称变量
2. 构造对解决问题有利的对称过程
3. 对称对立分类的简化相乘
希望你脑子里从此刻起,把对称思想深入骨髓,然后忘掉这些套路。
下个系列见!