问题描述
渗流系统
给定一个复合系统,该系统由随机分布的绝缘材料和金属材料组成:哪些材料需要是金属的才能使该复合系统成为电导体? 如果表面上有水(或下面的油)是多孔的,那么在什么条件下水能够排到底部(或油涌到表面)? 科学家已经定义了称为渗流的抽象过程来对这种情况进行建模。
模型
使用n到n的网格对渗滤系统进行建模。 每个站点都是打开的或者关闭的。 完整(full)站点是一个开放站点,可以通过一系列相邻的(左,右,上,下)开放站点连接到最上面一行中的开放站点。 我们说如果底部一行有一个完整的站点,系统就会渗入。 换句话说,如果我们填充了连接到第一行的所有开放站点,并且该过程填充了第二行的一些开放站点,则系统会发生渗漏。 (对于绝缘/金属材料,空位对应于金属材料,因此渗透的系统具有从顶部到底部的金属路径,且具有完整的位点导电。对于多孔物质,例如,空位对应于空的空间 水可能会通过它流动,从而使渗透的系统让水充满开放的位置,从上到下流动。)如下图所示:

问题
在一个著名的科学问题中,研究人员对以下问题感兴趣:如果将站点独立设置为以概率p开放(并因此以概率1- p封闭),那么系统连通的概率是多少? 当p等于0时,系统不会渗透;当p等于0时,系统不会渗透。 当p等于1时,系统渗透。 下图显示了20 x 20随机网格(左)和100 x 100随机网格(右)的站点空缺概率p与渗透概率。

以下为编程作业的链接:
Programming Assignment 1:Percolation
代码实现
API
public class Percolation {
// creates n-by-n grid, with all sites initially blocked
public Percolation(int n)
// opens the site (row, col) if it is not open already
public void open(int row, int col)
// is the site (row, col) open?
public boolean isOpen(int row, int col)
// is the site (row, col) full?
public boolean isFull(int row, int col)
// returns the number of open sites
public int numberOfOpenSites()
// does the system percolate?
public boolean percolates()
// test client (optional)
public static void main(String[] args)
}
需要注意的情况
按照惯例,行索引和列索引是1到n之间的整数,其中(1,1)是左上角的站点:如果open(),isOpen()或isFull()的任何参数不在其抛出的位置,则抛出IllegalArgumentException 规定范围。 如果n≤0,则在构造函数中引发IllegalArgumentException。
Percolation类的实现
/* *****************************************************************************
* Name: Alan Turing
* Coursera User ID: 123456
* Last modified: 1/1/2019
**************************************************************************** */
import edu.princeton.cs.algs4.WeightedQuickUnionUF;
public class Percolation {
private int[] grid;
private WeightedQuickUnionUF uf

这篇博客详细介绍了渗流系统的概念,使用n×n网格模型进行建模,并探讨了在随机分布的开放站点中,系统连通的概率问题。文章涉及的编程作业包括创建Percolation类,实现API,并通过PercolationStats进行测试,得出在不同概率p下,系统的渗透概率。结果表明,当p接近0.592时,系统最有可能发生渗透。

1010

被折叠的 条评论
为什么被折叠?



