第一周作业作业要求:
写一个程序通过蒙特卡洛仿真来估计渗滤的阈值
希望通过渗滤系统得到概率值p的估计值。
- 安装algo4的java环境,然后可以访问algs4.jar中的类和教材中的所有算法。语法如下:
import edu.princeton.cs.algs4.StdRandom;
import edu.princeton.cs.algs4.StdStats;
import edu.princeton.cs.algs4.WeightedQuickUnionUF;
- 渗滤。给定一个复合系统,该系统由随机分布的绝缘和金属材料组成:哪些材料需要是金属的才能使该复合系统成为电导体?如果表面上有水(或下面的油)是多孔的景观,那么在什么条件下水能够排到底部(或油涌到表面)?科学家已经定义了称为渗流的抽象过程来对这种情况进行建模。
- The Model。 我们使用n x n站点网格对渗滤系统进行建模。 每个站点都是打开的或被阻止的。 完整站点是一个开放站点,可以通过一系列相邻的(左,右,上,下)开放站点连接到顶行中的开放站点。 我们说如果底部一行有完整的站点,系统就会渗入。 换句话说,如果我们填充了连接到第一行的所有开放站点,并且该过程填充了第二行的某个开放站点,则系统会发生渗漏。 (对于绝缘/金属材料,空位对应于金属材料,因此渗透的系统具有从顶部到底部的金属路径,且具有完整的导电位置。对于多孔物质,例如,空位对应于空白空间 水可能会通过它流动,从而使渗滤系统让水充满开放的位置,从上到下流动。)
-
The Probelm。 在一个著名的科学问题中,研究人员对以下问题感兴趣:如果将站点独立设置为以概率p开放(并因此以概率1- p封闭),那么系统渗入的概率是多少? 当p等于0时,系统不渗透; 当p等于1时,系统渗透。 下图显示了20 x 20随机网格(左)和100 x 100随机网格(右)的站点空缺概率p与渗透概率。
- 当n足够大时,存在阈值p *,使得当p <p *时,随机的n * n网格几乎不会渗滤,而当p> p *时,随机的n * n网格几乎总是渗滤。 。 尚未得出用于确定渗滤阈值p *的数学解。 您的任务是编写一个计算机程序来估计p *。
- 渗透数据类型。 要对渗滤系统建模,请使用以下API创建数据类型“渗滤”:
- Corner case。按照惯例,行和列的索引是1到n之间的整数,其中(1,1)是左上角的站点:如果open(),isOpen()或isFull()的任何参数如果越界,则抛出IllegalArgumentException规定范围。如果n≤0,则在构造函数中引发IllegalArgumentException。
- 性能要求。构造函数必须花费与n^2成正比的时间。所有实例方法都必须花费固定的时间,以及对union()和find()的恒定数量的调用。