功能

渗透模型用Monto Carlo模拟法计算出概率阈值p,并用图形化显示形象展现这一结果

方法

计算

  1. 使用加权快速联合算法(加权quick-union)快速判断两个节点是否连通

    所用的函数:

    • void init()
    • int find(int p)
    • void weighted_QU(int p, int q)
    • bool isUnion(int p, int q)
  2. 构造渗透类(Percolation,建立n*n网格

    使用并查集来维护每个格子的连通性。我们可以将每个格子看作一个节点,并将相邻的格子连接起来。如果一个格子与顶部相连,则它是满的。我们可以使用一个虚拟节点来表示顶部,将所有顶部的节点连接到这个虚拟节点上。如果虚拟节点与底部相连,则整个系统渗透。

    所用的函数:

    • void open(int row, int col)
    • bool isOpen(int row, int col)
    • bool isFull(int row, int col)
    • int numberOfOpenSites()
    • bool percolates()
  3. 开始模拟,随机打开格子,直到渗透为止,则此时打开的格子数/总格子数即为p

    所用的函数:

    • rand()

画图

  1. gridLayout里绘制n*n的label,根据该格子的状态给label绘制不同的颜色,黑色表示未连通,白色表示连通,蓝色表示full

    所用的函数:

    • void setAlignment(Qt::Alignment) //设置对齐方式
    • void setStyleSheet(const QString& styleSheet) //设置标签样式
    • inline void addWidget(QWidget *w)
    • void setLayout(QLayout *)
  2. 清除所有label以便下次模拟

效果

不勾选图形化显示时

不勾选图形化显示时


勾选图形化显示时

勾选图形化显示时