我想解决Euler 213项目,但不知道从哪里开始,因为我是统计学领域的外行,请注意,需要准确的答案才能使用蒙特卡洛方法。您能推荐一些统计主题供我阅读吗?请不要在此处发布解决方案。
马戏团
一个30×30的正方形网格包含900条跳蚤,最初是每平方跳蚤。敲响钟声时,每条跳蚤会随机跳至相邻的正方形(通常有4种可能性,但网格边缘或角落处的跳蚤除外)。
铃响50次后,预计空置正方形数是多少?将答案四舍五入到小数点后六位。
我想解决Euler 213项目,但不知道从哪里开始,因为我是统计学领域的外行,请注意,需要准确的答案才能使用蒙特卡洛方法。您能推荐一些统计主题供我阅读吗?请不要在此处发布解决方案。
马戏团
一个30×30的正方形网格包含900条跳蚤,最初是每平方跳蚤。敲响钟声时,每条跳蚤会随机跳至相邻的正方形(通常有4种可能性,但网格边缘或角落处的跳蚤除外)。
铃响50次后,预计空置正方形数是多少?将答案四舍五入到小数点后六位。
Answers:
你是对的; 蒙特卡罗是行不通的。(在幼稚的模拟中,即无需任何简化即可精确地再现问题情况的模拟,每次迭代将涉及900次跳蚤运动。空单元比例的粗略估计为,这意味着Monte的方差-经过这样的迭代后,Carlo估计约为要将答案固定到小数点后六位,您需要将其估计为5.E以内-7,并且要获得95 +%的置信度(例如),您必须将该精度近似减半至2.5E-7。求解得出Ñ 1 / Ñ 1 / ë (1 - 1 / ë )= 0.2325 ... / Ñ √N>4E12,大约。那将是大约3.6E15跳蚤动作,每个跳动作占用一个CPU的几个滴答声。有了一个可用的现代CPU,您将需要进行全年(高效)的计算。而且我在某种程度上不正确且过于乐观地假设答案是按比例给出而不是计数:作为一个计数,它将需要另外三个有效数字,导致计算增加一百万倍……您可以等待很长时间吗?)
就分析解决方案而言,可以进行一些简化。(这些也可用于缩短蒙特卡洛计算。)空单元格的预期数量是所有单元格上的空概率的总和。为此,您可以计算每个单元格的占用率概率分布。这些分布是通过汇总每个跳蚤的(独立!)贡献而获得的。这可以减少您的问题,只需找到沿该网格上任何给定单元格对的一对细胞之间沿着30 x 30网格的长度为50的路径数即可(一个是跳蚤的起源,另一个是您要为其计算跳蚤的入住)。
您能否遍历每种跳蚤的细胞占领概率?也就是说,跳蚤k最初以概率1出现在像元(i(k),j(k))中。经过1次迭代,他在4个相邻像元中的每个像元中都有1/4的概率(假设他不在边上或不在一个角落)。然后,在下一次迭代中,每个季度依次被“涂抹”。经过50次迭代后,您有了跳蚤k的职业概率矩阵。重复所有900条跳蚤(如果利用对称性,这将减少近8倍)并添加概率(不需要一次存储所有跳蚤,只需存储当前跳蚤的矩阵(嗯,除非您是非常聪明,您可能需要一个额外的工作矩阵)和当前矩阵的和。在我看来,有很多方法可以在此加快速度。
这根本不涉及任何模拟。但是,它确实涉及大量的计算。算出要以较高的概率使答案略好于6 dp精度所需的仿真大小,并找出哪种方法会更快,应该不是很困难。我希望这种方法将在一定程度上击败仿真。
尽管我不反对使用whuber指出精度为小数点后6位的蒙特卡洛解决方案的实际不可能(或不切实际),但我认为可以实现精度为六位数的解决方案。
首先,跟随Glen_b,粒子可以在固定状态下进行交换,因此足以(如足够)监视不同细胞的占用,因为这也构成了马尔可夫过程。由当前时间的占用率确定的下一个时间步的占用率分布完成。编写过渡矩阵绝对是不切实际的,但是模拟过渡非常简单。吨ķ
其次,正如shabbychef所指出的,可以在450个奇数(或偶数)平方上遵循占用过程,当仅考虑偶数时间(即平方的马尔可夫矩阵)时,该过程仍保留在奇数平方上。
第三,最初的问题仅考虑了经过马尔可夫变换后的零占用率。假设起点对于马尔可夫链的平稳概率分布具有非常高的值,并且考虑到集中于所有单元格上的单个平均值,则我们可以考虑链在时间是根据平稳概率分布实现的。由于我们可以直接从此固定分布模拟,因此大大降低了计算成本50(X(吨)) p 0=1(X(吨))吨=50π
显然,平稳分布直接提供了预期的空单元数,即 等于,166.1069
pot=rep(c(rep(c(0,1),15),rep(c(1,0),15)),15)*c(2,
rep(3,28),2,rep(c(3,rep(4,28),3),28),2,rep(3,28),2)
pot=pot/sum(pot)
sum((1-pot)^450)-450
[1] 166.1069
这非常接近蒙特卡洛近似[基于10⁸模拟,在我的计算机上花费了14个小时]。但不够接近6位小数。
正如whuber所说,估算值必须乘以2才能正确回答问题,因此最终值为332.2137,
分析方法可能很乏味,我还没有考虑过复杂性,但这是您可能要考虑的一种方法。由于您对50个环后预期会空的单元格的数量感兴趣,因此需要在“单元格中的跳蚤数”上而不是跳蚤的位置上定义一个马尔可夫链(请参见Glen_b的答案,该模型模拟了跳蚤的位置)。正如安迪(Andy)在对该答案的评论中所指出的那样,这种方法可能无法获得您想要的东西。)
具体来说,让:
然后,markov链从以下状态开始:
由于跳蚤移动到四个相邻单元格之一,因此单元格的状态将根据目标单元格中有多少跳蚤,四个相邻单元格中有多少跳蚤以及它们将移动到该单元格的可能性而变化。使用此观察,您可以根据该单元的状态和相邻单元的状态来写每个单元的状态转移概率。
如果您愿意,我可以进一步扩大答案,但是这与马尔可夫链的基本介绍应该可以帮助您入门。
如果您要走数字路线,则有一个简单的观察结果:问题似乎是由红黑奇偶校验引起的(红场上的跳蚤总是移动到黑场上,反之亦然)。这可以帮助您将问题的大小减少一半(例如,一次考虑两个动作,只看红色方块上的跳蚤即可。)
我怀疑离散马尔可夫链的一些知识可能会证明是有用的。