Programming Assignment 1:Percolation

渗滤:percolation渗滤是一个由绝缘体和金属随机分布的复杂系统。那么它的金属分布在什么情况下会导致它是一个导体。科学家定义了一个抽象的被称作percolation的过程来为这些情况建模。
模型:这个模型被定义为一个n*n的方格来表示。方格site有两种状态:阻塞block和打开open。在方格中,阻塞用黑色表示,打开用白色表示。当一个方格被称为full时,表示这个方格是打开的并且通过一系列与之相邻(上下左右)的打开的方格与最上层的open的方格连接。当一个系统是percolates时,表示该系统最上层的打开的方格与最底层的打开的方格连接。也就是说存在最底层的方格为full。


image.png
image.png

图片中黑色为阻塞,白色为打开,蓝色为full。
问题:假设这些格子都是独立的,它们被打开的几率为p。那么系统为渗滤的概率是多少。显而易见,当p为0时,渗滤的概率为0;p为1时,渗滤的概率为1.下图展现了格子打开几率p在2020与100100格子下与系统为渗滤的概率的关系。

image.png
image.png

当n足够大时,存在渗滤阈值p,当p小于p时,系统几乎不渗滤;当p大于p时,系统几乎渗滤。我们的任务是估计出这个渗滤阈值p
当网格中所有方格为阻塞状态,随机打开一个方格后,判断该系统是否渗滤,如果没有,则继续打开,直到系统渗滤。那么p就为打开的方格数除以所有的方格数。进行大量多次实验就可以估计p的值。

蒙特卡洛模拟:用来估计渗滤阈值。设定网格中所有方格为阻塞状态,随机打开一个方格后,判断该系统是否渗滤,如果没有,则继续打开,直到系统渗滤。那么p就为打开的方格数除以所有的方格数。进行大量多次实验就可以估计p的值。
这一段主要是一些数值计算,包括平均值,标准差,低95%置信区间的端点,高95%置信区间的端点。可以使用课程提供的StdStats来计算。

代码
Percalation.java

import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.WeightedQuickUnionUF;

public class Percolation {
 // n*n grid
 private int n ; 
 //status of each site
 private boolean[] eachStatus ; 
 //number of open site
 private int openNum;
 //UF alg with virtual site
 private WeightedQuickUnionUF uf1;
 //UF alg with only top site due to backwash
 private WeightedQuickUnionUF uf2;

 // create n-by-n grid, with all sites blocked
 public Percolation(int n){   
  if(n<=0) throw new IllegalArgumentException("illegal value of n!");
  this.n = n;
  //plus two virtual site
  eachStatus = new boolean[(n+1)*(n+2)]; 
  
  //all sites are blocked
  for(int i=0; i< eachStatus.length;i++) eachStatus[i]=false;
  // grid with top site and bottom site
  uf1 = new WeightedQuickUnionUF((n+1)*(n+2));
  // grid with only bottom site
  uf2 = new WeightedQuickUnionUF((n+1)*(n+2));
 }

 //translate 2 dimentional coordinate to 1 dimentional pattern
 private int oneDimention(int row, int col){
  return row*(n+1)+col;
 }
 // open site (row, col) if it is not open already
 public void open(int row, int col){
  if(row<1 || row>n || col<1 || col>n) throw new IllegalArgumentException("illegal row or col!");
  if(!isOpen(row,col)) {
      eachStatus[oneDimention(row,col)]=true;
      openNum++;
      int temp1 = oneDimention(row,col);
      //if neighbor could be connected?
      if(row==1){
          uf1.union(0,temp1);
          uf2.union(0,temp1);
      }
      if(row==n) { 
          uf1.union((n+1)*(n+1),temp1);
      }
      int[] dx = {1,-1,0,0};
      int[] dy = {0,0,1,-1};
      for(int i=0; i<4;i++){
          int tempX = row+dx[i];
          int tempY = col+dy[i];
          int temp2 = oneDimention(tempX,tempY);
          if (eachStatus[temp2]){
              uf1.union(temp1,temp2);
              uf2.union(temp1,temp2);
         }
       }
    }
 }    

 //is site (row, col) open?
 public boolean isOpen(int row, int col){
   if(row<1 || row>n || col<1 || col>n) throw new IllegalArgumentException("illegal row or col!");
   return eachStatus[oneDimention(row,col)];
 }  

 //is site (row, col) full?
 public boolean isFull(int row, int col){
   if(row<1 || row>n || col<1 || col>n) throw new IllegalArgumentException("illegal row or col!");
   return uf2.connected(0,oneDimention(row,col));
 }

 // number of open sites
 public int numberOfOpenSites() {
   return openNum;
 }
 
 // does the system percolate?
 public boolean percolates() {
   return uf1.connected(0,(n+1)*(n+1));
 }

 // test client (optional)
 public static void main(String[] args) {
   Percolation p = new Percolation(3);
   p.open(1, 2);
   p.open(2, 2);
   p.open(3, 2);
   StdOut.println(p.isOpen(1,1));
   StdOut.println(p.percolates());

  }
}

PercolationStats.java

import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
import edu.princeton.cs.algs4.StdStats;

public class PercolationStats {
//trial times
private int trialNum;
//threshold P
private double[] preP;
public PercolationStats(int n,int trialNum) {
    if (n<1 || trialNum<1) throw new IllegalArgumentException("Illegal n or trialNum,please check");
    this.trialNum = trialNum;
    preP = new double[trialNum];
    for(int i=0;i<trialNum;i++) {
        Percolation p = new Percolation(n);
        while(!p.percolates()) {
            int row = StdRandom.uniform(n)+1;
            int col = StdRandom.uniform(n)+1;
            p.open(row,col);
            if (p.percolates()) break;
        }
        preP[i] = (double)p.numberOfOpenSites()/(n*n);
    }
}

// mean of p
public double mean() {
    return StdStats.mean(preP);
}

// standard deviation
public double stddev() {
    return StdStats.stddev(preP);
}

//confidence interval:low
public double confidenceLo() {
    return mean()-1.96*stddev()/Math.sqrt(trialNum);
}

//confidence interval:high
public double confidenceHi() {
    return mean()+1.96*stddev()/Math.sqrt(trialNum);
}

public static void main(String[] args) {
    int n =10,trialNum=1000;
    PercolationStats ps = new PercolationStats(n,trialNum);
    StdOut.println("grid size :" + n+"*"+n);
    StdOut.println("trial times :" + trialNum);
    StdOut.println("mean of p :"+ ps.mean());
    StdOut.println("standard deviation :"+ps.stddev());
    StdOut.println("confidence interval low :"+ps.confidenceLo());
    StdOut.println("confidence interval high :"+ps.confidenceHi());
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,292评论 0 10
  • 不断提升 ---我的青椒学习之旅 “老师,我最爱上化学的课了,挺有意思的,什么时候您还要讲课呀?”“老师,您给我们...
    陕县1319陈江花阅读 368评论 0 4
  • 认识一个女孩,爱看小说爱幻想,最喜欢霸道总裁,也希望身边能有个不离不弃的备胎男二。前段时间她突然问我,最近有个男生...
    小筱箫阅读 3,960评论 0 2
  • 旅行的意义不在于留一个回忆,而是用心感受出发前的激动、谱写路途中的故事、珍惜陪你去旅行的人。无论是国内游、还是境外...
    哆咗阅读 1,692评论 1 16
  • 文/张梓夏 我比不上一片海 它亿万年前就已存在 日后也不会轻易覆灭 吞吐着潮汐 一声一声 即使没有神教导它这样做 ...
    程乌青阅读 1,014评论 27 37