模拟沉积法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟沉积法相关的知识,希望对你有一定的参考价值。

在一次随机化算法测试中我无意发现,通过粒子的随机移动和沉积可构造类似如下图形

技术分享 技术分享 技术分享 技术分享

首先初始化一个N*N的网格,其中每个格子有几率p1被放置一个粒子,状态设为活跃,在中心放置一个非活跃粒子,

随机选择一个活跃粒子和移动方向(上下左右),若粒子的这个方向上1格没有粒子或边界则移动,若粒子接触到非活跃粒子则有p2几率变为非活跃粒子(沉积),

直到所有粒子变为非活跃状态,算法结束。

通常p1取0.05~0.2,p2取0.5~1.0,也可以对不同的粒子设置不同的p1,p2

加入重力等其它规则有时可以得到意想不到的效果

测试表明此算法在p1=0.1,p2=1时期望时间复杂度大约是O(n4),然而我没有能力证明。

以下是一个简单的实现

#include<cstdio>
#include<cstdlib>
#include<ctime>
const int N=200;
const double p1=0.1;
const double p2=1.0;
int xs[]={-1,0,1,0};
int ys[]={0,-1,0,1};
int bmp[N+2][N+2];
struct pos{
    int x,y;
    pos(){}
    pos(int a,int b):x(a),y(b){}
}ps[N*N];
int p=0;
int main(){
    srand(time(0));
    for(int i=0;i<=N+1;i++)//边界
        bmp[0][i]=bmp[N+1][i]=bmp[i][0]=bmp[i][N+1]=-1;
    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++)
            if(rand()<RAND_MAX*p1){//初始化
                bmp[i][j]=1;
                ps[p++]=pos(i,j);
            }
    bmp[N/2+1][N/2+1]=2;
    while(p){
        int w=rand()%p;
        int x=ps[w].x,y=ps[w].y;
        int f=rand()&3;
        bool d=0;
        if(bmp[x][y]==2)d=1;
        else for(int i=0;i<4;i++)
            if(bmp[x+xs[i]][y+ys[i]]==2)
                d=1;
        if(d&&rand()<p2*RAND_MAX){//沉积
            bmp[x][y]=2;
            ps[w]=ps[--p];
            continue;
        }
        if(bmp[x+xs[f]][y+ys[f]]==0){//移动
            bmp[ps[w].x=x+xs[f]][ps[w].y=y+ys[f]]=1;
            bmp[x][y]=0;
        }
    }
  //结果保存在数组bmp中
return 0; }

暂时并没有什么实用价值。。

以上是关于模拟沉积法的主要内容,如果未能解决你的问题,请参考以下文章

原子层沉积(ALD)和化学气相沉积(CVD)微电子制造铜金属化的研究进展

Atomic Layer Deposition原子层沉积技术

铜镀哪些金属可以增强铜在高温下的抗氧化性?

黄海渤海沉积地层综述

色素沉积 美白族的头号大敌

找到多个名为 [spring_web] 的片段。这对于相对排序是不合法的